2011-12-20 48 views
11

在iOS上有沒有辦法獲取設備的用戶代理?我不想硬編碼它,因爲我需要所有設備的用戶代理,我需要將用戶代理附加到URL。如何在iOS上獲取用戶代理?

謝謝。

回答

36

更簡單的方法,以確定在iOS的用戶代理是讓它直接從UIWebView使用接受的答案this SO post。引用該答案:

解決方案是創建一個UIWebView,然後使用JavaScript來拉出用戶代理。

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

沒有必要做一個網絡請求,並等待它的物質化得到HTTP標頭。對我來說,這是答案!謝謝 – 2014-02-07 03:00:11

+1

謝謝你,它的工作原理。需要注意的是,你需要在主線程中調用它。因此,在某些情況下,您可能需要在dispatch_async(dispatch_get_main_queue(),^ {...})中包裝答案的代碼; – haxpor 2015-03-02 00:40:04

4

實際上,您並不需要提出請求才能獲取用戶代理。剛剛從下面的委託方法返回NO和留住用戶代理標題:

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

更簡單的方法,以確定在iOS中,用戶代理是從一個UIWebView使用公認的答案,直接讓它this SO post。但這種方式有兩個缺點:
1,UIWebView中的第一次分配可採取初始化webview上下文太多時間了。
2,代碼必須在主線程中執行。這可能會阻塞主線程。
如果您知道如何使用私有方法的技巧,同時避免拒絕App Store Review。
你可以試試下面的代碼:

 

    #define CALL_PRIVATE_INSTANCEMETHOD(x,sel,q)\ 
    {\ 
    SEL selector = NSSelectorFromString([NSString stringWithFormat:@"%@",@#sel]);\ 
    if ([x respondsToSelector:selector]) {\ 
    _Pragma("clang diagnostic push")\ 
    _Pragma("clang diagnostic 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]);\ 
    if ([x respondsToSelector:selector]) {\ 
    _Pragma("clang diagnostic push")\ 
    _Pragma("clang diagnostic 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);  
     return standardUA; 
    }