白罂粟
白罂粟
  • 发布:2017-06-08 10:22
  • 更新:2019-06-09 00:08
  • 阅读:2897

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

分类:Native.js

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

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

/**  
 * 判断是否开启定位  
 * @param {Object} isTask  
 */  
Location.prototype.checkLocation = function (isTask) {  

}  

/**  
 * 开启定位  
 * @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) {  

}  

QQ:934834037,邮箱:bqs070930@163.com qq加我最好备注一下

3 关注 分享
lhyh 小白啊 DCloud_IOS_XTY

要回复文章请先登录注册

代码游侠

代码游侠

大佬可否分享一下源码? 2978461417@qq.com
2019-06-09 00:08
代码游侠

代码游侠

大佬 Android 的可以实现吗? 还有只要不杀死app 他就能一直后台进入?
2019-06-07 01:32
白罂粟

白罂粟 (作者)

回复 602871542@qq.com:
上面的几乎就是源码了啊,或者我留一个邮箱bqs070930@163.com
2019-06-01 13:57
602871542@qq.com

602871542@qq.com

能否分享一下源码看看?
2019-05-28 12:13
白罂粟

白罂粟 (作者)

回复 gaus:
不太可能吧 你怎么写的
2019-05-23 14:47
gaus

gaus

安卓还是不行啊
2019-05-17 19:54
lanael@live.com

lanael@live.com

mark
2019-05-06 13:43
gaus

gaus

回复 gaus:
大概看明白了
2019-04-29 07:07
gaus

gaus

回复 白罂粟:
请问,工作和非工作状态是指什么? 多谢
2019-04-29 05:17
白罂粟

白罂粟 (作者)

回复 求知欲:
地址留一个
2018-12-07 00:45
白罂粟

白罂粟 (作者)

回复 求知欲:
完整的代码有很多我的逻辑反而影响阅读
2018-12-07 00:44
求知欲

求知欲

大佬能给个完整的代码吗
2018-12-04 18:02
苛学加

苛学加

mark
2018-11-05 18:09
白罂粟

白罂粟 (作者)

回复 1498473100@qq.com:
UIBackgroundModes只有ios需要 android可以的不过你不能把应用杀死
2018-09-26 16:07
1498473100@qq.com

1498473100@qq.com

回复 白罂粟:
你好,谢谢回复。试了好多办法都没办法实现后台的持续定位,能给更详细一些的代码吗?android端没有UIBackgroundModes这个配置选项也可以吗?是否是工作状态,前台为工作状态,后台就为非工作状态的意思?
不管怎样,谢谢大佬提供隔段时间上传服务器的这个思路。
2018-09-26 15:44
白罂粟

白罂粟 (作者)

回复 1498473100@qq.com:
这个是android和ios都可以用的
2018-09-26 14:24
1498473100@qq.com

1498473100@qq.com

你好,请问一下android有办法做到类似的实现吗?
2018-09-18 17:30
小白啊

小白啊

回复 白罂粟:
看不懂
2018-01-30 15:56
小白啊

小白啊

回复 白罂粟:
感谢大佬
2018-01-30 15:37
白罂粟

白罂粟 (作者)

回复 小白啊:
发你了
2018-01-30 15:27
小白啊

小白啊

大佬能给个完整的代码么?
2018-01-30 14:49
白罂粟

白罂粟 (作者)

这是自己写的方法回调
2017-11-10 17:39
我已无力吐槽

我已无力吐槽

onSuccess(); onFailure();是方法吗?
2017-11-07 15:28