JavaScriptKit 2.0.1

JavaScriptKit 2.0.1

Alexis Aubry Radanovic 维护。



JavaScriptKit

Build StatusVersion License Platform

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 文件。