专栏首页iOS开发随笔WKWebView不显示JS的Alert,Confirm,TextInput弹框解决方法

WKWebView不显示JS的Alert,Confirm,TextInput弹框解决方法

最新项目使用网页加载页面的基本上都由UIWebView转到WKWebView了,然后刚刚才发现用了WKWebView之后不会弹窗提示了,查了一下知道原来WKWebView默认禁止了下面的跳转:

  • 打开itunes.apple.com跳转到App Store, 拨打电话, 唤起邮箱等一系列操作
  • JSAlert,Confirm,TextInput弹框

解决方法: 首先实现WKUIDelegate代理方法

解决唤不起打电话和跳转系统应用的方法

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

    NSURL *URL = navigationAction.request.URL;
    NSString *scheme = [URL scheme];
    UIApplication *app = [UIApplication sharedApplication];
    // 打电话
    if ([scheme isEqualToString:@"tel"]) {
        if ([app canOpenURL:URL]) {
            [app openURL:URL];
            // 一定要加上这句,否则会打开新的页面
            decisionHandler(WKNavigationActionPolicyCancel);
            return;
        }
    }
    // 打开App Store
    if ([url.absoluteString containsString:@"ituns.apple.com"]) {
        if ([app canOpenURL:url]) {
            [app openURL:url];
            decisionHandler(WKNavigationActionPolicyCancel);
            return;
        }
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}

解决JSAlert,Confirm,TextInput不弹框的方法

#pragma mark -  Alert弹窗
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
    UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"提示" message:message ? : @"" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction * action = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler();
    }];
    [alertController addAction:action];
    [self presentViewController:alertController animated:YES completion:nil];
}

#pragma mark -  Confirm弹框
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:message ? : @"" preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(NO);
    }];
    
    UIAlertAction * confirmAction = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(YES);
    }];
    
    [alertController addAction:cancelAction];
    [alertController addAction:confirmAction];
    
    [self presentViewController:alertController animated:YES completion:nil];
}

#pragma mark -  TextInput弹框
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler {
    
    UIAlertController * alertController = [UIAlertController alertControllerWithTitle:prompt message:@"" preferredStyle:UIAlertControllerStyleAlert];
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.text = defaultText;
    }];
    UIAlertAction * action = [UIAlertAction actionWithTitle:@"完成" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(alertController.textFields[0].text ? : @"");
    }];
    [alertController addAction:action];
    
    [self presentViewController:alertController animated:YES completion:nil];
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS常用的正则表达式(持续更新)

    傅_hc
  • Reveal的使用方法

    傅_hc
  • Mac 下安装Python3.5出现“python3-3.5.0 already installed, it's just not linked”错误

    傅_hc
  • try.mlsql.tech 上线,快来体验

    好友借了一台服务器给我用,2核4G, 虽然配置有点低,但是已经超开心了,一直希望能搭建一个能运行一些简单脚本的服务,这样用户就不需要自己搭建了,但一直碍于现在服...

    用户2936994
  • 长尾分布,重尾分布(Heavy-tailed Distribution)

    就是指尾巴很长的分布。那么尾巴很长很厚的分布有什么特殊的呢?有两方面:一方面,这种分布会使得你的采样不准,估值不准,因为尾部占了很大部分。另一方面,尾部的数据少...

    于小勇
  • 算法提高 矩阵相乘

    问题描述   小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容。   当然,小明上课打瞌睡也没问题,但...

    AI那点小事
  • LeetCode Weekly Contest 46解题思路

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • 机器学习 | 深入SVM原理及模型推导(一)

    SVM模型大家可能非常熟悉,可能都知道它是面试的常客,经常被问到。它最早诞生于上世纪六十年代。那时候虽然没有机器学习的概念,也没有这么强的计算能力,但是相关的模...

    TechFlow-承志
  • Codeforces 834D The Bakery【dp+线段树维护+lazy】

    D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabyte...

    Angel_Kitty
  • lambda表达式-编译测试

    我不会IL,也不想学IL,所以为了测试Lambda表达式编译的原理,只能使用调试进行试验来认识: 第一种情况,当Lambda表达式没有用到函数外的变量时: cl...

    用户1172223

扫码关注云+社区

领取腾讯云代金券