Есть ли способ в iOS получить пользовательский агент устройства? Я не хочу жестко кодировать его, так как мне нужен агент пользователя для всех устройств, и мне нужно добавить агент пользователя к URL-адресу.
Спасибо.
Есть ли способ в iOS получить пользовательский агент устройства? Я не хочу жестко кодировать его, так как мне нужен агент пользователя для всех устройств, и мне нужно добавить агент пользователя к URL-адресу.
Спасибо.
Более простой способ установить пользовательский агент в iOS - это получить его непосредственно из UIWebView
с помощью принятого ответа на этот пост SO.. Чтобы процитировать этот ответ:
Решением было создание UIWebView, а затем просто использовать javascript для вытаскивания пользовательского агента.
UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectZero]; NSString* secretAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
Вам действительно не нужно делать запрос, чтобы получить пользовательский агент. Просто верните 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;
}
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
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")
}
}
}
Простейший способ установить пользовательский агент в 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; }