Как получить агент пользователя в iOS?

Есть ли способ в iOS получить пользовательский агент устройства? Я не хочу жестко кодировать его, так как мне нужен агент пользователя для всех устройств, и мне нужно добавить агент пользователя к URL-адресу.

Спасибо.

Ответ 1

Более простой способ установить пользовательский агент в iOS - это получить его непосредственно из UIWebView с помощью принятого ответа на этот пост SO.. Чтобы процитировать этот ответ:

Решением было создание UIWebView, а затем просто использовать javascript для вытаскивания пользовательского агента.

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

Ответ 2

Вам действительно не нужно делать запрос, чтобы получить пользовательский агент. Просто верните NO из следующего метода делегата и сохраните заголовок User-Agent:

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

Ответ 3

UIWebView устарела. В приложениях, работающих в iOS 8 и более поздних версиях, используйте класс WKWebView вместо использования UIWebView.

// WKWebView
{
    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
    [webView loadHTMLString:@"<html></html>" baseURL:nil];

    [webView evaluateJavaScript:@"navigator.appName" completionHandler:^(id __nullable appName, NSError * __nullable error) {
        NSLog(@"%@", appName);
        // Netscape
    }];

    [webView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id __nullable userAgent, NSError * __nullable error) {
        NSLog(@"%@", userAgent);
        // iOS 8.3
        // Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12F70
        // iOS 9.0
        // Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.32 (KHTML, like Gecko) Mobile/13A4254v
    }];

    // needs retain because 'evaluateJavaScript:' is asynchronous
    self.webView = webView;
}

Подробнее здесь - https://gist.github.com/Koze/cfda5d2af12f6215424e

Ответ 4

Swift 3.x, 4.x, 5.x, & выше

Когда-то традиционные UIWebView теряют память, поэтому вместо этого всегда используйте WKWebView (намного лучше, чем UIWebView)

import WebKit

var webViewForUserAgent: WKWebView?

и получите userAgent, вызвав ниже функцию & Вы также можете установить его в другую переменную

func getUserAgent() {

    webViewForUserAgent = WKWebView() // must initialize

    webViewForUserAgent?.evaluateJavaScript("navigator.userAgent") { (result, error) in

        //
        if error != nil {
            print("Error occured to get userAgent")
            return
        }

        //
        if let unwrappedUserAgent = result as? String {
            print("userAgent: \(unwrappedUserAgent)")
        } else {
            print("Failed to get userAgent")
        }
    }
}

enter image description here

Ответ 5

Простейший способ установить пользовательский агент в iOS - это получить его непосредственно из UIWebView с использованием принятого ответа на этот SO-сообщение. Но у этого есть два недостатка:
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;
    }