Capacitor iOS 插件指南
为 iOS 构建 Capacitor 插件需要编写 Swift(或 Objective-C)代码来与苹果的 iOS SDK 进行交互。
快速开始
首先,按照插件指南中的快速开始部分生成一个插件。
接下来,在 Xcode 中打开 Package.swift。然后导航到你的插件的 .swift 文件。
例如,对于插件类名为 EchoPlugin 的插件,你应该打开 ios/Sources/EchoPlugin/EchoPlugin.swift 和 ios/Sources/EchoPlugin/Echo.swift。
插件基础
一个 iOS 平台的 Capacitor 插件包含两个简单的 Swift 类:一个是继 承自 NSObject 的实现类,用于放置插件逻辑;另一个是继承自 CAPPlugin 和 CAPBridgedPlugin 的类,它导出一些可以从 JavaScript 调用的方法,并包装了实现类的方法。
简单示例
在生成的示例中,有一个简单的回声插件,其中的 echo 函数仅返回接收到的值。
这个示例展示了 Capacitor 插件的几个核心组件:从插件调用接收数据,以及将数据返回给调用者:
Echo.swift
import Foundation
@objc public class Echo: NSObject {
@objc public func echo(_ value: String) -> String {
print(value)
return value
}
}
EchoPlugin.swift
import Foundation
import Capacitor
@objc(EchoPlugin)
public class EchoPlugin: CAPPlugin, CAPBridgedPlugin {
public let identifier = "EchoPlugin"
public let jsName = "Echo"
public let pluginMethods: [CAPPluginMethod] = [
CAPPluginMethod(name: "echo", returnType: CAPPluginReturnPromise)
]
private let implementation = Echo()
@objc func echo(_ call: CAPPluginCall) {
let value = call.getString("value") ?? ""
call.resolve([
"value": implementation.echo(value)
])
}
}
访问调用数据
每个插件方法都会接收一个 CAPPluginCall 实例,其中包含客户端调用插件方法的所有信息。
客户端可以发送任何可以 JSON 序列化的数据,例如数字、文本、布尔值、对象和数组。这些数据可以通过调用实例的 options 字段访问,或者使用便捷方法如 getString 或 getObject。传递和访问其中一些值时需要注意一些特殊性,这一点在单独讨论中已有说明。
例如,以下是如何获取传递给方法的数据:
@objc func storeContact(_ call: CAPPluginCall) {
let name = call.getString("yourName") ?? "default name"
let address = call.getObject("address") ?? [:]
let isAwesome = call.getBool("isAwesome") ?? false
guard let id = call.options["id"] as? String else {
call.reject("必须提供 id")
return
}
// ...
call.resolve()
}
注意在 CAPPluginCall 实例上访问数据的各种方式,包括如何使用 guard 来要求必须提供某些选项。
返回数据
插件调用可以成功或失败。插件调用借鉴了 JavaScript Promise 的方法命名:调用 resolve() 表示成功(可选择返回数据),使用 reject() 表示失败并附带错误信息。
CAPPluginCall 的 resolve() 方法接收一个字典,并支持 JSON 可序列化的数据类型。以下是将数据返回给客户端的示例:
call.resolve([
"added": true,
"info": [
"id": id
]
])
要使调用失败或拒绝,调用 reject(),传递一个错误字符串,并可选 择地传递错误代码和 Error 实例:
call.reject(error.localizedDescription, nil, error)