UIWebView iOS5更改用户代理

时间:2011-12-13 10:26:23

标签: objective-c ios cocoa-touch uiwebview

如何在iOS 5中更改UIWebView的用户代理?

到目前为止我做了什么: 使用委托回调,拦截NSURLRequest,创建新的url请求并将其用户代理设置为我想要的任何内容,然后下载数据并使用“loadData:MIMEType:....”重新加载UIWebView。

问题: 这会导致无限递归,我加载数据,然后调用委托,实习生调用委托....

这是委托方法:

- (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;
}

3 个答案:

答案 0 :(得分:89)

在应用启动时运行此代码一次,更改“UserAgent”默认值:

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Your user agent", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];  
编辑:我已经非常成功地使用了它,但是想要添加更多细节。要获取用户代理,您可以启用“开发人员”菜单,设置用户代理,然后连接到此站点以便为您打印出来:WhatsMyAgent。同样,您可以使用任何类型的移动设备进行连接,也可以通过这种方式进行连接。顺便说一句,这在iOS7 +中仍然可以正常工作

答案 1 :(得分:1)

Swift 中使用此功能设置 UserAgent

func setUserAgent(){

    var userAgent = NSDictionary(objectsAndKeys:  "YourUserAgentName","UserAgent")

    NSUserDefaults.standardUserDefaults().registerDefaults(userAgent as [NSObject : AnyObject])

}

用它来测试,

println(WebView.stringByEvaluatingJavaScriptFromString("navigator.userAgent"));

答案 2 :(得分:0)

发送消息[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;
}