[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 及 相關資源