重新启动iphone后,不会重新启动后台位置服务

时间:2017-07-19 12:22:21

标签: ios delphi core-location firemonkey

在我的应用程序中,我开始像这样听取重要的位置更改:

java.util.concurrent.locks.Lock

在info.plist中我也有:

RedissonClient redisson = Redisson.create(config);

RLock lock = redisson.getLock("myLock");
lock.lock();
try {
   // ...
} finally {
   lock.unlock();
}

然后我决定重启iphone。在我走遍整个城市后,我注意到AllowsBackgroundLocationUpdates := true; startMonitoringSignificantLocationChanges; 再也没有被召唤:(我错过了什么?

我也在 Delphi ,如果它可以重要......

1 个答案:

答案 0 :(得分:1)

根据此链接:

recieving location updates after app is terminated

有些因素会决定您的代码是否已执行,即您的应用需要:

  • 在 didFinishLaunchingWithOptions调用期间设置位置服务,并且需要更改类型:lctLarge(TLocationSensor上的LocationChange属性),如果应用由于位置更改而启动(UIApplicationLaunchOptionsLocationKey出现在launchOptions中)

  • 调用setAllowsBackgroundUpdates(True)(适用于iOS 9及更高版本),以便它实际在后台接收位置更新,此外还包含UIBackgroundModes中包含的位置

  • 调用requestAlwaysAuthorization,以便您的应用可以启动到后台。

实现第一个要求可以通过两种方式完成,或者通过“修补”FMX.Platform.iOS,以便由于位置更改而启动会发送代码可以拦截的消息,或者通过拦截FinishedLaunching消息(不需要补丁),除了在后一种情况下,您可能无法确定应用程序是否由于位置更改而启动。这可能无关紧要,因为您也可以拦截BecameActive事件,如果需要,您可以将LocationChange设置为lctSmall。

在任何情况下,由于位置发生变化,您将看不到应用程序是否已启动(即未开始运行),因为iOS会使应用程序“隐身”。但是,您可以通过使用时间戳记录位置更新来验证代码是否有效,以便您知道更改发生的时间。