[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)
- PWA 概念
- Immutable
- Angular 基础概念
- 入门参考
- Angular 更新总结
- Angular 生态系统
- Rx.js
- Ngrx
- CQRS/ES 模式
- Angular 5 详解
- 测试
- 定义共享模块
- 懒路由加载
- angular组件
- 双向绑定及变化检测
- 样式
- ionic 3详解
- ionic3
- ionic 插件
- Ionic 添加动画
- Ghost-Loading
- 打包发布
- Android上架国内应用市场流程
- 总结
- 文章
- 问题合集
- Cordova
- 插件开发指南
- Android插件开发指南-官网
- IOS插件开发指南-官网
- Hooks 编写
- 桥接技术
- ===cordova插件收集===
- 相关主题-官网
- 实战-自定义插件流程
- UI 及 相关资源