在花了两天时间调查这个问题后,我找到了创建原生解决方案GET
and POST
swift 中的方法最终将它们暴露给 javascript。这不是最好的解决方案,但我仍然想分享它。也许它可以帮助某人。
这是它的工作原理
首先我们需要安装阿拉莫菲尔 https://github.com/Alamofire/Alamofire图书馆。我们将使用它来创建请求。
github 上的自述文件包含安装它所需的所有说明
安装Alamofire后我们需要将其导入AppDelegate.swift
import Alamofire
然后我们需要在应用程序控制器中创建函数(AppDelegate.swift
) 将向 javascript 公开方法
func appController(appController: TVApplicationController, evaluateAppJavaScriptInContext jsContext: JSContext)
{
let requests = [String : AnyObject]()
let get: @convention(block) (String, String, [String : String]?) -> Void = { (cId:String, url:String, headers:[String : String]?) in
Alamofire.request(.GET, url, headers: headers)
.responseString { response in
jsContext.evaluateScript("requests." + cId + "(" + response.result.value! + ")")
}
}
let post: @convention(block) (String, String, [String : AnyObject]?, [String : String]?) -> Void = { (cId:String, url:String, parameters:[String : AnyObject]?, headers:[String : String]?) in
Alamofire.request(.POST, url, parameters: parameters, headers: headers)
.responseString { response in
jsContext.evaluateScript("requests." + cId + "(" + response.result.value! + ")")
}
}
jsContext.setObject(requests, forKeyedSubscript: "requests");
jsContext.setObject(unsafeBitCast(get, AnyObject.self), forKeyedSubscript: "nativeGET");
jsContext.setObject(unsafeBitCast(post, AnyObject.self), forKeyedSubscript: "nativePOST");
}
完整代码AppDelegate.swift
你可以找到here https://github.com/a-ignatov-parc/tvos-soap4.me/blob/f0ae4e25b1aa8748cd4c426f9d8fdacf60fa7d10/tvos/soap4.me/AppDelegate.swift#L120-L143
可以了,好了!现在我们可以访问nativeGET
and nativePOST
来自 JavaScript 的函数。
最后一件事是发出请求并检索响应。我不明白如何快速执行回调,所以我使用了jsonp
使用运行时生成的函数并将其名称传递给本机函数的方法。
这是 JavaScript 中的样子
export function get(url, headers = {}) {
return new Promise((resolve) => {
const cId = `get${Date.now()}`;
requests[cId] = response => {
delete requests[cId];
resolve(response);
}
nativeGET(cId, url, headers);
});
}
export function post(url, parameters = {}, headers = {}) {
return new Promise((resolve) => {
const cId = `post${Date.now()}`;
requests[cId] = response => {
delete requests[cId];
resolve(response);
}
nativePOST(cId, url, parameters, headers);
});
}
上面的代码是用 ES6 编写的,您需要包含Promise
TVJS 应用程序中的 polifill。
现在我们可以制作GET
and POST
请求应用我们需要的任何标头
post('http://example.com/', {
login: 'xxx',
password: 'yyy'
}, {
'User-Agent': 'My custom User-Agent'
})