Webview中的iOS 13 iPad用户代理问题

Posted

技术标签:

【中文标题】Webview中的iOS 13 iPad用户代理问题【英文标题】:iOS 13 iPad user agent problem in webview 【发布时间】:2019-11-18 21:38:03 【问题描述】:

我有一段代码为我的所有网络视图设置了用户代理:

   dispatch_once(&onceToken, ^
        
            __block WKWebView *webView = [[WKWebView alloc] initWithFrame:[[UIScreen mainScreen] bounds] configuration:[WKWebViewConfiguration new]];

            [webView evaluatejavascript:@"navigator.userAgent" completionHandler:^(id _Nullable result, NSError * _Nullable error) 
                if(nil != result && [result isKindOfClass:[NSString class]]) 
                    NSString *userAgent = result;
                    if( [userAgent rangeOfString:@"My Special User Agent"].length == 0 )
                    
                        userAgent = [userAgent stringByAppendingString:@" My Special User Agent"];
                        NSDictionary * dictionary = @@"UserAgent": userAgent;
                        [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
                    
                

                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.125 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
                    webView = nil;
                );
            ];
        
    );

但是,当我在 iPad Pro(12.9 英寸)- 13.2.2 上测试它时,我发现我得到的用户代理是错误的,并且在大多数情况下不包含我的特殊用户代理。有趣的是,如果我将 Web 视图设置得足够小(大约占屏幕的 20%),它确实可以工作。

我找到了一种解决方法,可以在创建 Web 视图时设置用户代理:

_webView.customUserAgent = [[NSUserDefaults standardUserDefaults] stringForKey:@"UserAgent"];

这是一个安全的解决方案(我可能会丢失用户代理中的一些重要信息)吗? 有没有更好的解决方案?

【问题讨论】:

这可能与 WKWebpagePreferences.ContentMode 有关。 @matt 不知道是否需要设置WKWebpagePreferences.ContentMode?这会有什么影响? 嗯,默认情况下,用户代理和内容模式是密切相关的,内容模式取决于大小。 【参考方案1】:

苹果默认从ios13的userAgent中移除了Ipad,因为

设置 -> Safari -> 请求桌面网站 -> 所有网站。该选项默认启用。

【讨论】:

以上是关于Webview中的iOS 13 iPad用户代理问题的主要内容,如果未能解决你的问题,请参考以下文章

如何始终使用网络的移动版本

IOS Webview 在 iPad 1 和 iPhone 3gs 上运行缓慢

WebView 在 iPad 上保持为空,但在 iOS 模拟器上保持为空

SwiftUI iOS 14中的新UIDatePicker

Firefox 中的用户代理 iOS iPhone

在 WebView 问题中查看 PDF (Xamarin.ios)