AppDelegate 代码仅在后台运行

Posted

技术标签:

【中文标题】AppDelegate 代码仅在后台运行【英文标题】:AppDelegate code only runs on Background 【发布时间】:2014-08-16 11:41:49 【问题描述】:

我正在开发一个使用 CoreLocation 来管理 iBeacons 的 ios 应用。我在 AppDelegate 和 ViewController 中都有 Beacon 检测,但我希望 AppDelegate 检测仅在应用程序处于后台状态时工作。当用户进入或离开区域时,我会向服务器发送分析数据,因此如果应用程序处于前台时(AppDelegate 和 ViewController)检测都有效,则应用程序将发送双倍分析数据。

当应用程序处于前台时,是否有任何解决方案可以使代码(发送分析的服务器调用)不运行?

【问题讨论】:

我建议您只有一个类(另一个单例或作为您的应用程序委托的属性引用)来处理您的位置检测。您可以使用 UIApplication 对象的applicationState 属性来确定您是在后台还是前台。 【参考方案1】:

在 AppDelegate 中,在 applicationDidEnterBackground: 方法中启动信标检测,并在 applicationWillEnterForeground: 方法中停止信标检测。

【讨论】:

【参考方案2】:

只需在您的 AppDelegate 中实现方法来跟踪您是否在前台,如果是,请停止从您的 AppDelegate 发送分析数据。见下文:

  - (void)applicationDidEnterBackground:(UIApplication *)application
  
      _sendAnalytics = YES;
  

  - (void)applicationWillEnterForeground:(UIApplication *)application
  
       _sendAnalytics = NO;
  

然后在从 AppDelegate 发送分析数据之前添加一个 if 语句来检查 _sendAnalytics 的值。

按照@paulw11 在他的评论中所建议的那样集中这个逻辑可能会使代码更简洁,但如果您确实需要在两个地方发送分析,以上将解决您的问题。

【讨论】:

以上是关于AppDelegate 代码仅在后台运行的主要内容,如果未能解决你的问题,请参考以下文章

如何在仅在前台运行的后台命令中运行?

当 Healthkit 在后台唤醒我的应用程序时,AppDelegate 是不是会初始化?

当 Healthkit 在后台唤醒我的应用程序时,AppDelegate 是不是会初始化?

GCM BroadcastReceiver 仅在应用程序正在运行或在后台运行时触发

单击通知行为仅在应用程序在后台运行时才有效?

我的应用程序仅在后台运行 ios 10