在我的应用程序中,我开始像这样听取重要的位置更改:
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 ,如果它可以重要......
答案 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会使应用程序“隐身”。但是,您可以通过使用时间戳记录位置更新来验证代码是否有效,以便您知道更改发生的时间。