Cordova8不兼容舊版插件解決方案——以百度地圖定位Cordova插件為例

注意:

本文檔中描述的修改插件的部分(步驟8~11)并非最佳方法号胚,請直接使用以下git庫安裝S涫省>魅亍栗竖!

cordova plugin add https://github.com/gisxiaowei/cordova-plugin-baidumaplocation --variable ANDROID_KEY="<API_KEY_ANDROID>" --variable IOS_KEY="<API_KEY_IOS>"
# 此處的API_KEY_XX來自于第一步,直接替換<API_KEY_XX>渠啤,也可以最后跟 --save 參數(shù)狐肢,將插件信息保存到config.xml中
# 如果只需要Android端或者IOS端,可以只填寫一個相應(yīng)的AK沥曹,但是都不填肯定不行

描述

Cordova目前版本已到8.0.0份名,但由于Cordova7之后,對目錄結(jié)構(gòu)做了調(diào)整妓美,導(dǎo)致之前不少插件無法加載僵腺。出現(xiàn)的常見問題如下:
1渺绒、配置文件找不到

Parsing platforms\android\res\xml\config.xml failed(node:10988) UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory

2矾芙、帶有l(wèi)ibs包的Java程序編譯不通過

:app:compileDebugJavaWithJavacE:\mapp\qyjg\cordova\platforms\android\app\src\main\java\com\aruistar\cordova\baidumap\BaiduMapLocation.java:8:: com.baidu.location FAILED
import com.baidu.location.BDLocation;
                         ^

本人通過不停的google、百度责循,經(jīng)實踐總結(jié)出如下方案贵试。本文以百度地圖定位Cordova插件v3.0.2為例琉兜,說明如何使其適用于Cordova8。

環(huán)境

node v8.11.1
npm 5.6.0
cordova 8.0.0

插件

百度地圖定位Cordova插件cordova-plugin-baidumaplocation

步驟

(1)安裝cordova

安裝最新版本(這里有個坑毙玻,不要用cnpm安裝豌蟋,因為創(chuàng)建項目時會報缺少package.json的錯誤)

npm install -g cordova

安裝某一版本

npm install -g cordova@8.0

卸載

npm uninstall -g cordova

(2)創(chuàng)建項目

cd /d E:\mapp\demo 
cordova create cordova com.my.demo 示例

解釋一下,第1行為進(jìn)入某個目錄下桑滩,第2行為在該目錄下創(chuàng)建cordova文件夾梧疲,id為com.my.demo,名稱為示例运准。

(3)添加Android平臺

安裝cordova-android@7.0.0

cd cordova
cordova platform add android

(4)apk簽名

① 將C:\Program Files\Java\jdk1.8.0_172\bin將入環(huán)境變量的Path中幌氮;
② 生成秘鑰release-key.keystore

keytool -genkey -v -keystore C:\release-key.keystore -alias demo -keyalg RSA -keysize 2048 -validity 20000

秘鑰庫密碼和秘鑰密碼都可以設(shè)為demo..,其他信息可選戳吝。
③ 在cordova文件夾根目錄放置release-key.keystorebuild.json
build.json文件內(nèi)容:

{
    "android": {
        "debug": {
            "keystore": "release-key.keystore",
            "storePassword": "demo..",
            "alias": "demo",
            "password" : "demo..",
            "keystoreType": ""
        },
        "release": {
            "keystore": "release-key.keystore",
            "storePassword": "demo..",
            "alias": "demo",
            "password" : "demo..",
            "keystoreType": ""
        }
    }
}

④ 獲取SHA1
通過如下命令得到SHA1

keytool -v -list -keystore c:/release-key.keystore

(5)申請百度地圖Android Key

訪問http://lbsyun.baidu.com/apiconsole/key浩销,創(chuàng)建應(yīng)用,輸入如下信息听哭。
應(yīng)用名稱:測試慢洋;
應(yīng)用類型:Android SDK塘雳;
發(fā)布版SHA1:apk簽名中得到的SHA1;
包名:com.my.demo普筹。
最終得到訪問應(yīng)用的AK败明。

(6)安裝百度地圖定位Cordova插件

將申請到的AK填入<API_KEY_ANDROID>位置后執(zhí)行

cordova plugin add cordova-plugin-baidumaplocation --variable ANDROID_KEY="<API_KEY_ANDROID>" --variable IOS_KEY="<API_KEY_IOS>"

(7)定位代碼

