小权
小权
  • 发布:2017-09-27 12:03
  • 更新:2019-08-29 14:56
  • 阅读:5328

关于iOS后台持续定位的问题

分类:HTML5+

Capabilities中Background Modes 勾了Location updates
info中配置了NSLocationAlwaysUsageDescription
审核通过后测试,也出了始终使用定位的提示。

这是我的代码:

程序切换到后台,3分钟后,watchPosition就不工作了,进入应用后会自动继续定位(不进成功的回调函数,也不进error)。

这到底是哪里的问题,能不能实现后台持续定位?
顺便问一句,为什么在iOS上这个maximumAge不起作用?

2017-09-27 12:03 负责人:无 分享
已邀请:
redzippo

redzippo

1 是离线打包吗?离线打包的话在Xcode项目中主VIEW中增加原生持续定位的代码就行啦~~
2 如果不是离线打包,就没法加原生代码了。。。


原生持续定位,参考:ios原生持续定位
非常简单,大概3个步骤
1 配置定位权限(估计你已经做了)
2 viewDidLoad方法中初始化定位管理器(CLLocationManager)
3 实现定位回调函数,从参数中取坐标(注意原生获取的坐标系和百度的不是一个类型,需要转化一下,百度定位SDK有Utils可以直接转化)
4 完成

  • 小权 (作者)

    是离线打包的。这个我之前在网上也找过类似的原生代码,复制过去后,报错,又完全没有原生开发的基础,所以就放弃了。。那我再按你给的参考试一下,感谢

    2017-09-27 16:39

redzippo

redzippo

1 ios貌似只能实现多少米一上报数据(原生定位是这样),所以时间间隔不好用
2 ios后台有3分钟限制,即3分钟定位后没有网络请求,或者位置没变化的话(不会触发定位事件),就会自动挂起后台进程
个人解决方案:
1 获取到位置,一定上传到服务器
2 服务器监听位置上传状态,如果超过几分钟没有上传,发推送到客户端,提醒重新开启app
3 据说百度,高德的原生定位sdk保活做的还不错,就是可以长时间获取位置进程还不被挂起,有能力的可以试试
4 如果第3条尝试了,记着来广播一下结果,让大家以后少一些坑

小权

小权 (作者)

@redzippo 感谢回答。关于解决方案,我以前每次获取位置是都会调用鹰眼API上传的,所以是有网络请求的,但是3分钟后也会断掉。。

redzippo

redzippo

检查一下3分钟是否有过位置变动,如果有变动,还是会断掉,那就不正常了。
我这块是用原生写的,没有用到plus的监测位置变化,当时也是怕有这方面的问题。
我看你业务是考勤,似乎是个内部app,是否也可以考虑用原生层监听位置,然后调用鹰眼上报?
一共没几句代码也

  • 小权 (作者)

    是的,考勤这里对于外巡人员,需要实时查看他们的位置。所以现在必须要能实现锁屏(后台)状态下,应用能够持续获取位置信息。就像百度地图一样,不管锁屏多久,还是会持续获取位置进行导航。原生的没有实际接触过,还望指教。

    2017-09-27 16:26

redzippo

redzippo

ok,有信心,很简单哈,加油呢

小权

小权 (作者)

更新到最新的SDK之后,定位自动断开的问题解决了

小权

小权 (作者)

现在iOS后台或锁屏持续定位没问题了,但是设置间隔要怎么实现?maximumAge参数在iOS不起作用啊@DCloud_heavensoft

  • h***@126.com

    怎么处理的呀 请教下

    2022-01-16 23:10

所谓

所谓

楼主 问下,弹出始终 的界面如何写的,我看默认是 使用期间内。但是我如果缩后台的时候,状态栏会提示我的程序正在使用位置

另外 我的定位间隔 这样实现的,声明2个时间变量,对时间变量进行操作

backSTime = myCommon.CurentTime();

            var watchId = plus.geolocation.watchPosition( function ( p ) {  
                console.log( "监听位置变化信息:" + JSON.stringify(p) );  

                    backETime =  myCommon.CurentTime();  
                    var chaTime = myCommon.GetDateDiff(backSTime,backETime,'second');  

                        if(chaTime >= 10 ){  
                            //重置开始时间  
                            InsertRealTimeGPS(p.coords.longitude, p.coords.latitude);     
                            backSTime = myCommon.CurentTime();  
                        }
  • 小权 (作者)

    要出现“始终”选项,需要在离线打包时,进行相关配置:在XCode配置 Capabilities - Background Modes ,勾选Location updates。然后在info.plist配置相应的权限申请就行了。

    时间间隔我后来也是设置变量,通过时间差判断来实现的,跟你的做法原理一致。

    2018-02-08 17:14

  • 所谓

    谢谢回答呀,离线打包呀,我说呢,我是在线打包,离线打包还不会

    2018-02-08 17:27

  • 所谓

    回复 小权:另外,问下 应用说明:"location" 这个文字怎么变成别的呢?

    2018-02-08 17:33

  • 小权 (作者)

    回复 所谓:在线打包的话我不太清楚Hbuilder是否提供这个配置项。离线打包是可以在info.plist里配置对应描述的,比如 NSLocationAlwaysUsageDescription:"你想要显示给用户的描述"

    2018-02-09 10:02

所谓

所谓

在线打包 默认的定位 是允许期间,这个时候缩后台 状态栏上会提示正在使用位置

如果 勾选始终,状态栏 就不会提示了

  • 小权 (作者)

    在线打包直接在Hbuider里修改配置文件,有一个参数。你这个就是已经配置好了吧。

    2018-02-08 17:35

  • 所谓

    好的,谢谢

    2018-02-09 10:51

苛学加

苛学加 - 向阳而生

nark

3***@qq.com

3***@qq.com - 90后IT男

你好 我想问一下 你的需求实现了吗?是每隔多少米定位一次,还是每隔多少秒定位一次。我的需求和你的差不多

该问题目前已经被锁定, 无法添加新回复