【问题标题】:How to return boolean to javascript function from swift using wkwebview如何使用 wkwebview 从 swift 将布尔值返回到 javascript 函数
【发布时间】:2017-12-08 08:19:00
【问题描述】:

这是我在 android 中的功能:

@JavascriptInterface
public boolean GetMobileVersion() {

    return true;
}

这是 JavaScript 中的调用函数:

$(window).load(function () {

    IsCallByMobileApp = false;
    try {
          IsCallByMobileApp = app.GetMobileVersion();/*Is call by android app*/

    } catch (e) {
        IsCallByMobileApp = false;
    }

}

在 iOS 中,我尝试像这样使用 WKWebView 实现相同的方法,但它不起作用:

func userContentController(_ userContentController: WKUserContentController, 
    didReceive message: WKScriptMessage) {

    if(message.name == callbackhandler) {

        webView.evaluateJavaScript("GetMobileVersion();")  { (true, error) in
            guard error == nil else {
                print("there was an error")
                return
            }

            print(Bool(true))
        }
    }
}

谁能告诉我如何将true 发送到Javascript 函数?请给我详细的回答,因为我是 iOS 和 Swift 的新手。

【问题讨论】:

  • 不要将变量命名为“true”...

标签: javascript ios swift wkwebview


【解决方案1】:

我为此创建了一个 GitHub 项目。 https://github.com/BKRApps/WKWebView-JS。查看更多详情。

更新 JavaScript:

 function getMobileVersion(){
        webkit.messageHandlers.VersionHandler.postMessage({})
    }

function receivedMobileVersion(mobileVersion){
        //here you will be getting the mobile version. Then execute the logic. 
        // i have added this only to cross check the version. you don't need to add this.

      if(mobileVersion === true) { 
      webkit.messageHandlers.VerifyHandler.postMessage({version:mobileVersion})
    }
 }

getMobileVersion()

将以下代码添加到 WKWebView 配置中:

 configuration.userContentController.add(self, name: "VersionHandler")
// i have added this only to cross check the version. you don't need to add this.
 configuration.userContentController.add(self, name: "VerifyHandler")

更新 WKScriptMessageHandler 委托:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    switch message.name {
    case "VersionHandler":
        let mobileVersion = true //write the version logic and send the true or false.
        let sendMobileVersionScript = "receivedMobileVersion(\(mobileVersion))"
        self.wkWebView?.evaluateJavaScript("\(sendMobileVersionScript)", completionHandler: { (any, error) in
                            print("hello")
        })
    case "VerifyHandler":
        print(message.body) // i have added this only to cross check the version. you 
    default:
        break;
    }
}

更多信息:http://igomobile.de/2017/03/06/wkwebview-return-a-value-from-native-code-to-javascript/

【讨论】:

  • @jakir hussain,我已经提供了示例代码和项目。看看吧。
  • 阅读我的问题 GetMobileVersion() 是从 javascript 调用的,如果调用成功,它将设置 IsCallByMobileApp 为 true
  • 在iOS中,你不能直接从JS调用一个native方法,就像它存在于android中一样。请查看我创建的示例应用程序,它将满足您的需求。如果您遇到任何问题,请告诉我。
  • 在 onLoad 函数中只调用 getMobileVersion()。就是这样。您将在 receivedMobileVersion(mobileversion) { } 中收到回调。在 iOS 中,WkWebView 和 App 在两个不同的进程中运行。它是异步的。
  • 如果是这种情况,请更新答案并关闭问题。
【解决方案2】:

不确定 WKWebView 是否与 webview 相同,但您可以尝试使用以下纯文本:

func userContentController(_ userContentController: WKUserContentController, 
didReceive message: WKScriptMessage) {

if(message.name == callbackhandler) {

    webView.evaluateJavaScript("GetMobileVersion(true);")  { (true, error) in
        guard error == nil else {
            print("there was an error")
            return
        }

        print(Bool(true))
    }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2016-09-10
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2021-02-16
    相关资源
    最近更新 更多