ionic實(shí)戰(zhàn)-封裝插件進(jìn)行精確定位和導(dǎo)航

前言

  • web端的定位是不準(zhǔn)確的,在一些對(duì)定位要求不高的情況下可以用,比如只需要定位到城市用來查詢天氣

效果展示

封裝插件進(jìn)行精確定位和導(dǎo)航.gif

安裝插件方式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)安裝

  1. 下載插件到本地,如下圖點(diǎn)擊Download Zip


  2. 解壓.zip后.刪掉文件夾目錄-master后綴

3.復(fù)制插件文件夾到app項(xiàng)目plugins目錄下.此時(shí)插件已經(jīng)安裝完成,可以使用了

4.為了讓插件集成的更完善.可以修改fetch.jsonconfig.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中注入NativeServiceprovider

  • 在組件中使用,更完整代碼在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"的記錄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末报腔,一起剝皮案震驚了整個(gè)濱河市生蚁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痴脾,老刑警劉巖驼仪,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異艘儒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夫偶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門界睁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兵拢,你說我怎么就攤上這事翻斟。” “怎么了说铃?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵访惜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我腻扇,道長(zhǎng)债热,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任幼苛,我火速辦了婚禮窒篱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己墙杯,他們只是感情好配并,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著高镐,像睡著了一般溉旋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫉髓,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天低滩,我揣著相機(jī)與錄音,去河邊找鬼岩喷。 笑死恕沫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纱意。 我是一名探鬼主播婶溯,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼偷霉!你這毒婦竟也來了迄委?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤类少,失蹤者是張志新(化名)和其女友劉穎叙身,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硫狞,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡信轿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了残吩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财忽。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泣侮,靈堂內(nèi)的尸體忽然破棺而出即彪,到底是詐尸還是另有隱情,我是刑警寧澤活尊,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布隶校,位于F島的核電站,受9級(jí)特大地震影響蛹锰,放射性物質(zhì)發(fā)生泄漏深胳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一宁仔、第九天 我趴在偏房一處隱蔽的房頂上張望稠屠。 院中可真熱鬧峦睡,春花似錦、人聲如沸权埠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攘蔽。三九已至龙屉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間满俗,已是汗流浹背转捕。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唆垃,地道東北人攒磨。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓付魔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子债蓝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理讥珍,服務(wù)發(fā)現(xiàn)诽凌,斷路器捕犬,智...
    卡卡羅2017閱讀 134,707評(píng)論 18 139
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,439評(píng)論 2 45
  • ——知識(shí)產(chǎn)權(quán)(IP)去中心化交易平臺(tái)(Decentralized Exchange,DEX) Zach LeBea...
    SingularDTV奇點(diǎn)閱讀 370評(píng)論 0 0
  • 從跌宕起伏的情節(jié)中,我們不僅會(huì)對(duì)文中的主人公李雪蓮產(chǎn)生同情恍涂,也會(huì)對(duì)某些官員宝惰,身為人民的公仆,置人民群眾的疾苦再沧,漠然...
    百歲光陰閱讀 385評(píng)論 0 4