如何获得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; }