2016-09-20 153 views
1

我在iOS中使用UIWebView,並與js進行通信。我用JSContext得到以下JS回調:如何在WKWebview中獲得JS回調?

public typealias jsBridgeFuncAlias = (JSValue)->Void 
@objc 
protocol WebViewJSExport:JSExport { 
var call:jsBridgeFuncAlias?{get} 
} 
class SAJavaScriptBridge:NSObject,WebViewJSExport{ 
public var call: jsBridgeFuncAlias? 
public init(context:JSContext){ 
    super.init() 
    context.setObject(self, forKeyedSubscript:kBridgeName as (NSCopying & NSObjectProtocol)!) 
    self.call = { [unowned self](block:JSValue) in 
     self.callNativeMethod(block:block) 
    } 
} 

func callNativeMethod(block:JSValue){ 
    block.call(withArguments:nil) //execute the js callback block in ios native 
} 

但遷移到WKWebView後,我無法用此代碼獲得JS回撥塊:

window.webkit.messageHandlers.WKWebView.postMessage(function()) 

誰能幫助?

回答

0

試試這個: window.webkit.messageHandlers.ur function.postMessage(ur object); 當你使用wkwebview時,你不應該使用javascripCore;

init config並添加u函數 [config.userContentController addScriptMessageHandler:delegate name:@「u function」];

當js調用該函數時,您可以獲得樂趣: userContentController:didReceiveScriptMessage :;;

-1

我有一個簡單的方法來解決這個問題,你可以覆蓋函數的字符串,這樣

const person = { 
     firstName: "John", 
     lastName: "Doe", 
     age: 50, 
     eyeColor: "blue", 
    }; 

    function postMessage(message, callBack) { 
     message.callBack = callBack.toString(); 
     window.webkit.messageHandlers.Native.postMessage(message); 
    } 


    document.getElementById("li1").onclick = function() { 

     postMessage(person, function (args) { 
      console.log('call back is invoked'); 
      console.log(args); 
     }); 

    }; 

在你的本地代碼,就可以得到回調並執行JS字符串。

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { 

    if ([message.name isEqualToString:@"Native"]) { 

     NSString *callBack = message.body[@"callBack"]; //get callBack 
     NSDictionary *dict = @{ 
      @"key1": @"value1", 
      @"key2": @"value2 
     }; 

     id data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil]; 
     NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     [_webView evaluateJavaScript:[NSString stringWithFormat:@"(%@)(%@)", callBack, jsonString] completionHandler:^(id _Nullable jsData, NSError * _Nullable error) { 

     }]; 
    } 
} 

但是有一點小問題,你cant't在JS字符串函數得到正確thisthiswindow