override func viewDidLoad() { NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/601.5.17 (KHTML,like Gecko) Version/9.1 Safari/601.5.17"]) super.viewDidLoad() self.webView.frame = self.view.bounds self.webView.scalesPageToFit = true // Do any additional setup after loading the view,typically from a nib. let url = NSURL(string: "https://web.whatsapp.com") let requestObj = NSMutableURLRequest(URL: url!) webView.loadRequest(requestObj) //webView.frame = CGRectMake(0,self.view.frame.size.width,self.view.frame.size.height); }
这没关系.它实际上加载了正确的webapp,而不是像服务器检测到移动设备时那样重定向到whatsapp主页.但是,它不是向我提供登录的QR码屏幕,而是向我展示:
现在,如果我在iPad上使用Safari中的WhatsApp Web(并请求桌面版),它的工作原理非常好.如您所见,我通过设置UserAgent为我的UIWebView请求桌面站点.现在,我想知道为什么它在UIWebView中不起作用,以及是否可能需要设置一些其他标题或值以说服App在我的UIWebView控件中工作?
编辑
通过将Boris Verebsky的代码从Objective-C转换为Swift,我已经改为WKWebView.然而,虽然起初我看到的屏幕与以前一样(告诉我使用另一个浏览器),在更改它并试图让它工作后,我发现自己有一个空白的白色屏幕.什么都没有出现了.
这是我目前的完整代码:
import UIKit import WebKit class ViewController: UIViewController,WKNavigationDelegate { @IBOutlet var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() self.webView = WKWebView(frame: self.view.bounds) if #available(iOS 9.0,*) { self.webView.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/601.5.17 (KHTML,like Gecko) Version/9.1 Safari/601.5.17" } else { // Fallback on earlier versions NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/601.5.17 (KHTML,like Gecko) Version/9.1 Safari/601.5.17"]) } self.view!.addSubview(self.webView) self.webView.navigationDelegate = self // Do any additional setup after loading the view,typically from a nib. let url: NSURL = NSURL(string: "http://web.whatsapp.com")! let urlRequest: NSURLRequest = NSURLRequest(URL: url) webView.loadRequest(urlRequest) } func webView(webView: WKWebView,decidePolicyForNavigationAction: WKNavigationAction,decisionHandler: WKNavigationActionPolicy -> Void) { decisionHandler(.Allow) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
可能是我从Objective-C到Swift的转换不正确.我不熟悉Objective-C,所以很有可能.
解决方法
UIWebView根本没有实现indexeddb.据我所知,没有简单的方法来自己实现indexeddb支持.
您可以通过访问UIWebView中的html5test.com轻松检查indexeddb支持.你会看到类似的东西:
但是WKWebView确实支持indexeddb:
我已经检查了带有自定义用户代理的iOS WKWebView中的web.whatsapp.com加载,使用http://whatsmyuseragent.com从我的桌面Safari中获取,它显示了您预期的QR码.此外,迁移到WKWebView将增加一些奖励,如提高性能和稳定性.
我在我的测试中使用了以下代码:
#import <WebKit/WebKit.h> @interface ViewController () <WKNavigationDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds]; self.webView.customUserAgent = @"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/601.6.17 (KHTML,like Gecko) Version/9.1.1 Safari/601.6.17"; [self.view addSubview:self.webView]; self.webView.navigationDelegate = self; NSURL *url = [NSURL URLWithString:@"http://web.whatsapp.com"]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:urlRequest]; } - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler { decisionHandler(WKNavigationActionPolicyAllow); } @end
虽然它是Objective-C,但转换成swift应该非常简单.
UPD:
使用WKWebView获取空白视图的原因是传输安全性.使用https://web.whatsapp.com作为URL(注意HTTPS而不是HTTP),或在应用程序info.plist中添加NSAllowsArbitraryLoads:YES