1. WKWebview-MessageHandler實現(xiàn)(感覺是滿足JS-原生-JS)
通過WKUserContentController的addScriptMessageHandler和其對應(yīng)的代理方法-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message配合JS中window.webkit.messageHandlers.<name>.postMessage(<messageBody>)使用乾翔。
傳送門:http://www.reibang.com/p/ab58df0bd1a1(原po說明很詳細(xì)了)
2.WKWebView中的JS調(diào)用原生方法獲取實際返回值(解決我實時賦值給JS)實現(xiàn)
利用WKWebView的代理方法
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler響應(yīng)JS端調(diào)用prompt函數(shù)应闯,當(dāng)JS調(diào)用prompt會觸發(fā)該代理
Step1:
//JS 聲明一個prompt方法
? ? ? ? ? ? function getNativeDataFunction(functionName,parm){
? ? ? ? ? ? ? ? var payload = {"type": "JSbridge", "functionName": functionName, "arguments": parm};
? ? ? ? ? ? ? ? return prompt(JSON.stringify(payload));
? ? ? ? ? ? };
在JS中需要從原生方法中獲取結(jié)果的地方調(diào)用該方法(當(dāng)時我的問題就是需要實時獲取信號點(diǎn)對應(yīng)的單位在前端展示,而又不用再去響應(yīng)原生調(diào)用JS重新繪制的場景),如:
data.data[i][k].signalUnit =? getNativeDataFunction("getUserData",data.data[i][k].signalUnit);
Step2:
在上訴提到的WKWebView的代理方法中處理
在原生方法中獲得相關(guān)內(nèi)容后饮寞,通過completionHandler回調(diào)給JS
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler {
? ? NSError *err = nil;
? ? NSData *dataFromString = [prompt dataUsingEncoding:NSUTF8StringEncoding];
? ? NSDictionary *payload = [NSJSONSerialization JSONObjectWithData:dataFromString options:NSJSONReadingMutableContainers error:&err];
? ? if (!err){
? ? ? ? NSString *type = [payload objectForKey:@"type"];
? ? ? ? if (type && [type isEqualToString:@"JSbridge"]){
? ? ? ? ? ? //如果有多個promp函數(shù)俩莽,利用payload中的type區(qū)分處理(getReturnValueWithPayload為原生自定義方法)
? ? ? ? ? ? completionHandler([self getReturnValueWithPayload:payload]);
? ? ? ? }
? ? }
}
// 自定義方法
- (NSString *)getReturnValueWithPayload:(NSDictionary *)payload{
? ? NSString *returnValue = @"";
? ? NSString *functionName = [payload objectForKey:@"functionName"];
? ? NSString *args = [payload objectForKey:@"arguments"]; // JS傳入的值
? ? if ([functionName isEqualToString:@"getUserData"]) {
? ? ? ? returnValue = [NSString returnUnitStrWithStr:args];
? ? }
? ? return returnValue;
}