2016-10-27 4 views
3

iOSバージョン10以前では、UIWebViewにロードされたJavaScript/HTMLからの情報を私に送り返すことができました文書上のiFrameを作成するか、Web表示が負荷にしようとしたでしょうカスタムURLにdocument.location.hrefを設定することにより、アプリケーション:UIWebViewからカスタムURLスキームを使用したiOSアプリケーションにデータを送信するXcode 8/iOS 10で壊れます

<html> 
<body><input id="clickMe" type="button" value="clickme" onclick="changeWindow();" /></body> 
<script type="text/javascript"> 
    function changeWindow() { 
     //create temp frame 
     iFrame = this.createIFrame('onStatusChange://eyJ1c2VyTmFtZSI6IkpBTCIsLCJwcm92aWRlciI6IkVtYWlsIn0='); 
     //remove the frame now 
     iFrame.parentNode.removeChild(iFrame); 
    } 

    function createIFrame(src) { 
     var rootElm = document.documentElement; 
     var newFrameElm = document.createElement('IFRAME'); 
     newFrameElm.setAttribute('src', src); 
     rootElm.appendChild(newFrameElm); 
     return newFrameElm; 
    } 
</script> 
</html> 

次に、クライアント上で、私はちょうどUIWebViewDelegateコールバックwebView:shouldStartLoadWithRequest:navigationType:をリッスンし、かを確認しますrequest.URL.schemeが自分のカスタムスキーム(この場合はonStatusChange)と等しい場合。

これは、普及している質問(How to invoke Objective C method from Javascript and send back data to Javascript in iOS?など)のように、JavaScriptとiOSアプリの間で通信する一般的な方法です。

これは、iOS 9および10デバイスでXcode 7(Objective-CまたはSwift)で構築されたすべてのアプリで使用できます。私は、Xcode 8で構築されたアプリケーションでデリゲートメソッドが呼び出されない問題に取り掛かりました。それは、WebビューがURLをロードしようとしていなくてもデリゲートコールバックをトリガーしていないかのようです。

UIWebViewまたはWebKitがXcode 7から8またはiOS 9から10に変更されましたが、これは動作しませんでしたか?本当に困惑しているのは、iOS 8をターゲットにしたXcode 7のObjective-Cで制作した制作アプリは、iOS 10デバイスで動作しますが、まったく同じコードベースのXcode 8で構築されたデバッグビルドは動作しません。

答えて

2

我々は戻って私たちのiOSアプリケーションへのWebビューからBase64でエンコードされたデータを送信するために、特殊なURLスキームonStatusChange://を使用し[OK]を、長い話短いです。 1つ以上の等号文字で終わるURLを読み込もうとしたときにiOS 10のチョークでUIWebViewが信じられ、実際のURLではなくabout:blankが読み込まれます。

これはiOS 9で完全に機能するため、これはiOS 10の不具合であると考えており、rdar://29035522を開いています。問題の完全な再現可能な例は、そのレーダーの本体で利用可能です。

私は私のデータ列の末尾にパディングに=文字を削除するために許容可能であるかどうかを判断するためにBase-N encoding RFCて読んでいます、または彼らがウェブから取り出して、データを復号する前に、クライアントに追加する必要があります。

私が実装したソリューションは、Base64でエンコードされたデータをエスケープし、クライアントでエスケープしていました。最も洗練されたソリューションではありませんが、おそらく安全のために最適です。

+0

rdarの更新はありますか?私はiOS 10.2.1でもそれが起こっているのを見ています。また、特別なチャーもなくても私たちに起こります。 – Aviel

+0

@Aviel悲しいことに、私のレーダーはまだ更新されておらず、ランクがない "オープン"とマークされています。あなたはバグレポートを複製し、複数の人にこの問題があることをAppleに示すために新しいレーダーを提出することを検討することができます。 – JAL

+0

@Avielバグレポートを複製してOpenRadarに投稿しましたので、他の開発者がレポートを見ることができますか? – JAL

0

これは、iOSがデフォルトでhttp要求をブロックするようになったためです。 info.plistで再度有効にする必要があります。

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

+0

これはHTTPリクエストではありません(このテストファイルはローカルで実行されます)。また、ホワイトリストに登録されたドメインからの読み込みを許可するようにATSを設定済みです。 – JAL

関連する問題