注意:这里讲的是升级;不会用的先去学习怎么使用。
为什么我想起来升级尼?(使用的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。