一般与 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
网友评论