我的 ionicIonic之路ionic2实战

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

2017-02-25  本文已影响12096人  昵称已被使用_

前言

效果展示

封装插件进行精确定位和导航.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

配置插件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中使用插件

常见问题

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.和插件冲突说明

上一篇下一篇

猜你喜欢

热点阅读