白罂粟
白罂粟
  • 发布:2017-06-08 10:22
  • 更新:2022-09-28 16:00
  • 阅读:22634

ios持续定位/后台定位问题

分类:Native.js

我分享一下我解决IOS和Android定位后台执行定时上传方法。

文章最下面有zip源码下载文件

文章最下面有zip源码下载文件

文章最下面有zip源码下载文件

图1是声明定位的对象 图2是开启 location.js文件中全部封装好了你自己需要的方法 对外只需要暴露的checkLocation closeLocation 2个方法

定位对象必须要是唯一的 如果不唯一就会开启多个定位方法 影响使用

android的如果全杀死是没办法,在后台的情况是没问题的.
我的做法是用watchPosition将获取的到的坐标放在一个数组中,然后调用locationHandle方法每隔多少时间上次到服务器。
这个不会出现上传一段时间之后关掉的情况。
1.在这之前你需要在manifest.json文件中配置启用后台模块"UIBackgroundModes": ["location"]
2.如果定位失败会返回一个5e-324可能是你手机的定位权限没有开启。

var Location = function () {  
  this.reportLocation = null;  
  this.watchLocation = null;  
  this.locationPool = [];  
}  

/**  
 * 判断是否开启定位  
 * @param {Object} isTask 1是开启循环上传定位0是10分钟上传一次本地定位  
 */  
Location.prototype.checkLocation = function (isTask) {  
var _this = this;  
  _this.openLocation({  
                onSuccess: function () {  
                  //开启定位成功首页回调方法  
                  var sell_main = plus.webview.getWebviewById('sell_main');  
                  mui.fire(sell_main, 'locationSuccess');  
                },  
                onFailed: function () {  
                 //开启定位失败首页回调方法  
                  var sell_main = plus.webview.getWebviewById('sell_main');  
                  mui.fire(sell_main, 'locationFailure');  
                }  
              });  
}  

/**  
 * 开启定位  
 * @param {Object} options  
 */  
Location.prototype.openLocation = function (options) {  
  options = options || {};  
  var _this = this;  
  var isTask = this.isTask;  
  var driverForOrderObject = null;  
  var driverForTaskObject = null;  
  var userInfo = DbUtils.getStorage('userInfo', 1);  

  var locationParams = {  
    enableHighAccuracy: true,  
    geocode: false,  
    coordsType: "bd09ll",  
    provider: 'baidu'  
  };  

}  

/**  
 * 默认第一次开启定位的是否先获取 之后用来过滤偏差很大的点  
 * @param {Object} options  
 */  
Location.prototype.locationReady = function (options) {  
  options = options || {};  
  var isTask = this.isTask;  
  var _this = this;  

  var locationParams = {  
    enableHighAccuracy: true,  
    geocode: false,  
    maximumAge: ApiConfig.UPLOADLOCATIONWORKTIME,  
    coordsType: "bd09ll",  
    provider: 'baidu'  
  };  
  _this.getCurrentPosition()  
}  

/**  
 * 非工作状态定位,十五分钟上传一次定位  
 * @param  options  
 */  
Location.prototype.accurateLocation = function (options) {  
  options = options || {};  
  var _this = this;  
  plus.geolocation.getCurrentPosition(function (position) {  
    _this.locationPool.push(position);  
    ApiConfig.staticIsDebug('getCurrentPosition', JSON.stringify(position));  
    _this.reportLocationHandle({  
      onSuccess: function (success) {  
        options.onSuccess && options.onSuccess(success);  
      },  
      onFailed: function (failure) {  
        options.onFailed && options.onFailed(failure);  
      }  
    });  
  }, function () {  
    options.onFailed && options.onFailed();  
  }, options.locationParams);  
}  

/**  
 * 只要定位改变就会获取并过滤错误的点和偏差很多的点   
 *坐标为 -5e32是定位权限没开启的情况  
 * @param  options  
 */  
