JavaScriptKit
JavaScriptKit 是一个强大的 JavaScriptCore 替代品,可用于与您的 WebKit 网页视图一起使用。支持 iOS 和 macOS。
特性
- 在 WKWebView 中生成和评估类型安全的 JavaScript 表达式
- 自动编码和解码值、JSON 对象和枚举到 JavaScript
- 易于错误处理
- 已记录文档
安装
CocoaPods
要使用 CocoaPods,请将以下内容添加到您的 Podfile 中
pod 'JavaScriptKit', '~> 2.0'
Carthage
要使用 Carthage,请将以下内容添加到您的 Cartfile 中
github "alexaubry/JavaScriptKit" ~> 2.0
版本
1.0.x | 2.0.x | |
---|---|---|
最低支持的iOS版本 | 8.0 | 8.0 |
最低支持的macOS版本 | 10.10 | 10.10 |
支持的Swift版本 | 4.0.x | 4.2.x |
工作原理
库是根据JSExpression
协议构建的。表达式可以表示为JavaScript表达式字符串,并在编译时定义它们的返回类型,以提高类型安全性。
您可以在WKWebView
内部评估表达式。您提供的一个回调块将在含有成功返回值或WebView在失败时抛出的错误对象的Result
对象上进行调用。回调块始终在主线程上执行。
当WebView返回结果时,JavaScriptKit
使用一个自定义的Decoder
将其解码成您指定的返回类型。这允许您将返回类型设置为任何Decodable
类型(结构,类,原始类型,枚举,数组,字典等)。
使用方法
获取变量的值
使用JSVariable
表达式类型来获取指定键路径上变量的值。
示例1.1
获取当前文档的标题
let titleVariable = JSVariable<String>("document.title")
webView.evaluate(expression: titleVariable) { result in
switch result {
case .success(let title):
// do something with the `title` string
case .failure(let error):
// handle error
}
}
- 成功返回的
title
值是String
类型。
调用函数
使用JSFunction
表达式类型在指定的键路径上调用函数。您可以根据需要传递任意数量的参数。它们必须符合Encodable
协议才能转换为JavaScript表示形式。
当函数不返回值时,使用JSVoid
返回类型。
示例2.1
对字符串进行URI编码
let encodeURI = JSFunction<String>("window.encodeURI", arguments: "Hello world")
webView.evaluate(expression: encodeURI) { result in
switch result {
case .success(let encodedURI):
// do something with the `encodedURI` string
case .failure(let error):
// handle error
}
}
- 表达式
alert
将被转换为:"this.window.encodeURI("Hello world");"
。 - 成功提供的
encodedURI
值是一个String
。
示例2.2
显示警告框
let alert = JSFunction<JSVoid>("window.alert", arguments: "Hello from Swift!")
webView.evaluate(expression: alert, completionHandler: nil)
- 表达式
alert
将被转换为:"this.window.alert("Hello from Swift!");"
。 - 要忽略表达式的结果,请为
completionHandler
参数传递nil
。
示例2.3
刷新窗口
let reload = JSFunction<JSVoid>("location.reload")
webView.evaluate(expression: reload, completionHandler: nil)
- 如果函数不接受任何参数,您可以省略
arguments
参数。
运行您自定义的脚本
使用JSScript
表达式类型运行您自定义的脚本。要创建自定义脚本,您定义一个包含要运行的脚本的String
并定义返回值。
您脚本中最后一次评估的语句将被用作返回值。请不要在脚本的末尾使用return
,因为这会产生无效的值。
示例 3.1
从文档中的时间字符串获取一天中的时间
enum TimeOfDay: String, Decodable {
case night, morning, afternoon, evening
}
let scriptBody = """
function getTimeOfDay(hour) {
if (hour >= 0 && hour < 6) {
return "night";
} else if (hour >= 6 && hour < 12) {
return "morning"
} else if (hour >= 12 && hour < 18) {
return "afternoon"
} else if (hour >= 18 && hour > 0) {
return "evening"
}
}
var postPublishDate = document.getElementById("publish-date").innerHTML
var hours = new Date(postPublishDate).getHours();
getTimeOfDay(hours);
"""
let script = JSScript<TimeOfDay>(scriptBody)
webView.evaluate(expression: script) { result in
switch result {
case .success(let timeOfDay):
// do something with the `timeOfDay` object
case .failure(let error):
// handle error
}
}
- 成功提供的
timeOfDay
值是TimeOfDay
的一种情况。 TimeOfDay
是一种支持的返回类型,因为它实现了Decodable
协议。
贡献
欢迎并感谢贡献!以下是提交贡献的步骤
- 切换并克隆仓库
- 为您要修复的内容创建一个新的分支(例如:
git checkout -b [your branch name]
) - 运行
carthage bootstrap
获取开发依赖项 - 添加您的更改并将其提交到您的分支
- 向
master
分支提交一个 PR
如果您发现了一个错误或认为缺少了一个功能,请通过 提交一个问题。
作者
Alexis Aubry, [email protected] <@_alexaubry>
许可证
JavaScriptKit 可在 MIT 许可证下获取。有关更多信息,请参阅 LICENSE 文件。