2016-05-17 14 views
8

少しiOSプログラミングを学習する練習の一部として、そして私がiPad上にWhatsAppクライアントを持っていたら、私は個人的にWhatsAppクライアントとして使用できるアプリケーションを作成しようとしています私のiPadのために。 UIWebViewのweb.whatsapp.comデスクトップサイトは次のようにロードされます。UIWebViewデスクトップWebサイトが動作しない

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, 0, self.view.frame.size.width, self.view.frame.size.height); 
} 

これは問題なく動作します。サーバーがモバイルデバイスを検出したときに通常発生するように、whatsappホームページにリダイレクトするのではなく、実際には正しいwebappをロードします。しかし、むしろにおけるログのQRコード画面を私に提示するよりも、それがこれで私を提示:

enter image description here

、私は私のiPad上のSafariからのWhatsApp Webを使用(とデスクトップバージョンを要求する)場合には、それ完全にうまく動作します。ご覧のとおり、UserAgentを設定して、私のUIWebViewのデスクトップサイトをリクエストしています。今、私はUIWebViewでうまくいかない理由と、UIWebViewコントロール内でアプリケーションを動作させるために設定する必要がある別のヘッダーや値があるのか​​どうか疑問に思っています。

EDIT

IはスイフトへのObjective-CからボリスVerebskyのコードを変換することによってWKWebViewに変更されています。しかし、最初は同じ画面が表示されていましたが(別のブラウザを使用するように指示しています)、変更して機能させようとすると、空白の画面が表示されます。もう何も表示されません。

Blank screen

それが現在立っているように、これは私の完全なコードです:

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からの私の変換が間違っている可能性があります。私はObjective-Cによく慣れていないので、かなり可能性があります。

+0

コードは正しいです。あなたが空白のビューを持っている理由は、トランスポートのセキュリティです。 (https:// web.whatsapp.comをURLの代わりに使用するか(HTTPではなくHTTPSに注意)、アプリケーションのinfo.plistに 'NSAllowsArbitraryLoads:YES'を追加してください。 –

+0

@BorisVerebskyありがとうございます、それは現在動作します。私がそれを終了と呼ぶ前に克服すべき他のいくつかの問題だけ! – Luke

答えて

8

ユーザエージェントをチェックした後、https://web.whatsapp.comは、おそらく何らかのJavaScriptによってクライアントがindexeddbをサポートしているかどうかをチェックします。これは気付きやすいです。アプリが実行したすべてのリダイレクトを追跡すると、https://web.whatsapp.com/browsers.html?missing=indexeddbにリダイレクトされます。私の場合は、単純なNSURLProtocolサブクラスを使用してすべてのリダイレクトを記録しています。悲しいことにNSURLProtocolWKWebViewで動作しなくなりました。

UIWebViewは、indexeddbをまったく実装していません。私が知る限り、indexeddbサポートを自分で実装する簡単な方法はありません。

UIWebViewのhtml5test.comにアクセスすると、indexeddbサポートを簡単に確認できます。あなたのようなものが表示されます。

html5test.com result for UIWebView

をしかし、支援のIndexedDBはWKWebView行います

html5test.com result for WKWebView

私がチェックしたweb.whatsappを。私のデスクトップSafariからhttp://whatsmyuseragent.comを使用してカスタムユーザーエージェントを使ってiOS WKWebViewにロードし、期待どおりの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のですが、迅速に変換することが非常に簡単でなければなりません。

UPD:あなたはWKWebViewで空白のビューを持っている理由

理由は、トランスポート・セキュリティです。 https://web.whatsapp.comをURL(HTTPではなくHTTPSに注意)として使用するか、アプリケーションinfo.plistにNSAllowsArbitraryLoads: YESを追加してください。

+0

私は私の質問を編集しました。迅速な対応が正しいとは思えません。私は目的Cに精通していません。どうぞご覧ください。私は今空白の白い画面が表示されています。 – Luke

+0

@Borisそれは素晴らしい説明です。アンドロイドで同じことをしています、あなたはこれについて何か考えています – ASV

+0

アンドロイドでカスタムユーザーエージェントを試しました。初めてWebViewがQRコードページを2回目に読み込んで、WhatsAppを読み込みます。 comのページ – ASV

4

WKWebViewを使用するように切り替えてから、customUserAgentを使用するだけで、Webビューで目的のエージェント文字列を直接設定することができます。

+0

ありがとう、私はそのショットを与えるよ! – Luke

+0

試みましたが、動作していません。あなたは私に例を挙げることができますか? –

+0

あなたはエージェントが設定されていない(チャールズプロキシのようなツールで検証されています)、あるいはウェブサイトがまだあなたが望んでいないことを意味しますか? – Wain