美文网首页
使用Swift开发Cordova插件遇到的问题

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

作者: wyz19900230 | 来源:发表于2018-04-08 15:56 被阅读0次

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

    相关文章

      网友评论

          本文标题:使用Swift开发Cordova插件遇到的问题

          本文链接:https://www.haomeiwen.com/subject/sctmhftx.html