2011-12-20 15 views
11

Aygıtın kullanıcı aracısını almak için iOS'ta bir yol var mı? Tüm cihazlar için kullanıcı aracısına ihtiyaç duyduğumdan sabit kod yapmak istemiyorum ve kullanıcı aracısını bir URL'ye eklemem gerekiyor.Kullanıcı aracısı iOS'ta nasıl edinilir?

Teşekkürler.

cevap

36

iOS kullanıcı ajanı tespit etmek için basit bir yolu elde etmektir this SO post kabul edilen cevabı kullanarak bir UIWebView doğrudan. Bu cevabı alıntı:

çözüm UIWebView yaratmaktı ve sonra sadece kullanıcı aracısı dışarı çekmek için javascript kullanın. bu şekilde iki dezavantajı vardır .Ama

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

bir web istekte bulunur ve http başlığını almak için bu kadar materialisation beklemek gerek yok. Benim için bu cevap! Teşekkürler –

+1

Bunun için teşekkürler. Önemli bir not, bunu ana iş parçasında çağırmanız gerektiğidir. Bu nedenle, bazı durumlarda, cevap kodunuzu dispatch_async (dispatch_get_main_queue(),^{...}) içine sarmanız gerekebilir; – haxpor

4

Kullanıcı aracısını almak için isteği gerçekten yapmanız gerekmez. Sadece şu temsilci yönteminden HAYIR dönmek ve kullanıcı-Agent korumak:

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

Böyle görünebilir:

-(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 kullanıcı ajanı tespit etmek için basit bir yolu this SO post kabul cevabı kullanarak bir UIWebView bunu doğrudan elde etmektir:
1, UIWebView ilk tahsisi sürebilir webview içeriğinin başlatılmasında çok fazla zaman.
2 code kod ana iş parçacığı içinde yürütülmelidir. Bu ana iş parçacığı sıkışmış olabilir.
App Store İncelemesinin reddedilmesinden kaçınarak özel yöntemlerin nasıl kullanılacağına dair ipuçlarını biliyorsanız.
Aşağıdaki kodu deneyebilirsiniz:

 

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

İlgili konular