参考文章1:https://blog.csdn.net/yah_529/article/details/70169586
参考文章2:http://www.hangge.com/blog/cache/detail_1152.html
参考文章1是介绍如何创建cordova插件,这个写的比较详细.我遇到的问题都有介绍.
参考文章2是介绍如何使用Swift创建cordova插件,这个遇到了一些问题,这些问题不知道是ios版本问题,还是什么问题.总之按照此文章做是插件是不能运行的.
经过一段时间研究发现了问题所在.先总结两个主要问题:
问题一(CDVPlugin class xxx (pluginName: xxx) does not exist.):
按照文章2做的插件运行时,会报错CDVPlugin class xxx (pluginName: xxx) does not exist.遇到这个问题只需要把swift 中@objc(xxx) class yyy:CDVPlugin 的xxx改成和yyy的名字相同即可.以文章2中代码为例:
import Foundation
@objc(HWPHanggeSwiftPlugin) class HanggeSwiftPlugin : CDVPlugin {
//验证口令方法
func verifyPassword(command:CDVInvokedUrlCommand)
{
//返回结果
var pluginResult:CDVPluginResult?
//获取参数
let password = command.arguments[0] as? String
//开始验证
if password == nil || password == "" {
pluginResult = CDVPluginResult(status: CDVCommandStatus_ERROR,
messageAsString: "口令不能为空")
}else if password != "hangge" {
pluginResult = CDVPluginResult(status: CDVCommandStatus_ERROR,
messageAsString: "口令不正确")
}else{
pluginResult = CDVPluginResult(status:CDVCommandStatus_OK)
}
//发送结果
self.commandDelegate.sendPluginResult(pluginResult, callbackId: command.callbackId)
}
}
直接将HWPHanggeSwiftPlugin改为HanggeSwiftPlugin即可.如下
import Foundation
@objc(HanggeSwiftPlugin) class HanggeSwiftPlugin : CDVPlugin {
//验证口令方法
func verifyPassword(command:CDVInvokedUrlCommand)
{
//返回结果
var pluginResult:CDVPluginResult?
//获取参数
let password = command.arguments[0] as? String
//开始验证
if password == nil || password == "" {
pluginResult = CDVPluginResult(status: CDVCommandStatus_ERROR,
messageAsString: "口令不能为空")
}else if password != "hangge" {
pluginResult = CDVPluginResult(status: CDVCommandStatus_ERROR,
messageAsString: "口令不正确")
}else{
pluginResult = CDVPluginResult(status:CDVCommandStatus_OK)
}
//发送结果
self.commandDelegate.sendPluginResult(pluginResult, callbackId: command.callbackId)
}
}
当然也需要将plugin.xml中的HWPHanggeSwiftPlugin改为HanggeSwiftPlugin:
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
id="hangge-swift-plugin"
version="0.1">
<name>HanggeSwiftPlugin</name>
<description>This plugin use to verify password</description>
<js-module src="hangge-swift-plugin.js">
<clobbers target="window.HanggeSwiftPlugin" />
</js-module>
<!-- iOS -->
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="HanggeSwiftPlugin">
<param name="ios-package" value="HanggeSwiftPlugin" />
</feature>
</config-file>
<source-file src="src/ios/HanggeSwiftPlugin.swift" />
</platform>
</plugin>
第二个问题(ERROR: Method 'xxx' not defined in Plugin):
第一个问题解决后第二个问题就出现了,ERROR: Method 'xxx:' not defined in Plugin.这个问题这是困扰了我好久,看意思是方法找不到.可是方法怎么看偶读没感觉有问题.网上也查阅了很多资料也没找到原因.后来不知怎么着突然想起来Swift转Object-C时,会自动新建一个桥接文件,并切还会生成一个 项目名-Swift.h文件.这个 项目名-Swift.h中有Swift对应Object-C的方法名.
于是我就通过查找 项目名-Swift.h发现了问题所在,Swift转换成Object-C的方法后缀会加With参数名!!!!!(在文章2中即方法名后面加了个WithCommand) 方法名称变了!!!!!!!!!(Swift了解的不多好坑啊)
于是我们就知道了解决办法,即在(以文章2为例)hangge-swift-plugin.js中将verifyPassword改为verifyPasswordWithCommand如下:
var exec = require('cordova/exec');
var HanggeSwiftPlugin = {
verifyPassword: function(sendMsg, onSuccess, onFail) {
return exec(onSuccess, onFail, 'HanggeSwiftPlugin', 'verifyPasswordWithCommand', [sendMsg]);
}
};
module.exports = HanggeSwiftPlugin;
就这样问题解决了...
备注:可以把cordova-plugin-add-swift-support放在plugin.xml里:
<dependency id="cordova-plugin-add-swift-support" version="1.7.2"/>
这样安装自定义插件时cordova-plugin-add-swift-support会默认安装.
此外,我还发现一篇神器:https://cleexiang.github.io/Cordova%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95%E4%B9%8BPods%E4%BE%9D%E8%B5%96/
在cordova中使用Pods,简直不要太爽.只需要在plugins.xml中加个dependency就可以了.
plugin.xml的文件配置具体就不说了,如果有兴趣可以看看:https://www.jianshu.com/p/15251237061d
网友评论