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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容