(0005) iOS 开发之WebViewJavascriptBridge的升级问题

注意:这里讲的是升级;不会用的先去学习怎么使用。

 

为什么我想起来升级尼?(使用的4.1.4~5.0.5

问题:使用的WebViewJavascriptBridge4.1.4的使用,iOS 10上面释放WebView是崩溃。

分析:iOS 10之前没有崩溃问题,因为iOS 10 对UIWebView 的进行了优化,经测试WebView的释放提前了!

WebViewJavascriptBridge实际上对你的WebView进行了引用,并且WebViewJavascriptBridge有自己的delloc,WebViewJavascriptBridge中的delloc

 

- (void) _platformSpecificDealloc {

    _webView.delegate =nil;

}

 

iOS 10 之前的系统,使用WebViewJavascriptBridge4.1.4,释放WebView,不会又问题。

iOS 10 后,WebView的释放相对于iOS 9提前了。WebViewJavascriptBridge 执行自己的delloc时候,WebView已经不存在。崩溃到这句webView.delegate = nil;

 

所以我想看看WebViewJavascriptBridge是否有最新的版本适配iOS 10 的?

github果然有。升级测试问题解决。

 

 

 

1.使用 WebViewJavascriptBridge(4.1.4版本) 与HTML,前提要在HTML代码中添加下面一段

 

    function connectWebViewJavascriptBridge(callback) {

        if (window.WebViewJavascriptBridge) {

          callback(WebViewJavascriptBridge)

        } else {

            document.addEventListener('WebViewJavascriptBridgeReady',function() {

              callback(WebViewJavascriptBridge)}, false)

        }

    }

 

    bridge.init(function(message, responseCallback) {// Objc Send回调

          var data = {'Javascript Responds':'Wee!' }

              responseCallback(data)//响应 Objc

    })

 

    connectWebViewJavascriptBridge(function(bridge) {

        var uniqueId =1

        function log(message, data) {

        var log = document.getElementById('log')

        var el = document.createElement('div')

        el.className = 'logLine'

        el.innerHTML = uniqueId++ + '. ' + message + ':<br/>' + JSON.stringify(data)

    

        if (log.children.length){ log.insertBefore(el, log.children[0]) 

        }else { log.appendChild(el) 

        }

    }

 

    // 这里添加自己的appCallJS方法:所有appCallJS 的方法都要在这里注册一下

    bridge.registerHandler('appCallJSTellHomePageAllJSONData',function(jsonStr) {

    // Objc callHandler回调

        appCallJSTellHomePageAllJSONData(jsonStr);

        var responseData = {'get goods info':'Javascript says data getted!' }

        responseCallback(responseData)//响应 Objc

    })

 

2.WebViewJavascriptBridge(5.0.5版本)使用

 

function connectWebViewJavascriptBridge(callback) {

    if (window.WebViewJavascriptBridge) {return

        callback(WebViewJavascriptBridge);

    }

    if (window.WVJBCallbacks) {return

    window.WVJBCallbacks.push(callback); 

    }

 

    window.WVJBCallbacks = [callback];

    var WVJBIframe = document.createElement('iframe');

    WVJBIframe.style.display = 'none';

    WVJBIframe.src ='wvjbscheme://__BRIDGE_LOADED__';

    document.documentElement.appendChild(WVJBIframe);

    setTimeout(function(){ document.documentElement.removeChild(WVJBIframe) },0)

}

 

connectWebViewJavascriptBridge(function(bridge) {

    var uniqueId =1

    function log(message, data) {

    var log = document.getElementById('log')

    var el = document.createElement('div')

  el.className = 'logLine'

    el.innerHTML = uniqueId++ + '. ' + message + ':<br/>' + JSON.stringify(data)

    if (log.children.length) { log.insertBefore(el, log.children[0])

    }else { log.appendChild(el) 

    }

}

 

// 这里添加自己的appCallJS方法:所有appCallJS 的方法都要在这里注册一下

bridge.registerHandler('appCallJSTellHomePageAllJSONData',function(data,responseCallback) {

     appCallJSTellHomePageAllJSONData(data);

     var responseData = {'Javascript Says':'Right back atcha!' }

     responseCallback(responseData)

     })

   })

貌似简单一点,但是修改html就是致命的缺陷。

 

 

 

3.如果本地OC 升级到WebViewJavascriptBridge(5.0.5版本),在HTML代码中添加的代码变了。相当于桥接方法变了。造成服务端的html不能修改,一旦修改,在线用户的本地的代码由于是老sdk,不能响应服务端的新的桥接方法。巨坑啊!

 

因此:我转向了苹果自带的JavaScriptCore,逐步替换本地的WebViewJavascriptBridge的方法,差强人意的解决了问题。

JavaScriptCore不需要修改html的任何代码。只要html 把OC 传过去的data解析即可。不存在升级sdk 带来和WebViewJavascriptBridge一样的问题。

 

 

 

// 将字符串中的“\”换成“\\”

+ (NSString *)transformSingleSlashToDoubleSlashWithJsonStr:(NSString *)jsonStr

{

    // 单斜杠Str

    NSString *singleStr =@"\\";

    // 双斜杠Str

    NSString *doubleStr = [NSStringstringWithFormat:@"%@%@",@"\\",@"\\"];

    

    NSString *resultStr = [jsonStrstringByReplacingOccurrencesOfString:singleStrwithString:doubleStr];

    

    return resultStr;

}

 

如遇到WebView WebViewJavascriptBridge和JavaScriptCore 使用问题可以加我QQ:1522344335。

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值