我已使用以下内容注册了日历更改通知:
- (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,其中一些根本不与日历相关。有没有办法找出触发后台提取的内容?总是日历吗?实际执行被注释掉了 - 这是正确的吗?
我错过了什么?
答案 0 :(得分:0)
我一直试图自己找到这个答案,我认为没有一种实际的方法来实现这一目标。 As per Apple's documentation,我们不允许在后台状态下访问系统资源:
在暂停之前停止使用共享系统资源。与共享系统资源(如通讯簿或日历数据库)交互的应用程序应在暂停之前停止使用这些资源。此类资源的优先级始终是前台应用程序。当您的应用程序被暂停时,如果发现该应用程序使用共享资源,该应用程序将被终止。
我仍然在寻找更好的答案/解决方法,但我很乐意听到其他人的意见。