iOS9までは、ほぼ絶対に実在しないドメイン(JSBridge://ActionId/
等)をiframe
のsrcに追加して、ネイティブ側でそのコールをフックして処理をすることができた。
しかし、iOS10
からは実在しないドメインを使用している場合は出来なくなった。
対策
これが分かりやすかった: iFrame、JSBridge 升级Xcode8和iOS 10之后的解决方案
抜粋:
3.一直使用的JSBridge不能用了
开发Hybrid App的同学应该都知道,其实js和native通信关键的就是var iFrame = document.createElement("IFRAME");
iFrame.setAttribute("src","JSBridge://ActionId=" + id);
document.documentElement.appendChild(iFrame);
iFrame.parentNode.removeChild(iFrame);
然后会在UIWebView的回调方法-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;中去解析截获的src属性中的ActionId值,但是很不幸在Xcode8打包到iOS 10的设备中,在UIWebView的回调方法中request参数中的URL是空的,什么也没有。这个问题的根本原因是上面动态添加的iFrame.setAttribute("src","JSBridge://customeHost?ActionId=" + id);
文/马修王(简书作者)
原文链接:http://www.jianshu.com/p/c69d5112b3ae
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
つまり
iframeのsrcに使用しているURLを実在しそうなホストにすればいい。(OLDをNEWにすればいい)
大文字ABCDEFGから小文字のabcdefgにしたのはうまくうごかなかったから。
- OLD:
ABCDEFG://call/id=1
- NEW:
abcdefg://project_name.com/call/id=1
MEMO
- これに起因する問題は大きく分けて2つおこった
-
LINE@のページを表示させているとき、
line://foo/bar
で、LINEアプリのLINE@を開けなくなった。- 対策:
LINE@
内のdata-href
を書き換えるJSをロード完了時に流し込む形で対応した。
- 対策:
-
自社サービスのWEBページ内からデータ(イベント/呼び出し)を受け取れなくなった
- 対策:AndroidとiOS側で呼び出しコールを変えるのは大変だっため、iOS側のネイティブコードで呼び出し方法を変えた。
- 以下にOLDからNEWに変えるJSを流し込む形で対応した
- OLD:
ABCDEFG://call/id=1
- NEW:
abcdefg://project_name.com/call/id=1
- OLD:
-
参考
最後に
書き換えしたいφ('ᴗ'」)