【问题标题】:NSNotificationCenter callback while app in background应用程序在后台时的 NSNotificationCenter 回调
【发布时间】:2014-08-13 10:19:28
【问题描述】:

一题一题: 我有以下代码:

- (void) registerForLocalCalendarChanges
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(localCalendarStoreChanged) name:EKEventStoreChangedNotification object:store ];

}

- (void) localCalendarStoreChanged
{
    // This gets call when an event in store changes
    // you have to go through the calendar to look for changes
    [self getCalendarEvents];
}

这些方法位于名为 CalendarEventReporter 的类/对象中,其中包含方法 getCalendarEvents(在回调中)。

两件事: 1) 如果应用程序在后台,则回调不会运行。有没有办法让它做到这一点? 2)当我将应用程序带回前台时(在更改设备上的日历后),应用程序崩溃,调试窗口或设备上没有任何错误消息。我的猜测是包含回调的 CalendarEventReporter 对象正在被垃圾收集。那可能吗?关于可能导致崩溃的任何其他想法?或者如何查看任何错误信息?

【问题讨论】:

    标签: ios objective-c nsnotificationcenter ekeventkit


    【解决方案1】:

    1) 为了让应用在后台运行,您应该使用“后台执行和多任务处理部分here:

    中提到的模式之一
    • 使用定位服务
    • 录制或播放音频
    • 提供VOIP 服务
    • 后台刷新
    • 与外部设备的连接 喜欢通过BLE

    如果您不使用上述任何一种,则无法在后台获取异步事件。

    2) 为了查看崩溃日志/调用堆栈,请放置一个异常断点或查看此处的“设备日志”部分:Window->Organizer->Devices->“Device Name” on left->Device Logs on Xcode。

    【讨论】:

      【解决方案2】:

      要回答您的第一个问题,请查看https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

      为了让代码在后台运行,我做了类似的事情

      在.h文件中

      UIBackgroundTaskIdentifier backgroundUploadTask;
      

      在.m文件中

      -(void) functionYouWantToRunInTheBackground
      {    
          self.backgroundUploadTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
              [self endBackgroundUpdateTask];
      }];
      //code to do something
      }
      
      -(void) endBackgroundUpdateTask
      {
          [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUploadTask];
          self.backgroundUploadTask = UIBackgroundTaskInvalid;
      }
      

      上面的代码我几乎是从objective c - Proper use of beginBackgroundTaskWithExpirationHandler那里学到的

      至于您的第二个问题,您应该设置一个断点,当您将应用程序带回前台时应该运行代码。如果没有提供足够的代码或信息,没有人能弄清楚为什么应用会崩溃。

      【讨论】:

      • 应用返回时出现的错误是 EXC_BAD_ACCESS Code=1。这告诉我(我认为)当应用程序进入后台(或挂起)时,它正在清理包含回调中代码的对象。如何声明一个对象以使其不被清理?
      • NSNotificationCenter 和本地通知是同一件事的一部分吗?根据文档,本地通知可以将应用程序从暂停带到后台执行回调,但不清楚如何实现。文档还说,在应用程序暂停时,所有通知(即通过 NotificationCenter 的通知)都会排队。那么问题是如何绕过那些通知的排队呢?
      • 本地通知是指UILocalNotification吗?这些是您手机上的应用程序将发送的预定推送通知。那么你要做的是让应用程序在后台监听 localcalendarchanges?你想在它发生时发送推送通知吗?
      • 是的,我的意思是 UILocalNotification 但我想知道这是否是日历应用程序发送给我的应用程序的内容,以及 UILocalNotification 和 NSNotificationCenter 是否相关 - 听起来它们不是。跨度>
      • 我不太清楚你所说的相关是什么意思,但这是两个不同的对象,用于不同的事情。
      【解决方案3】:

      问题第二部分的解决方案是提高包含回调代码的对象的范围。我将它提升到包含 ViewController 的级别。这似乎有效。如果在应用程序处于后台/暂停状态时出现通知,我仍然无法弄清楚如何引发通知(即执行回调)。这会阻止清理包含回调的对象。

      【讨论】:

        猜你喜欢
        • 2014-09-14
        • 1970-01-01
        • 2020-05-24
        • 2015-02-02
        • 2012-01-14
        • 2014-08-05
        • 2021-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多