// 進(jìn)行定位
baidumap_location.getCurrentPosition(function (result) {
    alert(JSON.stringify(result, null, 4));
}, function (error) {

});

(8)運行cordova,報config.xml文件找不到

運行:

cordova run android

報config.xml文件找不到:

Parsing platforms\android\res\xml\config.xml failed(node:10988) UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory

原因分析:

cordova\platforms\android下多了libs文件夾太防,導(dǎo)致判斷為Eclipse還是AndroidStudio出錯妻顶。具體代碼位于cordova\platforms\android\cordova\lib\AndroidStudio.jsvar eclipseFiles = ['AndroidManifest.xml', 'libs', 'res'];

解決方法:

在根目錄下的config.xml文件中<platform name="android">標(biāo)簽后添加hook

<platform name="android">
    <hook src="scripts/patch-android-studio-check.js" type="before_plugin_add" />
    <hook src="scripts/patch-android-studio-check.js" type="before_plugin_install" />
    <hook src="scripts/patch-android-studio-check.js" type="before_plugin_rm" />
    <hook src="scripts/patch-android-studio-check.js" type="before_plugin_uninstall" />
    <hook src="scripts/patch-android-studio-check.js" type="before_prepare" />
</platform>

scripts/patch-android-studio-check.js內(nèi)容如下:

/**
 * This hook overrides a function check at runtime. Currently, cordova-android 7+ incorrectly detects that we are using
 * an eclipse style project. This causes a lot of plugins to fail at install time due to paths actually being setup
 * for an Android Studio project. Some plugins choose to install things into 'platforms/android/libs' which makes
 * this original function assume it is an ecplise project.
 */
module.exports = function(context) {
  if (context.opts.cordova.platforms.indexOf('android') < 0) {
    return;
  }

  const path = context.requireCordovaModule('path');
  const androidStudioPath = path.join(context.opts.projectRoot, 'platforms/android/cordova/lib/AndroidStudio');
  const androidStudio = context.requireCordovaModule(androidStudioPath);
  androidStudio.isAndroidStudioProject = function() {  return true; };
};

(9)再次運行cordova,Java代碼編譯出錯

出錯信息:

:app:compileDebugJavaWithJavacE:\mapp\qyjg\cordova\platforms\android\app\src\main\java\com\aruistar\cordova\baidumap\BaiduMapLocation.java:8:: com.baidu.location FAILED
import com.baidu.location.BDLocation;
                         ^
E:\mapp\qyjg\cordova\platforms\android\app\src\main\java\com\aruistar\cordova\baidumap\BaiduMapLocation.java:9:: com.baidu.location
import com.baidu.location.BDLocationListener;

原因分析:

libs路徑不正確

解決方法:

修改plugins\cordova-plugin-baidumaplocation\plugin.xml
修改前

    <platform name="android">
        <source-file src="src/android/BaiduMapLocation.java" target-dir="src/com/aruistar/cordova/baidumap"/>
        <source-file src="libs/android/armeabi/liblocSDK7a.so" target-dir="libs/armeabi"/>
        <source-file src="libs/android/armeabi-v7a/liblocSDK7a.so" target-dir="libs/armeabi-v7a"/>
        <source-file src="libs/android/arm64-v8a/liblocSDK7a.so" target-dir="libs/arm64-v8a"/>
        <source-file src="libs/android/x86/liblocSDK7a.so" target-dir="libs/x86"/>
        <source-file src="libs/android/x86_64/liblocSDK7a.so" target-dir="libs/x86_64"/>
        <source-file src="libs/android/BaiduLBS_Android.jar" target-dir="libs"/>
    </platform>

修改后

    <platform name="android">
        <source-file src="src/android/BaiduMapLocation.java" target-dir="src/com/aruistar/cordova/baidumap"/>
        <lib-file src="libs/android/armeabi" arch="device"/>
        <lib-file src="libs/android/armeabi-v7a" arch="device"/>
        <lib-file src="libs/android/arm64-v8a" arch="device"/>
        <lib-file src="libs/android/x86" arch="device"/>
        <lib-file src="libs/android/x86_64" arch="device"/>
        <lib-file src="libs/android/BaiduLBS_Android.jar" arch="device"/>
    </platform>

(10)再次運行cordova蜒车,Java代碼編譯仍然出錯

原因分析:

添加插件時讳嘱,已生成相關(guān)代碼,見platforms\android\app\src\main\java\com\aruistar\cordova\baidumap\BaiduMapLocation.java路徑

解決方法:

