2011-12-20 18 views
11

Có cách nào trên iOS để lấy tác nhân người dùng của thiết bị không? Tôi không muốn mã hóa nó vì tôi cần tác nhân người dùng cho tất cả các thiết bị và tôi cần phải nối thêm tác nhân người dùng vào một URL.Cách tải đại lý người dùng trên iOS?

Cảm ơn.

Trả lời

36

Một cách đơn giản để xác định tác nhân người dùng trong iOS là để có được nó trực tiếp từ một số UIWebView sử dụng câu trả lời được chấp nhận cho this SO post. Để báo câu trả lời đó:

Giải pháp là tạo UIWebView và sau đó chỉ cần sử dụng javascript để rút tác nhân người dùng.

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

Không cần phải thực hiện một yêu cầu web và chờ cho materialisation nó để có được tiêu đề http. Đối với tôi đây là câu trả lời! Thanks –

+1

Cảm ơn vì điều này, nó hoạt động. Một lưu ý quan trọng là, bạn cần phải gọi điều này trong chủ đề chính. Vì vậy, trong một số trường hợp, bạn có thể cần phải quấn mã của câu trả lời của bạn bên trong dispatch_async (dispatch_get_main_queue(),^{...}); – haxpor

4

Bạn thực sự không cần thực hiện yêu cầu để lấy tác nhân người dùng. Chỉ cần trở NO từ phương pháp đại biểu sau đây và giữ lại tiêu đề User-agent:

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

Nó có thể giống như thế này:

-(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

Một cách đơn giản để xác định tác nhân người dùng trong iOS là để có được nó trực tiếp từ một UIWebView sử dụng câu trả lời chấp nhận this SO post .Nhưng cách này có hai nhược điểm:
1, phân bổ đầu tiên UIWebView của thể mất quá nhiều thời gian trong việc khởi tạo ngữ cảnh webview.
2 、 mã phải được thực thi trong chuỗi chính. Điều này có thể mắc kẹt chủ đề chính.
Nếu bạn biết các thủ thuật về cách sử dụng các phương pháp riêng tư trong khi tránh từ chối Đánh giá trên App Store.
Bạn có thể thử đoạn mã sau:

 

    #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; 
    } 

Các vấn đề liên quan