ios有关定位问题

我分享一下我解决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) {

}
\n
2 分享 关注
lhyh 小白啊
白罂粟

白罂粟 回复 求知欲

地址留一个
0 赞 3 天前
白罂粟

白罂粟 回复 求知欲

完整的代码有很多我的逻辑反而影响阅读
0 赞 3 天前
求知欲

求知欲

大佬能给个完整的代码吗
0 赞 6 天前
苛学加

苛学加

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

白罂粟 回复 1498473100@qq.com

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

1498473100@qq.com 回复 白罂粟

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

白罂粟 回复 1498473100@qq.com

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

1498473100@qq.com

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

小白啊 回复 白罂粟

看不懂
0 赞 2018-01-30 15:56
小白啊

小白啊 回复 白罂粟

感谢大佬
0 赞 2018-01-30 15:37
白罂粟

白罂粟 回复 小白啊

发你了
0 赞 2018-01-30 15:27
小白啊

小白啊

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

白罂粟

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

我已无力吐槽

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

要回复文章请先登录注册