美文网首页
ios与 web 交互之参数传递(JSON)

ios与 web 交互之参数传递(JSON)

作者: Just_go | 来源:发表于2019-06-26 14:46 被阅读0次

    一般与 web 交互传递的参数是 string 类型

    open func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil)
    

    使用中javaScriptString由 callback 名拼接参数 arg: String
    通常做法 jsString = cb("arg")
    至于为什么 String 类型的还要加上"", 可能是为了确保不同语言中的 string 类型吧
    有时候参数比较复杂, 比如字典, 就需要我们转 jsonString

    func jsonToString(json: AnyObject) -> String {
            do {
                let data1 =  try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted) // first of all convert json to the data
                let convertedString = String(data: data1, encoding: String.Encoding.utf8) // the data will be converted to the string
                print(convertedString ?? "") // <-- here is ur string
                return convertedString ?? ""
                
            } catch let myJSONError {
                print(myJSONError)
            }
            return ""
        }
    
    let para = ["status": 1, "deviceId": deviceId, "source": "1", "versionCode": version] as [String: Any]
    let str = jsonToString(json: para as AnyObject)
    let jsStr : String = "\(String(describing: "__apply_success_cb"))(\(str))"
    
    注意这里 arg 不需要加"", 
    打印 jsStr 结果:
    "__apply_success_cb({\"status\":"1",\"deviceId\":\"1CC2FA1C-9B74-4363-B447-B94E95EA31A8\",\"source\":\"1\",\"versionCode\":\"2.2.6\"})", 
    web 可以正常使用了, 但是注意 status 的 value 是"1"
    

    因为这种 jsonSerialization 转出来的 string, 将 key, value 都转成 string 类型了, 如果 web 那边要求传递过去的参数是个对象(Object), 则不满足需求, 需要用 JSONEncoder 方法

    struct ApplyParam: Codable {
        var status = 1
        var deviceId = "1"
        var source = "1"
        var versionCode = "1"
        
        init(status: Int, deviceId: String, source: String, version: String) {
            self.status = status
            self.deviceId = deviceId
            self.source = source
            self.versionCode = version
        }
        
        init() {
        }
    }
    
    let para = ApplyParam(status: 1, deviceId: deviceId, source: "1", version: version)
    if let paraJsonString = try? JSONEncoder().encode(para) {
        let str = String(decoding: paraJsonString, as: UTF8.self)
        let jsStr :String = "\(String(describing: "__apply_success_cb"))(\(str))"
        self.currentWebVC?.articleWeb.evaluateJavaScript(jsStr, completionHandler: nil)
        }
    打印 jsStr 结果:
    "__apply_success_cb({\"status\":1,\"deviceId\":\"1CC2FA1C-9B74-4363-B447-B94E95EA31A8\",\"source\":\"1\",\"versionCode\":\"2.2.6\"})", 
    可以看到 status 的 value 是数字1
    

    相关文章

      网友评论

          本文标题:ios与 web 交互之参数传递(JSON)

          本文链接:https://www.haomeiwen.com/subject/pgsccctx.html