Location.prototype.getCurrentPosition = function (options) {  
  options = options || {};  
  var _this = this;  
  var phpTimeInt = utilsJs.phpTimeInt();  
  var isWork = options.isWork;  
  var locationParams = options.locationParams;  
  //初始化Location参数  
  if (_this.reportLocation) {  
    window.clearInterval(_this.reportLocation);  
    _this.reportLocation = null;  
  }  
  if (_this.watchLocation) {  
    plus.geolocation.clearWatch(_this.watchLocation);  
    _this.reportLocation = null;  
  }  

  //是否是工作状态 工作状态用watchPosition 非工作状态用getCurrentPosition  
  if (isWork) {  
    _this.watchLocation = plus.geolocation.watchPosition(function (position) {  
        //console.log(JSON.stringify(position));  
        var difference = (position.timestamp / 1000) - phpTimeInt;  
        var coords = position.coords;  
        if (coords.latitude > 0.00000001 && coords.longitude > 0.00000001 && difference > 1) {  
          phpTimeInt = (position.timestamp / 1000);  
          _this.locationPool.push(position);  
          _this.locationHandle({  
            onSuccess: function (success) {  
              options.onSuccess && options.onSuccess(success);  
            },  
            onFailed: function (failure) {  
              options.onFailed && options.onFailed(failure);  
            }  
          });  
        }  
      },  
      function () {  
        options.onFailed && options.onFailed();  
      }, locationParams);  
  } else {  
    _this.reportLocation = window.setInterval(function () {  
      _this.accurateLocation(options);  
    }, ApiConfig.UPLOADLOCATIONTIME);  
  }  
}  
//开启定时器  
Location.prototype.locationHandle = function (options) {  
  options = options || {};  
  var _this = this;  
  if (!_this.reportLocation) {  
    _this.reportLocation = window.setInterval(function () {  
      //plus.push.createMessage('locationPool:' + _this.locationPool.length, '', '');  
      _this.reportLocationHandle({  
        onSuccess: function (success) {  
          options.onSuccess && options.onSuccess(success);  
        },  
        onFailed: function (failure) {  
          options.onFailed && options.onFailed(failure);  
        }  
      });  
    }, ApiConfig.UPLOADLOCATIONWORKTIME);  
  }  
}  

/**  
 * 关闭定位  
 *  
 */  
Location.prototype.closeLocation = function () {  
  var _this = this;  
  var isTask = this.isTask;  
  if (_this.reportLocation) {  
    window.clearInterval(_this.reportLocation);  
    _this.reportLocation = null;  

  }  
  if (_this.watchLocation) {  
    plus.geolocation.clearWatch(_this.watchLocation);  
    _this.watchLocation = null;  
  }  
  this.locationPool = [];  
  if (isTask) {  
    DbUtils.removeItem('driverStatusForTask');  
  } else {  
    DbUtils.removeItem('driverStatusObject');  
  }  
}  

/**  
 * 上传定位接口  
 * @param options  
 */  
Location.prototype.reportLocationHandle = function (options) {  

}
16 关注 分享
lhyh 小白啊 DCloud_IOS_XTY 老哥教教我 8***@qq.com hello_XFJ asdasdsad Zenorz 2***@qq.com makeit 元梦 l***@163.com 2***@qq.com 追光者 2***@qq.com 1***@qq.com

要回复文章请先登录注册

hello_XFJ

hello_XFJ

大佬写的代码真牛逼,我找了半天才找到!感谢辛苦付出。能不能给一份源码。感谢了 757622960@qq.com
2020-07-01 15:03
1***@qq.com

1***@qq.com

回复 kim猴 :
你好,我这边也是需要持续定位,请问你可以不可以分享一下你实现的源码呢,谢谢了,
2020-01-20 11:09
kim猴

kim猴

回复 s***@hotmail.com :
是的,安卓透传好像会透传一次拉起app一次,用户体验不好,玩着别的app。突然弹出透传的app,感觉要是我自己用,我会毫不犹豫的把这个app删除掉,不知道是不是写错了,反正就是安卓用透传,就会透传一次拉起一次,不是后台拉起,会把app弹出来
2020-01-13 15:21
s***@hotmail.com

s***@hotmail.com

回复 kim猴 :
感谢,ios和小程序确实稳定,但有些安卓手机还是会隔一段时间杀掉进程,现在只好试试用透传消息唤醒进程了。
2020-01-12 00:46
小权

小权

ios端配置了后台定位再用watchPosition是没问题,现在做持续定位最大的问题是安卓端!你这个肯定是不行的,应用退到后台或者锁屏后,进程被杀,watchPosition是watch不到的。哪怕做原生开发写服务和广播,很多厂商还是能杀掉
2020-01-06 16:55
kim猴

kim猴

回复 s***@hotmail.com :
你把获取定位换监听定位,然后用定时器去操作多少时间定位一次就可以解决,我之前不行是因为没有用定位实时监听,watchPosition好像是这个
2019-12-24 11:59
kim猴

kim猴

回复 s***@hotmail.com :
我的现在可以了,ios可以,微信小程序也可以了。安置的unipush我还没有试,不过也写了,持续定位是没有什么问题
2019-12-24 11:57
s***@hotmail.com

s***@hotmail.com

回复 kim猴 :
同样情况,以前用Cordova做类似的功能也是这样
2019-12-23 14:45
kim猴

kim猴

拔掉数据线就不行,哪怕是云打包
2019-12-18 11:01
l***@163.com

l***@163.com

您好,方便分享一下源码吗?大佬,我是个小白,上面的代码具体要放在那个文件下。lsq429894377@163.com谢谢!
2019-12-04 17:04