移除Android酿愧,再添加

cordova platform remove android
cordova platform add android

再次運行

再次運行沥潭,成功執(zhí)行。

(11)執(zhí)行定位代碼時嬉挡,定位出錯

輸出IocType162钝鸽,IocTypeDescriptionNetWork location failed because baidu location service can not decrypt the request query, please check the so file!

原因分析:

查找百度地圖相關(guān)開發(fā)文檔,發(fā)現(xiàn)platforms\android\app\build.gradle文件中缺少sourceSets的配置庞钢,位于dependencies之上

    sourceSets{
        main {
            jniLibs.srcDir 'libs'
            jni.srcDirs = [] //disable automatic ndk-build
        }
    }
}

/*
 * WARNING: Cordova Lib and platform scripts do management inside of this code here,
 * if you are adding the dependencies manually, do so outside the comments, otherwise
 * the Cordova tools will overwrite them
 */



dependencies {

結(jié)語

再次運行拔恰,成功輸出當(dāng)前地理位置信息,至此基括,終于完成Cordova8兼容舊版百度地圖定位Cordova插件的功能颜懊。

參考資料

cordova
1.http://cordova.apache.org/docs/en/latest/guide/cli/index.html
百度地圖定位
2.https://github.com/aruis/cordova-plugin-baidumaplocation
3.http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/create-project/android-studio
配置文件找不到等
4.https://gist.github.com/joeljeske/68121fa6d643e0937f50458d0172e16e
5.https://github.com/litehelpers/Cordova-sqlite-storage/issues/729
6.https://github.com/ionic-team/ionic/issues/13702
7.http://cordova.apache.org/announcements/2017/12/04/cordova-android-7.0.0.html
apk簽名
8.http://www.reibang.com/p/e9a685c88258
9.https://jingyan.baidu.com/article/59703552e877f98fc00740f0.html

轉(zhuǎn)載請注明:作者gisxiaowei,首發(fā)簡書 jianshu.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阱穗,一起剝皮案震驚了整個濱河市饭冬,隨后出現(xiàn)的幾起案子使鹅,更是在濱河造成了極大的恐慌揪阶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件患朱,死亡現(xiàn)場離奇詭異鲁僚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)裁厅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門冰沙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人执虹,你說我怎么就攤上這事拓挥。” “怎么了袋励?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵侥啤,是天一觀的道長当叭。 經(jīng)常有香客問我,道長盖灸,這世上最難降的妖魔是什么蚁鳖? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮赁炎,結(jié)果婚禮上醉箕,老公的妹妹穿的比我還像新娘。我一直安慰自己徙垫,他們只是感情好讥裤,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姻报,像睡著了一般坞琴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逗抑,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天剧辐,我揣著相機(jī)與錄音,去河邊找鬼邮府。 笑死荧关,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的褂傀。 我是一名探鬼主播忍啤,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仙辟!你這毒婦竟也來了同波?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤叠国,失蹤者是張志新(化名)和其女友劉穎未檩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粟焊,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡冤狡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了项棠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悲雳。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖香追,靈堂內(nèi)的尸體忽然破棺而出合瓢,到底是詐尸還是另有隱情,我是刑警寧澤透典,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布晴楔,位于F島的核電站迁央,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏滥崩。R本人自食惡果不足惜岖圈,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钙皮。 院中可真熱鬧蜂科,春花似錦、人聲如沸短条。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茸时。三九已至贡定,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間可都,已是汗流浹背缓待。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留渠牲,地道東北人旋炒。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像签杈,于是被迫代替她去往敵國和親瘫镇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評論 25 707
  • afinalAfinal是一個android的ioc答姥,orm框架 https://github.com/yangf...
    wgl0419閱讀 6,264評論 1 9
  • 其實很多年以后,我只想做你的小毛怪睁壁。 ——致父親 2017年10月7日 陰 ...
    煙雨長寧閱讀 473評論 2 3
  • 這兩天隋帆玩的有點收不住了背苦,上午跟小朋友玩互捌,下午跟小朋友玩潘明,晚上甚至還跑去小朋友家吃飯…直接成瘋丫頭了,我也想讓...
    二五班隋帆媽媽閱讀 220評論 0 0
  • 清華大學(xué)寧向東的管理學(xué)課程秕噪, 有管理者常說钳降,工作都是大家做的,你們只管放開做腌巾,一切責(zé)任我來擔(dān)遂填。要求下屬做到的自己一...
    相信我我是為了你好閱讀 641評論 0 0