【问题标题】:UIWebview/WKWebView javascript call handle two return values?UIWebview/WKWebView javascript调用处理两个返回值?
【发布时间】:2017-04-24 13:35:53
【问题描述】:

我有一个返回多个值的 javascript 函数。我正在尝试使用 Webview 在我的 iOS 应用程序中调用该函数。我曾尝试搜索类似的问题,但一无所获。检查下面的代码。仅供参考,单个返回值工作正常,我在调用“webview 完成”委托后调用此 javascript。

//Javascript function
function listABCs() constant returns (uint noOfABCs, address[] retABCAddresses) {
    return (abcAddresses.length, abcAddresses);
}

//iOS code
let script = "getAbcList()"
wkWebView?.evaluateJavaScript(script, completionHandler: { (response: Any?, error:Error?) in
       print("\n Error \(String(describing: error))")
       let res = response as? String
       print("Response = \(String(describing: response))")
})

提前致谢。

【问题讨论】:

    标签: javascript ios swift3 uiwebview wkwebview


    【解决方案1】:

    您可以在第一次收到您的值后添加一个布尔值,将其设置为 true

    //Create a variable received response
    var receivedResponse = false
    
    let script = "getKycList()"
    wkWebView?.evaluateJavaScript(script, completionHandler: { (response: Any?, error:Error?) in
       print("\n Error \(String(describing: error))")
       if !receivedResponse {
          if let res = response as? String {
              // use the response now
              print("Response = \(res)")
    
             // set the receivedResponse to true
             receivedResponse = true
          }
    
       }
    
    })
    

    【讨论】:

    • 我想在单独的对象中获取两个返回值并使用它们。这不起作用。
    • 好的。你能发布一些你想要返回的javascript示例吗?我认为在这种情况下,您的 javascript 函数应该返回一个数组,以便您可以从该数组中获取值
    • javascript 函数已添加到问题中。除了数组还有其他方法可以获取多个值吗?
    【解决方案2】:

    我通过返回字典而不是字符串来解决这个问题,然后在 iOS 中使用字典来检索值。

    Javascript 代码:

    function customDictFrom(val1, val2) {
    
        var data_to_pass = {
            'val1': val1,
            'val2': val2
        };
    
        return data_to_pass;
    }
    
    function listABCs() constant returns (uint noOfABCs, address[] retABCAddresses) {
        var data_to_pass = customDictFrom(abcAddresses.length, abcAddresses);
        return data_to_pass;
    }
    

    Swift(原生)处理:

    let script = "getAbcList()"
    wkWebView?.evaluateJavaScript(script, completionHandler: { (response: Any?, error:Error?) in
           print("\n Error \(String(describing: error))")
           let res = response as? [String: Any] //Your response is here as a dictionary
           print("Response = \(String(describing: response))")
    })
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复,但我向服务器团队建议了相同的方法,但他们想要的是不同的值,而不是字典中的不同值。您的方法是正确的,但这不是我想要的。
    • 他们可以调用一个方法,你用这个方法做什么以及如何将它发送到你的本地层取决于你。服务员不需要知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    相关资源
    最近更新 更多