在后台应用程序时,EKEventStore更改通知不会触发

时间:2014-07-14 12:35:17

标签: ios nsnotificationcenter ekeventstore

我已使用以下内容注册了日历更改通知:

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

当对本地日历进行更改时,应调用以下内容:

- (void) localCalendarStoreChanged
{
// This gets called when an event in store changes
// you have to go through the calendar to look for changes
// launch this in a thread of its own!
ashsysCalendarEventReporter *eventReport = [ashsysCalendarEventReporter new];

NSLog(@"Local Calendar Store Changed");

[NSThread detachNewThreadSelector:@selector(getCalendarEvents) toTarget:eventReport withObject:nil];
}

但是......当我启动应用程序时,然后将其发送到后台,这样我就可以更改日历条目,当我更改日历条目时没有任何反应。当我回到应用程序时,它会触发。但是,当然这不是目标。

存储在头文件中定义为:

@property (strong,nonatomic) EKEventStore *store;

更新...忘了在背景提取中显示我的内容。

这是在didFinishLaunchingWithOptions

    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

这是在app delegate:

 - (void) application:(UIApplication*) application performFetchWithCompletionHandler:(void (^) (UIBackgroundFetchResult))completionHandler
{
//    UIBackgroundTaskIdentifier uploadCalInfo = [application beginBackgroundTaskWithExpirationHandler:nil];
NSLog(@"A fetch got called");
//    ashsysCalendarEventReporter *eventReport = [ashsysCalendarEventReporter new];
//    [eventReport getCalendarEvents];
//    // [NSThread detachNewThreadSelector:@selector(getCalendarEvents) toTarget:eventReport withObject:nil];
//    [application endBackgroundTask:uploadCalInfo];
completionHandler(UIBackgroundFetchResultNewData);

在看似随机的时间调用performFetch,其中一些根本不与日历相关。有没有办法找出触发后台提取的内容?总是日历吗?实际执行被注释掉了 - 这是正确的吗?

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我一直试图自己找到这个答案,我认为没有一种实际的方法来实现这一目标。 As per Apple's documentation,我们不允许在后台状态下访问系统资源:

  

在暂停之前停止使用共享系统资源。与共享系统资源(如通讯簿或日历数据库)交互的应用程序应在暂停之前停止使用这些资源。此类资源的优先级始终是前台应用程序。当您的应用程序被暂停时,如果发现该应用程序使用共享资源,该应用程序将被终止。

我仍然在寻找更好的答案/解决方法,但我很乐意听到其他人的意见。