2

以下を使用してカレンダー変更通知に登録しました。

- (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];
}

しかし...アプリを起動してバックグラウンドに送信すると、カレンダーのエントリを変更できますが、カレンダーのエントリを変更しても何も起こりません。アプリに戻ると起動します。しかし、もちろんそれが目的ではありません。

store は、ヘッダー ファイルで次のように定義されています。

@property (strong,nonatomic) EKEventStore *store;

更新...バックグラウンドフェッチで持っているものを表示するのを忘れていました。

これは didFinishLaunchingWithOptions にあります

    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

これはアプリデリゲートにあります:

 - (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 は、カレンダーにまったく関係のないランダムな時間のように見えるときに呼び出されます。バックグラウンド フェッチを起動しているものを見つける方法はありますか? いつもカレンダーですか?実際の実行はコメントアウトされています - それは正しいですか?

私は何が欠けていますか?

4

1 に答える 1

0

私は自分でこの答えを見つけようとしてきましたが、これを達成する実際の方法はないと思います。Apple のドキュメントによると、バックグラウンド状態ではシステム リソースへのアクセスは許可されていません。

中断される前に、共有システム リソースの使用を停止します。アドレス帳やカレンダー データベースなどの共有システム リソースと対話するアプリは、中断される前にそれらのリソースの使用を停止する必要があります。このようなリソースの優先順位は、常にフォアグラウンド アプリになります。アプリが中断されたときに、共有リソースを使用していることが判明した場合、アプリは強制終了されます。

私はまだより良い答え/回避策を探していますが、他の人からこれを聞いてみたいです.

于 2014-08-29T18:19:02.257 に答える