原H5的js如下:
function gettel() {
var ss = JSBridge.gettel();
}
function callAPI() {
JSBridge.callAPI();
}
原UIwebview调用:
@protocol JSObjDelegate <JSExport>
- (void)callAPI;
- (NSString *)gettel;
@end
修改成Wkwebview:
WKUserContentController * userContent = [[WKUserContentController alloc]init];
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.userContentController = userContent;
WKUserScript *usrScript = [[WKUserScript alloc] initWithSource:[ZLJSBridge handlerJS] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
[userContent addUserScript:usrScript];
[userContent addScriptMessageHandler:self name:@"JSBridge"];
_loadWeb.UIDelegate = self;
ZLJSBridge.m中的方法
+(NSString *)handlerJS{
NSString *path =[[NSBundle bundleForClass:[self class]] pathForResource:@"ZLJSBridge" ofType:@"js"];
NSString *handlerJS = [NSString stringWithContentsOfFile:path encoding:kCFStringEncodingUTF8 error:nil];
handlerJS = [handlerJS stringByReplacingOccurrencesOfString:@"\n" withString:@""];
return handlerJS;
}
ZLJSBridge.js文件
var JSBridge = {
callAPI: function() {
var message;
message =
{
'func': 'callAPI'
};
window.webkit.messageHandlers.JSBridge.postMessage(message);
}
//gettel: function() {
//var message;
//message =
//{
// 'func': 'gettel'
// };
// window.webkit.messageHandlers.JSBridge.postMessage(message);
//}
//同步返回值需要改成这种方式
gettel: function() {
var tel = {"functionName": 'gettel'};
return prompt(JSON.stringify(tel));
},
};
修改基本完成,之后就是js掉原生的处理:
1,实现Wkwebview的代理UIDelegate
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
if ([message.name isEqualToString:ZLJSBridgeName])
{
NSString *funcName = [message.body valueForKey:@"func"];
//判断是调用原生哪个方法
//这里只能实现调用,如果像gettel要同步返回值的话是不行的,需要修改
}
}
2.同步返回值的处理
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{
if (prompt) {
//这里就可以同步返回值给js
if ([prompt isContain:@"gettel"]) {
completionHandler([self gettel]);
}
}
}
这样就基本完成替换需求