【问题标题】:background location services is not restarted when the iphone have been rebootediphone重启后后台定位服务不重启
【发布时间】:2017-07-19 12:22:21
【问题描述】:

在我的应用程序中,我开始聆听这样的重大位置变化:

AllowsBackgroundLocationUpdates := true;
startMonitoringSignificantLocationChanges;

在 info.plist 我也有:

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

然后我决定重新启动 iphone。在我走遍整个城市后,我注意到 DidUpdateLocations 再也没有被调用过 :( 我错过了什么?

如果重要的话,我也在 Delphi...

【问题讨论】:

  • 您的应用程序是否在 iPhone 重启后重新启动?还是第一次使用时启动(由您启动)?
  • 这是问题所在,iphone重启后应用程序无法启动:(

标签: ios delphi core-location firemonkey


【解决方案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 会保持应用程序“不可见”。但是,您可以通过使用时间戳记录位置更新来验证代码是否有效,以便了解更改发生的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 2021-11-21
    • 2011-04-12
    相关资源
    最近更新 更多