ionic实战-封装插件进行精确定位和导航

前言

  • web端的定位是不准确的,在一些对定位要求不高的情况下可以用,比如只需要定位到城市用来查询天气

效果展示

封装插件进行精确定位和导航.gif

安装插件方式1:命令安装

安装定位插件

cordova plugin add https://github.com/yanxiaojun617/com.kit.cordova.amaplocation --save

安装导航插件.如果只需要定位,则不需要安装导航插件

cordova plugin add https://github.com/yanxiaojun617/com.kit.cordova.amapnavigation --save
安装效果图

安装插件方式2:手动安装

  1. 下载插件到本地,如下图点击Download Zip


  2. 解压.zip后.删掉文件夹目录-master后缀

3.复制插件文件夹到app项目plugins目录下.此时插件已经安装完成,可以使用了

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

  • 在高德开发平台控制台添加Android和ios key
  • Android平台key分debug key 和release key,对应debug Apk和release Apk
  • 获取release key需要对app签名获得keystore文件,在开发调试阶段可以先只获取地图debug key,如下图红色字体标注.还需要注意的是,debug key每台电脑都不一样,如果另一位同事也要调试地图定位功能,则需要在他电脑上申请debug key
    添加Android平台key

    添加ios平台key

配置插件key

  • 把申请的Android key填写到如下图位置


  • 把申请的ios key填写到如下图位置


  • 由于许多人还不会申请key,所以添加此gif,注意此gif只添加了android debug key.如果app已经有签名文件,就一并把release key申请了,如下图.

  • 如果已经有了release keystore.则按如下方式申请正式版android key

还不会生成正式版keystore,看这里

最快捷的测试方法

  declare var LocationPlugin;
  test(){
    LocationPlugin.getLocation(data => {
      alert(JSON.stringify(data))
    }, msg => {
      alert(JSON.stringify(msg))
    });
  }

封装插件

如下图,创建一个provider封装插件,注意红色标注

/**
 * 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) {
  }

  /**
   * 是否真机环境
   * @return {boolean}
   */
  isMobile() {
    return this.platform.is('mobile') && !this.platform.is('mobileweb');
  }

  /**
   * 获得用户当前坐标
   * @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('定位错误消息' + msg);
          alert(msg.indexOf('缺少定位权限') == -1 ? ('错误消息:' + msg) : '缺少定位权限,请在手机设置中开启');
          reject('定位失败');
        });
      } else {
        console.log('非手机环境,即测试环境返回固定坐标');
        resolve({'lng': 113.350912, 'lat': 23.119495});
      }
    });
  }

  /**
   * 地图导航
   * @param startPoint 开始坐标
   * @param endPoint 结束坐标
   * @param type 0实时导航,1模拟导航,默认为模拟导航
   * @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);//非手机环境,即测试环境返回固定坐标
        }, function (message) {
          alert('导航失败:' + message);
          reject('导航失败');
        });
      } else {
        console.log('非手机环境不能导航');
      }
    });
  }


}

封装插件

在app中使用插件

  • app.module.ts中注入NativeServiceprovider

  • 在组件中使用,更完整代码在github查看

常见问题

1.定位权限问题

使用cordova.plugins.diagnostic中的isLocationAuthorized方法可以判断app是否有定位权限.
使用cordova.plugins.diagnostic中的isLocationEnabled方法可以判断app是否开启位置服务.
根据这两个方法就可以友好的提示用户开启定位权限,目前我的app已经实现此功能,详情看NativeService.ts中getUserLocation方法

如果不想使用diagnostic插件判断这么复杂,那就给config.xml添加

  <preference name="android-minSdkVersion" value="16" />
  <preference name="android-maxSdkVersion" value="22"/>
  <preference name="android-targetSdkVersion" value="22"/>

Android 6.0权限说明,Android 6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,当targetSdkVersion大于23需要自己实现动态权限申请功能

2.导航功能和极光推送插件冲突

删除/plugins/cordova-plugin-jcore/plugin.xml中的引用


2.导航功能和cordova-sqlite-storage插件冲突

3.和插件冲突说明

  • android查找.so文件会先看有没有arm64-v8a文件夹,如果没有该文件夹就去找armeabi-v7a文件夹,如果没有再去找armeabi文件夹.所以这三个文件夹有优先顺序.并且如果找到了就不再往下找了.
  • 导航插件所有的.so文件都放在armeabi文件夹下,所以如果其他插件提供了arm64-v8a或者armeabi-v7a文件夹,那就找不到导航插件的.so文件了.所以导航功能会闪退
  • 目前处理的方法就是不需要arm64-v8a和armeabi-v7a文件夹,具体操作就是注释其他插件plugin.xml中target-dir="libs/arm64-v8a"target-dir="libs/armeabi-v7a"的记录
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容