11
A
回答
36
更簡單的方法,以確定在iOS的用戶代理是讓它直接從UIWebView
使用接受的答案this SO post。引用該答案:
解決方案是創建一個UIWebView,然後使用JavaScript來拉出用戶代理。
UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectZero]; NSString* secretAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
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; }
相關問題
- 1. 如何在iOS 4.x上獲取/設置用戶代理?
- 2. 獲取用戶代理在Android Wear
- 3. 如何在PHP中獲取用戶代理
- 4. 使用Android API獲取用戶代理
- 5. 如何使用Flask獲取用戶代理?
- 6. 通過代理獲取用戶IP。
- 7. SQL Server:插入獲取用戶代理
- 8. 如何在iOS平臺上獲取EGLNativeWindowType?
- 9. 如何從$ _SERVER獲取用戶代理類型php
- 10. 如何獲取NSURLConnection中的默認用戶代理字符串?
- 11. iOS:獲取用戶位置
- 12. 如何在iOS 5中使用代理
- 13. 如何在iOS中從facebook的位置處理獲取用戶簽入/發佈?
- 14. 如何使用iOS SDK在Quickblox中獲取用戶ID?
- 15. 使用GCD在iOS 5上管理代表,如何操作?
- 16. 如何獲得NodeJS代理客戶端證書,如Jetty代理
- 17. 如何更改用於iOS的Cordova(Phonegap)2.4.0上的用戶代理?
- 18. 如何在iOS和Android上獲取用戶的默認搜索引擎?
- 19. 在iphone中在uiwebview中獲取和設置用戶代理?
- 20. 如何在iOS上獲得最準確的用戶速度
- 21. Adobe AIR:在iOS上獲取用戶的視頻內容
- 22. 如何在ios上設置FBLoginview的用戶讀取權限?
- 23. 如何獲取用戶在戶外上傳的所有文檔
- 24. 爲什麼這個HTML5地理位置代碼只能在iOS上獲取用戶的位置?
- 25. iOS SocialUIService的HTTP用戶代理?
- 26. url.getContent()上的用戶代理;
- 27. 獲取SQL代理在MySQL
- 28. 如何獲取代理的SSL密鑰?
- 29. 如何從IE獲取代理設置?
- 30. iOS上的MDM代理
沒有必要做一個網絡請求,並等待它的物質化得到HTTP標頭。對我來說,這是答案!謝謝 – 2014-02-07 03:00:11
謝謝你,它的工作原理。需要注意的是,你需要在主線程中調用它。因此,在某些情況下,您可能需要在dispatch_async(dispatch_get_main_queue(),^ {...})中包裝答案的代碼; – haxpor 2015-03-02 00:40:04