iOS 15 中后台区域(圆形和信标)检测有时会失败

Ank*_*ani 7 location background region ios ibeacon

我们正在开发一个应用程序,它应该响应 iBeacon 和后台的圆形区域。

有时它工作得很好,但有时信标和圆形区域进入/退出突然停止。

在应用程序中,我们正在使用(在后台模式下)

  • 重要位置更新
  • 信标区域监控
  • 圆形区域监控
  • 某些操作的持续位置更新

任何想法?在我看来,在后台区域检测有时会突然停止工作

这会是问题所在吗?

Bra*_*ald 7

经过反复试验、测试以及与 Apple 的对话后,我可以确认这不是区域监控的错误,而是Apple 在 iOS 15 中新的预热功能的错误。

简而言之,iOS 15 将在 iOS 认为用户会使用的后台静默半启动应用程序。在我们的测试中,这种情况大约每半小时发生一次。它使应用程序启动感觉更快,因为一堆应用程序已经加载并准备就绪。

如果 Apple 预热您的应用程序,并且用户没有完全启动它,然后区域监视器需要通知您的应用程序,则这种情况不会发生。有时区域监控会提醒您的应用程序,有时则不会。如果你的应用程序“冷”,它就能工作。如果您的应用程序在内存中,它就会运行。如果您的应用程序处于这种预热状态,那么您就已经死在水里了。

我从苹果那里得知,这确实是多个错误,有些已修复,有些尚未修复。iOS 15.2 测试版中的注释还特别提到这也可能会影响 HealthKit。

解决该错误的解决方案是检测main.mApple 何时预热您的应用程序和exit. 这不允许您的应用程序在 Apple 预热时启动,并强制您的应用程序在时机成熟时完全启动。

main()这是 inside方法内部的代码main.m。请注意,添加 iOS 版本检测是谨慎的做法,因此当 Apple 修复此问题时,它最终可能会被逐步淘汰和删除。

double systemVersion = [[UIDevice currentDevice] systemVersion].doubleValue;
if (systemVersion >= 15.0) {
    NSDictionary* environment = [[NSProcessInfo processInfo] environment];
    BOOL prewarmed = false;
    for (NSString *key in environment.allKeys) {
        if ([key.lowercaseString containsString:@"prewarm"]) {
            prewarmed = true;
            break;
        }
    }

    if (prewarmed) {
        exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,您不应该调用 exit,但您也不应该执行这种愚蠢的解决方法。这是唯一对我们有用的解决方案。FWIW:苹果确实从 iOS 15.4 开始修复了这个错误,所以你只需要对 iOS 15.0 到 iOS 15.3.x 执行此操作 (2认同)