2011-12-20 11 views
11

Czy istnieje sposób na iOS, aby uzyskać klienta użytkownika urządzenia? Nie chcę tego zakodować, ponieważ potrzebuję agenta użytkownika dla wszystkich urządzeń i muszę dołączyć klienta użytkownika do adresu URL.Jak uzyskać klienta użytkownika na iOS?

Dzięki.

Odpowiedz

36

Prostszym sposobem, aby ustalić, agent użytkownika w systemie iOS jest uzyskanie to bezpośrednio z UIWebView przy użyciu zaakceptowanej odpowiedzi na this SO post. Aby zacytować tę odpowiedź:

Rozwiązaniem było utworzenie interfejsu użytkownika UIWebView, a następnie użycie javascript do usunięcia agenta użytkownika.

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

Nie ma potrzeby, aby złożyć zamówienie internetowej i czekać na to jest materializacji dostać nagłówek HTTP. Dla mnie to jest odpowiedź! Dzięki –

+1

Dziękuję za to, to działa. Ważną informacją jest to, że musisz wywołać to w głównym wątku. Zatem w niektórych okolicznościach może być konieczne zawinięcie kodu odpowiedzi wewnątrz dispatch_async (dispatch_get_main_queue(),^{...}); – haxpor

4

Nie musisz wysyłać żądania, aby uzyskać klienta użytkownika. Wystarczy wrócić NO z następującej metody delegata i zachować nagłówek User-agent:

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

To może wyglądać tak:

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

Prostszym sposobem, aby ustalić, agent użytkownika w systemie iOS jest dostać go bezpośrednio z UIWebView zastosowaniem przyjętej odpowiedź this SO post .Ale ten sposób ma dwie wady:
1, pierwszy przydział UIWebView może podjąć zbyt wiele czasu podczas inicjowania kontekstu przeglądania sieci.
2, kod musi być wykonany w głównym wątku. To może utknąć w głównym wątku.
Jeśli znasz sztuczki, jak korzystać z prywatnych metod, unikając odmowy App Store Review.
Można spróbować następujący kod:

 

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

Powiązane problemy