ios – UIWebView桌面网站无法使用

前端之家收集整理的这篇文章主要介绍了ios – UIWebView桌面网站无法使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
部分原因是为了学习一点iOS编程,部分是因为我希望我在iPad上有一个WhatsApp客户端,我正在尝试创建一个我个人可以用作iPad的WhatsApp客户端的应用程序.它只是在UIWebView中加载web.whatsapp.com桌面站点,如下所示:
  1. override func viewDidLoad() {
  2. 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"])
  3. super.viewDidLoad()
  4.  
  5. self.webView.frame = self.view.bounds
  6. self.webView.scalesPageToFit = true
  7.  
  8. // Do any additional setup after loading the view,typically from a nib.
  9. let url = NSURL(string: "https://web.whatsapp.com")
  10. let requestObj = NSMutableURLRequest(URL: url!)
  11. webView.loadRequest(requestObj)
  12. //webView.frame = CGRectMake(0,self.view.frame.size.width,self.view.frame.size.height);
  13. }

这没关系.它实际上加载了正确的webapp,而不是像服务器检测到移动设备时那样重定向到whatsapp主页.但是,它不是向我提供登录的QR码屏幕,而是向我展示:

现在,如果我在iPad上使用Safari中的WhatsApp Web(并请求桌面版),它的工作原理非常好.如您所见,我通过设置UserAgent为我的UIWebView请求桌面站点.现在,我想知道为什么它在UIWebView中不起作用,以及是否可能需要设置一些其他标题或值以说服App在我的UIWebView控件中工作?

编辑

通过将Boris Verebsky的代码从Objective-C转换为Swift,我已经改为WKWebView.然而,虽然起初我看到的屏幕与以前一样(告诉我使用另一个浏览器),在更改它并试图让它工作后,我发现自己有一个空白的白色屏幕.什么都没有出现了.

这是我目前的完整代码

  1. import UIKit
  2. import WebKit
  3.  
  4. class ViewController: UIViewController,WKNavigationDelegate {
  5.  
  6. @IBOutlet var webView: WKWebView!
  7.  
  8. override func viewDidLoad() {
  9.  
  10. super.viewDidLoad()
  11. self.webView = WKWebView(frame: self.view.bounds)
  12.  
  13. if #available(iOS 9.0,*) {
  14. 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"
  15. } else {
  16. // Fallback on earlier versions
  17. 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"])
  18. }
  19. self.view!.addSubview(self.webView)
  20. self.webView.navigationDelegate = self
  21.  
  22. // Do any additional setup after loading the view,typically from a nib.
  23. let url: NSURL = NSURL(string: "http://web.whatsapp.com")!
  24. let urlRequest: NSURLRequest = NSURLRequest(URL: url)
  25. webView.loadRequest(urlRequest)
  26. }
  27.  
  28. func webView(webView: WKWebView,decidePolicyForNavigationAction: WKNavigationAction,decisionHandler: WKNavigationActionPolicy -> Void) {
  29. decisionHandler(.Allow)
  30. }
  31.  
  32. override func didReceiveMemoryWarning() {
  33. super.didReceiveMemoryWarning()
  34. // Dispose of any resources that can be recreated.
  35. }
  36.  
  37.  
  38. }

可能是我从Objective-C到Swift的转换不正确.我不熟悉Objective-C,所以很有可能.

解决方法

检查用户代理后,https://web.whatsapp.com检查客户端是否支持indexeddb,可能是某些JavaScript.很容易注意到 – 如果你将跟踪你的应用程序执行的所有重定向,那么你会发现重定向https://web.whatsapp.com/browsers.html?missing=indexeddb.在我的情况下,我使用简单的NSURLProtocol子类来记录所有重定向.遗憾的是,NSURLProtocol不再适用于WKWebView.

UIWebView根本没有实现indexeddb.据我所知,没有简单的方法来自己实现indexeddb支持.

您可以通过访问UIWebView中的html5test.com轻松检查indexeddb支持.你会看到类似的东西:

但是WKWebView确实支持indexeddb:

我已经检查了带有自定义用户代理的iOS WKWebView中的web.whatsapp.com加载,使用http://whatsmyuseragent.com从我的桌面Safari中获取,它显示了您预期的QR码.此外,迁移到WKWebView将增加一些奖励,如提高性能和稳定性.

我在我的测试中使用了以下代码

  1. #import <WebKit/WebKit.h>
  2.  
  3. @interface ViewController () <WKNavigationDelegate>
  4. @end
  5.  
  6. @implementation ViewController
  7.  
  8. - (void)viewDidLoad {
  9. [super viewDidLoad];
  10.  
  11. self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
  12. 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";
  13. [self.view addSubview:self.webView];
  14.  
  15. self.webView.navigationDelegate = self;
  16.  
  17. NSURL *url = [NSURL URLWithString:@"http://web.whatsapp.com"];
  18. NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
  19. [self.webView loadRequest:urlRequest];
  20. }
  21.  
  22. - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler {
  23. decisionHandler(WKNavigationActionPolicyAllow);
  24. }
  25.  
  26. @end

虽然它是Objective-C,但转换成swift应该非常简单.

UPD:

使用WKWebView获取空白视图的原因是传输安全性.使用https://web.whatsapp.com作为URL(注意HTTPS而不是HTTP),或在应用程序info.plist中添加NSAllowsArbitraryLoads:YES

猜你在找的iOS相关文章