ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # // https://medium.com/ionic-and-the-mobile-web/how-to-write-cordova-plugins-864e40025f2 https://moduscreate.com/blog/writing-a-cordova-plugin-in-swift-for-ios/ # 先创建测试项目 1. 创建Hello工程 `cordova create hello com.moke.hello Hello` 第一个hello是创建的工程文件夹名 中间的com.moke.hello就不用多说了,Hello,工程名 2. 添加开发环境平台 首先得切换命令目录到工程目录,例如本例子就需要 cd hello到工程目录中,然后执行 以下命令: android环境:`cordova platform add android` ios环境:`cordova platform add ios` 3. 添加插件 这一步可做可不做 ,但是命令还是要写出来。 `cordova plugin add *********` ,星号部分为插件的地址 或者 自定义插件的目录地址 可以添加也可以删除 `cordova plugin rm ********` ,星号为插件名 如果不知道插件名 可以用命令查看当前工程的插件列表 `cordova plugin list` 4. 最后就是编译 `cordova build android` # 创建自定义插件 有时候github或者npm上的插件不能满足项目需求时 就需要自己自定义插件 全局安装plugman: plugman用于创建插件,(如果你不使用plugin也行,只要你理清了cordova插件的目录结构也行~) ~~~ npm i -g plugman ~~~ 先cmd到桌面或者任意磁盘目录执行以下命令,创建了一个插件并添加了 android 平台,也生成了`package.json`文件.。插件名:`nativeLocation` ,插件id:`com.wjipet.com.mobsdkCore`,版本:0.0.1,`package.json` 是插件描述文件,如果插件只是自己用可以不用生成* ~~~ plugman create --name cordovamobsdkCore--plugin_id com.wjipet.com.mobsdkCore --plugin_version 0.0.1 cd mobsdkCore\ plugman createpackagejson ./ plugman platform add --platform_name android plugman platform add --platform_name ios ~~~ # 使用 Android Studio 打开项目 Android Studio打开项目,注意项目是你的`app项目>platforms>android`。 ## 真机连接调试 启用手机`开发者选项`,`传输文件`,`允许USB调试`! 使用命令`adb devices`,查看手机是否真正连接,只有当状态为device时才说明连接成功,如下图 ## 查看日志 `Android Monitor -> logcat`: 运行到真机上后,点击app页面上的按钮可以在Studio控制台上看到日志信息。这里的控制台就是输出android app运行的日志。app插件bug,闪退等常见问题均可以在这里看到错误日志。 # plugin.xml相关配置 ~~~ <source-file src="src/android/PaySDK/assets/data.bin" target-dir="assets" /> ~~~ ***** # 对于开发的插件 ## [cordova-custom-config](https://github.com/dpa99c/cordova-custom-config) 这个插件从 `config.xml` 配置读取自定义参数,该文件可以被提交到版本控制中,因此可以跨多个开发机器、CI环境和在构建之间进行维护,即使一个平台被删除并被重新添加。 ## [cordova-config-utils](https://github.com/mhartington/cordova-config-utils) 这个Hook 可以根据Cordova通常不使用/忽略的 <preference> 和<config-file> 标签。XML中定义的配置文件数据来更新平台配置文件。用例包括,例如,在iOS设置 `ENABLE_BITCODE = NO` 或禁用 应用传输安全(ATS)。目前只支持 `AndroidManifest.xml`,iOS `*-Info.plist` 和 `*.xcodeproj/project.pbxproj` 文件。 # 问题 ## 降级cordova-android 通过`cordova platform add android` 默认安装了,最新的 cordova-android@~7.0.0 版本出错: ~~~ (node:8072) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated. Error: ENOENT: no such file or directory, mkdir 'D:\My Projects\hello\platforms\android\src\com\moke\hello\wxapi' ~~~ 通过降级安装:`cordova platform add android@6.4.0` 就没有问题! ## 怎么接受不确定的异步结果的成功失败信息? ```java private void sendNoResultPluginResult(CallbackContext callbackContext) { // save current callback context currentCallbackContext = callbackContext; // send no result and keep callback PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT); result.setKeepCallback(true); callbackContext.sendPluginResult(result); } ``` ## cordova libs jar包冲突? 问题出现: ~~~ java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex ~~~ 解决一:For Cordova based project, run `cordova clean android` before build again 解决二: # AndroidManifest.xml 重复键 如果 如下,如果有两个插件都设置了如下 Mob-AppKey Mob-AppSecret name,如果这两个name 以及value 完全相同,cordova 在安装这个两个插件之后,只会保留这个两个 ~~~ <meta-data android:name="Mob-AppKey" android:value="$MOB_APPKEY"/> <meta-data android:name="Mob-AppSecret" android:value="$MOB_APPSECRET"/> ~~~ 如果有value不同,会出现如下情况,导致 `build` 时,出项类似 `duplicate 错误`: ~~~ <meta-data android:name="Mob-AppKey" android:value="12"/> <meta-data android:name="Mob-AppSecret" android:value="234234324"/> ... <meta-data android:name="Mob-AppKey" android:value="12"/> <meta-data android:name="Mob-AppSecret" android:value="234234324"/> ~~~ https://github.com/phonegap/phonegap-plugin-barcodescanner/issues/606 [Cordova插件 / 混合应用插件开发: 解决duplicate issue](https://www.phodal.com/blog/cordova-plugin-remove-duplicate-license-issue/) ## 添加 gradle framework 也可以用于有定制的。gradle文件被包含到主项目的构建中。 ~~~ <framework src="src/android/Wechatpay.gradle" custom="true" type="gradleReference" /> ~~~ Wechatpay.gradle 内容: ~~~ repositories { } dependencies { compile 'com.umeng.sdk:share-wechat:latest.integration' } ~~~ # cordova android 7.0 问题 如果一个比较旧的插件没有更新到cordova-android@7.0.0,就会出现一些问题,。 Android @ 6.30和Android @ 6 . 4 . 0之所以可以工作,是因为它可能使用了较旧的平台项目目录布局(platform project directory layout),在这种布局中,它似乎将顶层 `/platforms/android` 目录用于 `res` 和 `libs` 文件夹。 从Android @ 7 . 0 . 0开始,我注意到它添加了 `app` 子目录,你的 `config.xml` 和 `res` 应该在`/platforms/android/app/src/main/res/xml/config.xml` 而不是 `/platforms/android/res/xml/config.xml`。 旧插件可能具有将文件复制到错误位置的安装/删除脚本。 解决方法: 1. 更新插件, 2. cordova-android 降级 ~~~ cordova platform rm android cordova platform add android@6.4.0 //6.3.0 ~~~ ## 避免再次混淆 如果对ProGuard不太了解,可以查看[这篇文章](http://blog.csdn.net/ljd2038/article/details/51308768#reply)。 [proguard-rules 常用第三方库的混淆配置](https://blog.csdn.net/shanshan_blog/article/details/53169315) https://blog.csdn.net/wozuihaole/article/details/73847803 # 参考 [Cordova插件开发(2)-Android插件安装包制作详解](https://blog.csdn.net/fxp850899969/article/details/70740519) [Cordova 开发之安卓插件开发(二)](https://blog.csdn.net/cmwly/article/details/77843852) [自定义cordova插件-入门](https://www.jianshu.com/p/9cd6f6f7a5cb) [cordova 自定义插件之完整流程](https://blog.csdn.net/q8666995/article/details/53893780)