CDVPlugin
未找到
当您第一次创建Swift文件时,Xcode会要求您生成一个名为<your app name>-Bridging-Header.h
的头文件,并保留空内容:
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
在此标题中添加:
在此之后清理您的项目。如果您没有这个头文件,请创建它。
CDVPlugin类CustomPluginInSwift(pluginName:CustomPluginInSwift)不存在
[步骤1]
没错,因为Swift使用_TtC
(Type To Class)前缀和带有以下模板的类索引:
_TtC8<AppName><index#><PluginName>
如何确定适当的索引?
[步骤2]
当您初始化CustomPluginInSwift
类的实例时,例如:
var temp:CustomPluginInSwift = CustomPluginInSwift()
Swift将在<AppName>-Swift.h
头文件中添加新类名。问题是,您无法在项目中看到这个头文件。
如何找到它?
- 进入xCode -> 窗口 -> 组织器 -> “项目选项卡”
- 选择您的项目
- 复制“Derived Data”路径(对我来说:
~/Library/Developer/Xcode/DerivedData/<AppName>-hbgwavxfqvhwxzagxhgzjvsdrkjk
)
- 转到控制台并运行
cd ~/Library/Developer/Xcode/DerivedData/<AppName>-hbgwavxfqvhwxzagxhgzjvsdrkjk
- 然后运行:
cd Build/Intermediates/<App name>.build/Debug-iphoneos/<App name>.build/DerivedSources/
您可以在那里找到名为<App name>-Swift.h
的文件,其内容如下:
SWIFT_CLASS("_TtC8Wanameet14CustomPluginInSwift")
@interface CustomPluginInSwift : CDVPlugin
- (void)getSettings:(CDVInvokedUrlCommand *)command;
- (instancetype)initWithWebView:(UIWebView *)theWebView OBJC_DESIGNATED_INITIALIZER;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
所以我们得到了一个合适的名称:_TtC8Wanameet14CustomPluginInSwift
[第三步]
现在,打开config.xml
并进行以下更改:
<feature name="CustomPluginInSwift">
<param name="ios-package" value="CustomPluginInSwift" />
</feature>
发送至:
<feature name="MeeterCalendar">
<param name="ios-package" value="_TtC8Wanameet14CustomPluginInSwift" />
</feature>
就这些了,希望能节省时间,
测试环境为 cordova 3.5
和 xCode6.1
示例
假设您的项目中有一个名为Plugins
的文件夹(由Cordova生成)。
我们创建一个名为MyPlugin.swift
的新的Swift文件,并包含以下内容:
@objc(HWPMyPlugin) class MyPlugin : CDVPlugin { // see @tsubik answer
/* ... */
}
一个解析JavaScript请求并立即返回结果的方法示例:
func someMethod(command: CDVInvokedUrlCommand){
println("MyPlugin :: someMethod is called")
let callbackId:String = command.callbackId
var obj:AnyObject = command.arguments[0] as AnyObject!
var eventStructure:AnyObject = obj["eventStructure"]
var eventId:String = eventStructure["_id"] as AnyObject! as String
println("MyPlugin :: someMethod :: _id: \(eventId) ")
self.commandDelegate.runInBackground({
var data:NSData = jw.toJson()
var str:String = jw.toJsonString(data)
var obj:JSONObject = jw.getJSONObjectFromNSData(data)
println("sampleList as String: \(str)")
var pluginResult:CDVPluginResult = CDVPluginResult(status: CDVCommandStatus_OK, messageAsDictionary: obj)
self.commandDelegate.sendPluginResult(pluginResult, callbackId:command.callbackId)
})
}
返回空回调并在一段时间后返回答案的示例方法:
我经常在原生端使用这种形式的方法来异步获取一些数据:
protocol AccountLoaderListenerItf {
func onAccountsDone(data:NSData)
}
@objc(HWPMyPlugin) class MyPlugin : CDVPlugin, AccountLoaderListenerItf {
var mCalendarAccountsCallbackContext:String?
func getCalendarAccounts( command: CDVInvokedUrlCommand ){
println("MyPlugin :: getCalendarAccounts is called")
self.mCalendarAccountsCallbackContext = command.callbackId
self.commandDelegate.runInBackground({
var all:AccountLoaderListenerItf = self
var accounts = MyAccounts(accLoader: all)
accounts.populateFromCalendars()
var pluginResult:CDVPluginResult = CDVPluginResult(status:CDVCommandStatus_NO_RESULT)
pluginResult.setKeepCallbackAsBool(true)
self.commandDelegate.sendPluginResult(pluginResult, callbackId:command.callbackId)
})
}
func onAccountsDone(data:NSData){
if self.mCalendarAccountsCallbackContext != nil {
var list:JSONArray = WmUtils.getJSONArrayFromNSData(data)
var pluginResult:CDVPluginResult = CDVPluginResult(status: CDVCommandStatus_OK, messageAsArray: list)
pluginResult.setKeepCallbackAsBool(false)
self.commandDelegate.sendPluginResult(pluginResult, callbackId:self.mCalendarAccountsCallbackContext)
}
}
}
@objc(getSettings:)
!否则,您将不得不在 JS 中标记该操作为“getSettingsCommand”。 - bbjay