【问题标题】:How to get UIWebView User-Agent如何获取 UIWebView 用户代理
【发布时间】:2011-03-18 21:14:06
【问题描述】:

我在使用一台远程服务器时遇到了问题。我的应用程序使用[NSData initWithContentsOfURL:] 方法向服务器发出请求,作为响应,我得到了在UIWebView 中打开的网站网址。

问题在于这些请求具有不同的用户代理,服务器无法正确地为我服务,因为它希望我使用相同的用户代理发送所有请求。我知道如何更改用户代理(例如Change User Agent in UIWebView (iPhone SDK)),但我真正想要的是以某种方式获取UIWebView 的用户代理并将其设置为 [NSData initWithContentsOfURL:] 以避免服务器端出现问题

【问题讨论】:

    标签: iphone ios4 uiwebview user-agent


    【解决方案1】:

    正如@nate 提到的above,您可以在 web 视图中调用 Javascript:

    UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectZero];
    NSString* secretAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
    

    但是调用新的 Javascript 有点麻烦,而且创建一个大小为零的 webView 是无偿的,因为您已经有了一个正在处理的 webView。

    或者,您可以在给定的webView 上简单地使用本机方法:

    NSString* ua = [webView.request valueForHTTPHeaderField:@"User-Agent"];
    NSLog(@"User-Agent = %@", ua);
    

    【讨论】:

    • 我会支持@JohnK 的替代方法,使用本机 API 而不是注入 js 以获得更好的可读性/语义。
    • 不幸的是,这两种方法都要求请求/响应已经被处理,因此程序员在异步读取值时需要考虑这一点。
    【解决方案2】:

    我刚刚遇到了类似的问题,需要使 NSURLConnection 发送的用户代理与 UIWebView 发送的用户代理匹配。我的解决方案是创建一个 UIWebView,然后使用 javascript 拉出用户代理。

    UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectZero];
    NSString* secretAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];

    【讨论】:

    • 请注意,您必须在主线程上使用此代码 - 这是有道理的,因为它使用了 UIKit,但非常不方便。
    • 当我在设备上运行时,这似乎不起作用。它在模拟器中运行良好
    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 2012-04-10
    • 2012-01-24
    • 2012-05-01
    • 1970-01-01
    • 2010-10-03
    • 2013-10-21
    相关资源
    最近更新 更多