WebViewJavascriptBridgeのあのバグはいつ修正されるんだろうか

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

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が出て、利用者も増えているものと考えられるので、そろそろ修正を反映してくれないと、弊害が大きくなりそうではあるのだが・・・。

タイトルとURLをコピーしました