【问题标题】:iPhone GPS in background never resumes after pause暂停后,后台的 iPhone GPS 永远不会恢复
【发布时间】:2013-07-03 06:56:43
【问题描述】:

我的应用程序需要在后台跟踪用户位置的变化,并且只要用户四处走动就可以正常工作。 当用户停止并且CLLocationManager 在 10-20 分钟左右后暂停时。此通知表明:

-(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager{}

这对我来说也很好。太好了,我节省了一些电池等。

问题是CLLocationManager 永远不会在用户再次开始移动时唤醒,并且遵循在我将应用程序置于前台之前永远不会触发委托方法(激活):

//Never called back after CLLocationManager pauses:
-(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager{}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{}

为什么在设备再次开始移动后从未调用过locationManagerDidResumeLocationUpdates? GPS不应该也自动恢复(因为自动暂停)? 有没有办法在没有用户交互的情况下恢复 GPS?

应用程序在 Info.plist 文件中声明了以下内容:

我的 CLLocationManager 设置是:

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager setActivityType:CLActivityTypeFitness];
//I WANT pauses to save some battery, etc... That is why following line is commented out (default)
 //[locationManager setPausesLocationUpdatesAutomatically:NO];
 locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters;
 locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
 [locationManager startUpdatingLocation];

【问题讨论】:

  • 返回前台时,是否收到自gps投递关闭以来的所有位置事件,还是全部丢失?
  • 是的,当我返回前台时,所有位置更新都会重新开始。
  • 问题是,如果您同时获得背景和前景之间的位置。 (你会得到一个位置列表)
  • 这不是解决方案。我想停下来工作。文档指出,当用户再次开始移动时,应该调用 resume。我想知道为什么没有。
  • 我的问题不是关于 pausesLocationUpdatesAutomatically 属性的作用。我理解这个功能。我的问题主要是关于恢复 GPS。我需要确切知道暂停是否确定,或者 GPS 是否可以自动恢复。当我结束对此的研究并证明你是对的时,我当然会接受答案。

标签: ios objective-c core-location cllocationmanager uiapplicationdelegate


【解决方案1】:

如果您在 Apple 论坛上搜索 pausesLocationUpdatesAutomatically,您会发现最近有一个类似问题的问题,该问题得到了 Apple 开发人员的回复。我不会直接在这里转发它,因为它是一个私人论坛,但要点是位置暂停是因为用户忘记他们已经运行了一个位置感知应用程序并停止使用它。通过暂停更新,他们的电池不会很快耗尽。不幸的是,无法知道新动作是他们恢复活动还是做其他事情,因此在应用程序回到前台之前不会恢复更新。他们的建议是赶上暂停呼叫,并以某种方式引起用户的注意,让他们在仍需要更新时打开应用程序。

编辑:

来自 Apple 自己的 pausesLocationUpdatesAutomatically 文档。他们建议:

发生暂停后,有责任在您确定需要定位服务时再次重新启动它们。核心位置调用locationManagerDidPauseLocationUpdates(_:) 您的位置经理代表的方法让您知道 发生了暂停。在该方法中,您可以配置一个本地 触发类型为UNLocationNotificationTrigger 的通知 并设置为在用户退出当前区域时通知。这 本地通知的消息应提示用户启动 重新打开您的应用,以便它可以恢复更新。

【讨论】:

  • 我尝试查找您提到的论坛讨论,但找不到。你介意发布一个链接吗?谢谢!
  • 我也对讨论感兴趣。
  • 这里有一些。有人在 Apple 论坛上找到关于此的讨论吗?
  • 不开玩笑。它应该被称为:locationManagerWasKilledNOTPausedAndAppIsToBeSuspendedRIGHTNowSoYouHaveNoWayOfContinuingLiveUpdatesYouMustUseOtherOptions。暂停意味着恢复的能力。在这里你没有有这种能力。
  • 据我所知,只有在前台暂停时才能重新启动。如果您在后台并且您的位置信息已暂停,则应用程序将暂停。之后,再次启动 locationTracking 的唯一方法是再次启动应用程序,然后启动 locationTracking
【解决方案2】:

苹果文档在该主题上非常薄弱。属性pausesLocationUpdatesAutomatically允许苹果在认为用户不需要GPS时关闭GPS。

虽然没有记录,但似乎设置此属性会导致 GPS 在后台模式下停止。

各种帖子描述了该属性的问题:例如:
iOS 6 CoreLocation does not work

iOS 6 AutoPause doesn't work Stanislav Dvoychenko 发布了对 Apple 的推荐:

[更新 - 2013 年 3 月 4 日]。我浏览了 Apple 的演示文稿 iOS6 中的位置更改,他们建议使用区域更改 一旦您收到区域更改事件,监控以“取消暂停”。尽管 这不适合我的场景,因为用户可能会去/运行/开车 直到这样的事件发生一两公里。

我建议:将该属性设置为 false。

【讨论】:

  • 这是唯一的解决方案吗?我觉得很奇怪苹果以这种非对称的方式设计了他们的代表。 Delgate 的暂停回调应该通过 resume 来平衡,而不需要引入任何额外的设置。也许activityType可能对此有一些影响。
  • 可能更多的是技术原因,而不是委托设计。如果 GPS 关闭,您将无法真正检测到运动:通过 GSM 小区变化:(1000m 精度)或 wifi(如果附近有一些 wifi 点)。或带加速度传感器:当设备硬安装时,可用于车辆。但不适用于行人。如果您坐在餐厅的座位上移动,这很难与健身相关的移动区分开来。
  • 您的意思是在locationmanagerdidpauselocationupdates 回调中执行startUpdateLocations 会默默地失败吗?
【解决方案3】:

如果可以,请使用 startMonitoringSignificantLocationChanges,因为那时(Apple):

如果您启动此服务并且您的应用程序随后被终止,如果有新事件到达,系统会自动将应用程序重新启动到后台。

一旦您的应用唤醒(例如用户重新进入它),您可以尝试将此与更细粒度的跟踪结合使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多