IOS 5でUIWebViewのユーザーエージェントを変更するにはどうすればよいですか?
これまでに行ったこと:デリゲートコールバックを使用して、NSURLRequestをインターセプトし、新しいURLリクエストを作成し、ユーザーエージェントを必要に応じて設定し、データをダウンロードして、UIWebViewを「 loadData:MIMEType:.... "。
問題:これは無限再帰を引き起こします。ここでデータをロードし、デリゲートをコールバックし、インターンがデリゲートをコールします。
デリゲートメソッドは次のとおりです。
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
dispatch_async(kBgQueue, ^{
NSURLResponse *response = nil;
NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[request URL]];
NSDictionary *headers = [NSDictionary dictionaryWithObject:
@"custom_test_agent" forKey:@"User-Agent"];
[newRequest setAllHTTPHeaderFields:headers];
[self setCurrentReqest:newRequest];
NSData *data = [NSURLConnection sendSynchronousRequest:newRequest
returningResponse:&response
error:nil];
dispatch_sync(dispatch_get_main_queue(), ^{
[webView loadData:data
MIMEType:[response MIMEType]
textEncodingName:[response textEncodingName]
baseURL:[request URL]];
});
});
return YES;
}
アプリの起動時にこのコードを1回実行して、「UserAgent」のデフォルト値を変更します。
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Your user agent", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
編集:私はこれを大成功で使用しましたが、詳細を追加したいと思います。ユーザーエージェントを取得するには、[開発者]メニューを有効にし、ユーザーエージェントを設定してから、このサイトに接続して印刷してください: WhatsMyAgent 。同様に、あらゆる種類のモバイルデバイスを使用して接続し、その方法でも取得できます。ところで、これはまだiOS7 +でうまく動作しています
Swiftでは、これを使用してserAgentを設定します。
func setUserAgent(){
var userAgent = NSDictionary(objectsAndKeys: "YourUserAgentName","UserAgent")
NSUserDefaults.standardUserDefaults().registerDefaults(userAgent as [NSObject : AnyObject])
}
これを使用してテストし、
println(WebView.stringByEvaluatingJavaScriptFromString("navigator.userAgent"));
メッセージ_[aWebView loadData:MIMEType:textEncodingName:baseURL:]
_を送信するとき
その後、_aWebView shouldStartLoadWithRequest:
_が再度呼び出され、再び呼び出されます-これが無限再帰を取得する理由です
たとえば、従来のURLを使用して、dispatch_async()
ブロックの呼び出しを制限する必要があります。
_- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
if ([[[request URL] absoluteString] isEqualToString:@"http://yourdomain.com/?local=true"]) {
return YES;
}
...
dispatch_async(...
[aWebView loadData:data
MIMEType:[response MIMEType]
textEncodingName:[response textEncodingName]
baseURL:[NSURL URLWithString:@"http://yourdomain.com/?local=true"]];
);
return NO;
}
_