iOS WKwebView 替换 UIwebView. 原H5,js不改变

207 阅读1分钟

原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]);
        }
    }
}

这样就基本完成替换需求