如何获得iOS上的用户代理?

有没有办法在iOS上获取设备的用户代理? 我不想硬编码,因为我需要所有设备的用户代理,我需要追加用户代理到一个URL。

谢谢。

在iOS中确定用户代理的一个简单方法是直接从UIWebView使用此SOpost的接受答案获取它。 引用这个答案:

解决scheme是创build一个UIWebView,然后使用JavaScript来拉出用户代理。

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

您实际上并不需要提出请求以获取用户代理。 只需从以下代理方法返回NO,并保留user-Agent头:

 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

它可能看起来像这样:

 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { userAgent = [[request valueForHTTPHeaderField:@"User-Agent"] copy]; NSLog(@"user-agent: %@", userAgent); _webView.delegate = nil; [_webView release]; return NO; } 

在iOS中确定用户代理的一个简单方法是直接从UIWebView中使用接受的答案来获取它。但是这样做有两个缺点:
1,UIWebView的第一次分配可能需要太多的时间来初始化webview上下文。
2,代码必须在主线程中执行。 这可能卡住主线程。
如果您知道如何使用私有方法的技巧,同时避免App Store Review的拒绝。
你可以尝试下面的代码:


     #define CALL_PRIVATE_INSTANCEMETHOD(x,sel,q)\
     {\
     SEL selector = NSSelectorFromString([NSString stringWithFormat:@“%@”,@#sel]);
    如果([x respondsToSelector:selector]){\
     _Pragma(“clang诊断推送”)\
     _Pragma(“clang diagnostics ignored \” -  Warc-performSelector-leaks \“”)\
     q = [x performSelector:selector]; \
     _Pragma(“clang diagnostic pop”)\
     } \
     } \

     #define CALL_PRIVATE_CLASSMETHOD_ONEPARAM(x,sel,p,q)\
     {\
     SEL selector = NSSelectorFromString([NSString stringWithFormat:@“_%@:”,@#sel]);
    如果([x respondsToSelector:selector]){\
     _Pragma(“clang诊断推送”)\
     _Pragma(“clang diagnostics ignored \” -  Warc-performSelector-leaks \“”)\
     q = [x performSelector:selector withObject:p]; \
     _Pragma(“clang diagnostic pop”)\
     } \
     } \

     +(NSString *)standardUserAgent {
         NSString * buildVersion = nil;
         CALL_PRIVATE_INSTANCEMETHOD([UIDevice currentDevice],buildVersion,buildVersion);

         class webViewCls = NSClassFromString([NSString stringWithFormat:@“%@%@”,@“Web”,@“View”]);
         NSString * standardUA = nil;
         NSString * versions = [NSString stringWithFormat:@“Mobile /%@”,buildVersion];
         CALL_PRIVATE_CLASSMETHOD_ONEPARAM(webViewCls,standardUserAgentWithApplicationName,versions,standardUA);    
        返回标准UA;
     }