1. ホーム
  2. javascript

iOS WKWebViewでjavascriptのalert()ダイアログが表示されない

2023-09-05 19:02:51

質問

iOS 8のWKWebViewが、Javascriptから呼び出されるアラートダイアログを表示するのに苦労しています。標準的な WKWebView を作成し、HTML ファイルをロードした後、いくつかのテキストで単純なアラートを作成するページ上のボタンがあります。これは、UIWebViewとGoogle Chrome/Safariで動作しますが、WKWebViewでは動作しないようです。どんな助けでも感謝します。

私の設定は次のとおりです。

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.allowsInlineMediaPlayback = YES;
config.mediaPlaybackRequiresUserAction = false;
_wkViewWeb = [[WKWebView alloc] initWithFrame:_viewWeb.frame config];
_wkViewWeb.scrollView.scrollEnabled = NO;
NSString *fullURL = @"file://.../TestSlide.html";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];

[_wkViewWeb loadRequest:request];

htmlは以下のような機能を持っています。

<SCRIPT Language="JavaScript">
function alertTest() {
    alert("Testing Alerts");
}
</SCRIPT>

ボタンも

<b>Test Alerts: <input type="button" value="Alert Popup" onclick="alertTest()"><br></b> <br>

この設定は、UIWebViewと通常のブラウザでは動作しますが、WKWebViewでは動作しません。私は、設定において何かを見逃しているのでしょうか?警告/確認ダイアログの動作を制御するために、WKデリゲートのいずれかを使用する必要がありますか?ありがとうございます。

どのように解決するのですか?

これを解決するには、ウェブビューにWKUIDelegateが必要です。アラートが表示されるべきかどうか、そしてどのような方法で表示されるかを決定するのは、デリゲートの義務です。あなたは、アラート、確認、テキスト入力(プロンプト)のためにこれを実装する必要があります。

ページのURLやセキュリティ機能の検証を行わないサンプルコードです。

- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message
                                                                             message:nil
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:[UIAlertAction actionWithTitle:@"OK"
                                                        style:UIAlertActionStyleCancel
                                                      handler:^(UIAlertAction *action) {
                                                          completionHandler();
                                                      }]];
    [self presentViewController:alertController animated:YES completion:^{}];
}

の中でさらに 公式ドキュメンテーション