Пользовательский агент UIWebView iOS5
Как я могу изменить пользовательский агент UIWebView в iOS 5?
Что я сделал до сих пор:
Используя вызов делегата, перехватите 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];
EDIT: Я использовал это с большим успехом, но хочу добавить дополнительные сведения. Чтобы получить агент пользователя, вы можете включить меню "Разработчик", установить агент пользователя и затем подключиться к этому сайту, чтобы распечатать его для вас: WhatsMyAgent. Аналогично, вы можете подключиться с помощью любого мобильного устройства и получить его так же. Кстати, это все еще отлично работает в iOS7 +
Ответ 2
В Swift используйте это, чтобы установить UserAgent,
func setUserAgent(){
var userAgent = NSDictionary(objectsAndKeys: "YourUserAgentName","UserAgent")
NSUserDefaults.standardUserDefaults().registerDefaults(userAgent as [NSObject : AnyObject])
}
Используйте это для тестирования,
println(WebView.stringByEvaluatingJavaScriptFromString("navigator.userAgent"));
Ответ 3
Когда вы отправляете сообщение [aWebView loadData:MIMEType:textEncodingName:baseURL:]
то aWebView shouldStartLoadWithRequest:
будет вызываться снова, а затем снова - вот почему вы получаете бесконечную рекурсию
Вы должны ограничить вызов своего блока dispatch_async()
, например, используя обычный URL-адрес:
- (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;
}