GitHubで公開されているmarcuswestin/WebViewJavascriptBridgeで致命的な問題になっている。Xcode 9でビルドした後、WKWebViewJavascriptBridgeで初期化しようとするとクラッシュする問題は、いつになったら修正が反映されるのだろうか?
この問題は、以下のコードで発生している。以下のコードはWebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.m(コミットIDf99c987)より一部転載したものである。
//
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if (webView != _webView) { return; }
NSURL *url = navigationAction.request.URL;
__strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;
if ([_base isWebViewJavascriptBridgeURL:url]) {
if ([_base isBridgeLoadedURL:url]) {
[_base injectJavascriptFile];
} else if ([_base isQueueMessageURL:url]) {
[self WKFlushMessageQueue];
} else {
[_base logUnkownMessage:url];
}
decisionHandler(WKNavigationActionPolicyCancel);
}
if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) {
[_webViewDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler];
} else {
decisionHandler(WKNavigationActionPolicyAllow);
}
}
上記のコードでは、WebViewJavascriptBridgeのコマンドであればナビゲーション処理をキャンセルした上で、コマンドをネイティブ側に処理を渡し、そうでなければ通常のWebViewの処理を行うという処理を想定しているのだが、コマンドを受け取った時にdecisionHandler()
を2回呼び出してしまうというパターンになってしまっている。
これは、致命的な問題を抱えているのだが、Xcode 8でビルドした時までは無視されるようになっていたようで、アプリクラッシュは発生していなかった。しかしながら、Xcode 9では、これを検知した時にアプリクラッシュが発生するようになっているという状態にある。
なお、この問題への対策のプルリクエストはいくつか作成されているが、現時点ではマージされていないようである。
Xcode 9が出て、利用者も増えているものと考えられるので、そろそろ修正を反映してくれないと、弊害が大きくなりそうではあるのだが・・・。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。