前提应用场景非常简单
- WKWebView加载前端写好的H5的链接
由于H5这块采用的是Vue.js所有我们之前的js调用OC的方式
WKUserContentController *userCC = config.userContentController;
//JS调用OC 添加处理脚本
[userCC addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"iosAnswer"];
//JS调OC----->OC里调用JS的方法 既能把JS的方法改掉 又能把JS的参数传递过来
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"iosAnswer"]) {
}
- (void)dealloc
{
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"iosAnswer"];
}
- 这么好用的方式不行了 所以我和前端这块约定的是采用另外一种JS调用OC的方式 也就是
// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
//decisionHandler(WKNavigationActionPolicyAllow);
NSURL * URL = navigationAction.request.URL;
if ([URL.absoluteString hasPrefix:@"iosAnswer"]) {
}
通过上述方式来实现JS调用OC的
看起来并无任何问题 然而问题就出在细节上 此处与本文题目暗暗想合了.....
先介绍下问题的现象 很奇怪 让人一时丈二脑袋摸不到头脑
- 总的一句话概括就是 一下这个方法不执行
// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
}
以下两个方法都执行
// 页面开始加载时调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
[MBProgressHUD showMessage:@"加载中"];
}
// 当内容开始返回时调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{
[MBProgressHUD hideHUD];
}
这个问题在开发过程中遇见过一次 当时也没在意 感觉这个方法类似于系统的回调事件 这我也不好干预不是 当时就忽略了下手机的wifi🈶重新连接了下wifi就好了 所以当时也没当回事
开发遇见没当回事啊
长期的测试过程中一直是链接的内网ip也一直没出现过 这个加载完的代理不回调的事情
涉及到的机型
- iPhoneX 11.4 iphone7 10.2 iphone6plus 11.2 11.4 iphone8 11.4 iPhone6 11.4 都没出现问题
马上发布阶段换成公网的域名的 开始最后阶段测试时
首先 iPhoneX 11.4 出问题了
# 以下方法基本不执行 (95%的情况下<不执行> 5%的情况下<执行>)
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
}
- 立马测别的测试机 都OK
- 大概连测了半个多小时(期间我一直在百度X为啥不行)
- 半小时连续测试后 测试的跑来告我iPhone6 11.4也不行了
- 我继续百度 11.4 为啥不执行
- 统统无果 (最多有点相关信息的是WK的代理没设置 或者别的操作把代理覆盖掉了 然而我确定 我的并不是这个原因)
最终我检查了一遍代码之后 把怀疑的目光聚焦在了这个代理回调上
- 代码如下
// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
decisionHandler(WKNavigationActionPolicyAllow);
NSURL * URL = navigationAction.request.URL;
if ([URL.absoluteString hasPrefix:@"iosAnswer1"]) {
xxxxx
}
if ([URL.absoluteString hasPrefix:@"iosAnswer2"]) {
yyyy
}
if ([URL.absoluteString hasPrefix:@"iosAnswer3"]) {
zzzz
}
}
- 改成这样后 问题解决
// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
NSURL * URL = navigationAction.request.URL;
if ([URL.absoluteString hasPrefix:@"iosAnswer1"]) {
xxxxx
decisionHandler(WKNavigationActionPolicyCancel);
} else
if ([URL.absoluteString hasPrefix:@"iosAnswer2"]) {
yyyy
decisionHandler(WKNavigationActionPolicyCancel);
} else
if ([URL.absoluteString hasPrefix:@"iosAnswer3"]) {
zzzz
decisionHandler(WKNavigationActionPolicyCancel);
} else
{
decisionHandler(WKNavigationActionPolicyAllow);
}
另外一件不严谨的事儿
- 公司的企业级账号 在配置证书的时候 发现发布证书在有效期内 所以就没创建新的发布证书
- 然后导出P12给其他同事用时 发现P12文件不能被导出 是置为灰色的
- 同时🔑串里安装的证书也不是能被展开的
- 后来一想 原来是已存在的证书 包含的不是我本机的CSR文件 天了噜😝
网友评论