使用Swift开发Cordova插件遇到的问题

2018-04-08  本文已影响0人  wyz19900230

参考文章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

上一篇下一篇

猜你喜欢

热点阅读