前言
- web端的定位是不準(zhǔn)確的,在一些對(duì)定位要求不高的情況下可以用,比如只需要定位到城市用來查詢天氣
效果展示
安裝插件方式1:命令安裝
安裝定位插件
cordova plugin add https://github.com/yanxiaojun617/com.kit.cordova.amaplocation --save
安裝導(dǎo)航插件.如果只需要定位,則不需要安裝導(dǎo)航插件
cordova plugin add https://github.com/yanxiaojun617/com.kit.cordova.amapnavigation --save
安裝插件方式2:手動(dòng)安裝
-
下載插件到本地,如下圖點(diǎn)擊Download Zip
-
解壓.zip后.刪掉文件夾目錄
-master
后綴
3.復(fù)制插件文件夾到app項(xiàng)目plugins
目錄下.此時(shí)插件已經(jīng)安裝完成,可以使用了
4.為了讓插件集成的更完善.可以修改fetch.json
和config.xml
聲明插件來源
"com.kit.cordova.amaplocation": {
"source": {
"type": "git",
"url": "https://github.com/yanxiaojun617/com.kit.cordova.amaplocation",
"subdir": "."
},
"is_top_level": true,
"variables": {}
}
<plugin name="com.kit.cordova.amaplocation" spec="https://github.com/yanxiaojun617/com.kit.cordova.amaplocation" />
獲取key
- 在高德開發(fā)平臺(tái)控制臺(tái)添加Android和ios key
- Android平臺(tái)key分debug key 和release key,對(duì)應(yīng)debug Apk和release Apk
- 獲取release key需要對(duì)app簽名獲得keystore文件,在開發(fā)調(diào)試階段可以先只獲取地圖debug key,如下圖紅色字體標(biāo)注.還需要注意的是,debug key每臺(tái)電腦都不一樣,如果另一位同事也要調(diào)試地圖定位功能,則需要在他電腦上申請(qǐng)debug key
添加Android平臺(tái)key
添加ios平臺(tái)key
配置插件key
-
把申請(qǐng)的Android key填寫到如下圖位置
-
把申請(qǐng)的ios key填寫到如下圖位置
由于許多人還不會(huì)申請(qǐng)key,所以添加此gif,注意此gif只添加了android debug key.如果app已經(jīng)有簽名文件,就一并把release key申請(qǐng)了,如下圖.
- 如果已經(jīng)有了release keystore.則按如下方式申請(qǐng)正式版android key
還不會(huì)生成正式版keystore,看這里
最快捷的測(cè)試方法
declare var LocationPlugin;
test(){
LocationPlugin.getLocation(data => {
alert(JSON.stringify(data))
}, msg => {
alert(JSON.stringify(msg))
});
}
封裝插件
如下圖,創(chuàng)建一個(gè)provider封裝插件,注意紅色標(biāo)注
/**
* Created by yanxiaojun617@163.com on 12-27.
*/
import {Injectable} from '@angular/core';
import {Platform} from 'ionic-angular';
declare var LocationPlugin;
declare var AMapNavigation;
@Injectable()
export class NativeService {
private loading;
constructor(private platform: Platform) {
}
/**
* 是否真機(jī)環(huán)境
* @return {boolean}
*/
isMobile() {
return this.platform.is('mobile') && !this.platform.is('mobileweb');
}
/**
* 獲得用戶當(dāng)前坐標(biāo)
* @return {Promise<T>}
*/
getUserLocation() {
return new Promise((resolve, reject) => {
if (this.isMobile()) {
LocationPlugin.getLocation(data => {
resolve({'lng': data.longitude, 'lat': data.latitude});
}, msg => {
console.error('定位錯(cuò)誤消息' + msg);
alert(msg.indexOf('缺少定位權(quán)限') == -1 ? ('錯(cuò)誤消息:' + msg) : '缺少定位權(quán)限,請(qǐng)?jiān)谑謾C(jī)設(shè)置中開啟');
reject('定位失敗');
});
} else {
console.log('非手機(jī)環(huán)境,即測(cè)試環(huán)境返回固定坐標(biāo)');
resolve({'lng': 113.350912, 'lat': 23.119495});
}
});
}
/**
* 地圖導(dǎo)航
* @param startPoint 開始坐標(biāo)
* @param endPoint 結(jié)束坐標(biāo)
* @param type 0實(shí)時(shí)導(dǎo)航,1模擬導(dǎo)航,默認(rèn)為模擬導(dǎo)航
* @return {Promise<T>}
*/
navigation(startPoint, endPoint, type = 1) {
return new Promise((resolve, reject) => {
if (this.platform.is('mobile') && !this.platform.is('mobileweb')) {
AMapNavigation.navigation({
lng: startPoint.lng,
lat: startPoint.lat
}, {
lng: endPoint.lng,
lat: endPoint.lat
}, type, function (message) {
resolve(message);//非手機(jī)環(huán)境,即測(cè)試環(huán)境返回固定坐標(biāo)
}, function (message) {
alert('導(dǎo)航失敗:' + message);
reject('導(dǎo)航失敗');
});
} else {
console.log('非手機(jī)環(huán)境不能導(dǎo)航');
}
});
}
}
在app中使用插件
-
在
app.module.ts
中注入NativeService
provider
-
在組件中使用,更完整代碼在github查看
常見問題
1.定位權(quán)限問題
使用cordova.plugins.diagnostic中的isLocationAuthorized
方法可以判斷app是否有定位權(quán)限.
使用cordova.plugins.diagnostic中的isLocationEnabled
方法可以判斷app是否開啟位置服務(wù).
根據(jù)這兩個(gè)方法就可以友好的提示用戶開啟定位權(quán)限,目前我的app已經(jīng)實(shí)現(xiàn)此功能,詳情看NativeService.ts中g(shù)etUserLocation方法
如果不想使用diagnostic插件判斷這么復(fù)雜,那就給config.xml
添加
<preference name="android-minSdkVersion" value="16" />
<preference name="android-maxSdkVersion" value="22"/>
<preference name="android-targetSdkVersion" value="22"/>
Android 6.0權(quán)限說明,Android 6.0系統(tǒng)默認(rèn)為targetSdkVersion小于23的應(yīng)用默認(rèn)授予了所申請(qǐng)的所有權(quán)限,當(dāng)targetSdkVersion大于23需要自己實(shí)現(xiàn)動(dòng)態(tài)權(quán)限申請(qǐng)功能
2.導(dǎo)航功能和極光推送插件沖突
刪除/plugins/cordova-plugin-jcore/plugin.xml中的引用
2.導(dǎo)航功能和cordova-sqlite-storage插件沖突
3.和插件沖突說明
- android查找.so文件會(huì)先看有沒有arm64-v8a文件夾,如果沒有該文件夾就去找armeabi-v7a文件夾嗜湃,如果沒有再去找armeabi文件夾.所以這三個(gè)文件夾有優(yōu)先順序.并且如果找到了就不再往下找了.
- 導(dǎo)航插件所有的.so文件都放在armeabi文件夾下,所以如果其他插件提供了arm64-v8a或者armeabi-v7a文件夾,那就找不到導(dǎo)航插件的.so文件了.所以導(dǎo)航功能會(huì)閃退
- 目前處理的方法就是不需要arm64-v8a和armeabi-v7a文件夾,具體操作就是注釋其他插件plugin.xml中
target-dir="libs/arm64-v8a"
和target-dir="libs/armeabi-v7a"
的記錄