2011-12-20 9 views
11

¿Hay alguna manera en iOS para obtener el agente de usuario del dispositivo? No quiero codificarlo porque necesito el agente de usuario para todos los dispositivos y necesito agregar el agente de usuario a una URL.¿Cómo obtener el agente de usuario en iOS?

Gracias.

Respuesta

36

Una forma más sencilla de determinar el agente de usuario en IOS es conseguir directamente desde UIWebView usando la respuesta aceptada al this SO post. Para citar esa respuesta:

La solución fue crear un UIWebView y luego simplemente usar javascript para extraer el agente de usuario.

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

No hay necesidad de hacer una solicitud web y esperar a que la materialización de conseguir encabezado HTTP. Para mí esta es la respuesta! Gracias –

+1

Gracias por esto, funciona. Una nota importante es que debes llamar esto en el hilo principal. Por lo tanto, en algunas circunstancias, es posible que deba ajustar el código de su respuesta dentro de dispatch_async (dispatch_get_main_queue(),^{...}); – haxpor

4

No necesita realizar la solicitud para obtener el agente de usuario. Simplemente devuelva NO a partir de la siguiente método delegado y retener la cabecera User-Agent:

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

al principio puede parecer algo como esto:

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

Una forma más sencilla de determinar el agente de usuario en IOS es obtener directamente de un UIWebView usando la respuesta aceptada a this SO post .Pero esta manera tiene dos desventajas:
1, primera asignación de UIWebView puede tomar demasiado tiempo para inicializar el contexto de la vista web.
2, el código debe ejecutarse en el hilo principal. Esto puede estancarse en el hilo principal.
Si conoce los trucos de cómo usar métodos privados mientras evita la negativa de App Store Review.
puedes probar el siguiente código:

 

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

Cuestiones relacionadas