一个使用 JavaScriptCore 的简单插件系统。
版权所有 (c) 2018 Weizhong Yang,又名 zonble
插件系统有助于使您的应用更灵活。
用户可能不需要您应用中的所有功能,并且您可能希望随时更新某个功能的实现。如果您将这些功能制作成插件,用户可以在需要时启用或禁用它们,并且如果需要,您可以让用户下载新的插件。
Apple 在 iOS 7 中引入了 JavaScriptCore 框架,这是一个 JavaScript 解释器。 这是一个很棒的工具,我们可以利用它在您的应用中轻松构建一个简单的插件系统。编写新的插件也很容易,因为它们只是简单的 JavaScript 代码。
ZBSimplePluginManager 可以在 iOS、macOS 和 tvOS 上运行。
该 SDK 支持 CocoaPods。 请将 pod 'ZBSimplePluginManager'
添加到您的 Podfile 文件中,然后调用 pod install
。
请创建一个 ZBSimplePluginManager 的实例,方法是提供您的插件文件所在的文件夹,以及用于存储插件设置的命名空间。这里的命名空间是在 NSUserDefaults 中用于管理插件如何启用或禁用的键。
然后,要求管理器加载给定文件夹中的所有插件。
let resourceURL = URL(fileURLWithPath: Bundle.main.resourcePath!)
let pluginFolder = resourceURL.appendingPathComponent("PluginScripts")
let pluginManager = ZBSimplePluginManager(pluginFolderURL: pluginFolder, defaultsNameSpace: "plugins")
pluginManager?.loadAllPlugins()
插件加载完成后,您可以从管理器获取插件列表。
let plugins = pluginManager.plugins
我们在 ZBSimplePluginManager 中定义的插件具有标识符、名称和操作。您可以通过传递特定参数来调用插件的操作。
let plugins = pluginManager.plugins
Let plugin = plugins[0]
_ = plugin.call(args: ["Hello World!"])
一个插件可能看起来像这样
var youtubePlugin = {
id: 'plugin.google.search',
title: 'Search in Google...',
action: function (keyword) {
var url = 'https://google.com/search?q=' + encodeURIComponent(keyword)
openURL(url)
}
}
registerPlugin(youtubePlugin)
插件的作用是
registerPlugin
来注册它。如果已存在使用相同 ID 注册的插件,则您无法注册该插件。
ZBSimplePluginManager 目前只有几个您可以从 JavaScript 代码中调用的 API,但扩展这些 API 也很容易。
registerPlugin
:注册新插件。log
:打印调试信息。openURL
:打开给定的 URL。ZBSimplePluginManager 还提供了一个简单的内存共享键/值存储。您可以使用以下函数来访问它。
set
:通过给定键将值设置到共享存储中。get
:通过给定键获取值。您可以通过简单地调用 addJavaScriptAPI(functionName:, block:)
来添加您自己的函数,以便从您的 JavaScript 代码中调用。例如,如果您想替换现有的 log
函数,您可以在您的代码中这样做
try? self.addJavaScriptAPI(functionName: "log") { log in
if let log = log as? String {
print("[My Log]" + log)
}
return nil
}
您的自定义函数的主体是一个 Swift 闭包,它具有一个简单的输入值并返回一个值。输入和输出值的类型都是可选的 any(在 Swift 中写为 "Any?")。您可以自行转换值以满足您的需求。顺便说一句,您不能替换 'registerPlugin' 函数,否则我们将无法注册插件。
尽情享用!
ZBSimplePluginManager 在 MIT 许可证下发布。 有关详细信息,请参阅 LICENSE。