ZBSimplePluginManager

一个使用 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)

插件的作用是

如果已存在使用相同 ID 注册的插件,则您无法注册该插件。

JavaScript API

ZBSimplePluginManager 目前只有几个您可以从 JavaScript 代码中调用的 API,但扩展这些 API 也很容易。

ZBSimplePluginManager 还提供了一个简单的内存共享键/值存储。您可以使用以下函数来访问它。

您可以通过简单地调用 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