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

2019-06-26  本文已影响0人  Just_go

一般与 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
上一篇 下一篇

猜你喜欢

热点阅读