11

これを行うことは可能ですか?UIApplication's scheduledLocalNotificationsは、ユーザーの通知センターに既に配信された通知を返していないように見えるため、これは仕様によるものと思われますが、これに関する文書化された証拠は見つかりません。

誰でも知っていますか?

ありがとう!

編集:これを見つけました:

アプリケーション オブジェクトで cancelLocalNotification: を呼び出すことにより、特定のスケジュールされた通知をキャンセルできます。また、cancelAllLocalNotifications を呼び出すことにより、スケジュールされたすべての通知をキャンセルできます。これらの方法は両方とも、現在の

ここ: http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html

ただし、すでに配信された通知が表示されない場合、配信済みの通知への参照を取得するにはどうすればよいscheduledLocalNotificationsですか?

編集2:

いくつかの通知を登録した後、私がやろうとしていることは次のとおりです。

UIApplication *app = [UIApplication sharedApplication];

for (UILocalNotification *localNotification in app.scheduledLocalNotifications) 
{
     if (someCondition) {
            [app cancelLocalNotification:localNotification];
        }
     }
}

問題は、それらが配信されると、「scheduledLocalNotifications」に含まれなくなることです。

4

6 に答える 6

11

新しく作成した通知を独自NSMutableArrayの通知に追加し、代わりにその配列を確認することで、これを解決できますapp.scheduledLocalNotifications。このようなもの:

Viewcontrollers .h ファイルに a を追加しNSMutableArrayます。

NSMutableArray *currentNotifications;

ViewController を開始するときに開始します

currentNotifications = [[NSMutableArray alloc] init];

通知を開始するときは、配列にも追加します。

UILocalNotification *notification = [[UILocalNotification alloc] init];
...
[currentNotifications addObject:notification];
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

後でその通知をキャンセルしたい場合は、代わりに配列で探してください。また、配列から削除します。

for (UILocalNotification *notification in currentNotifications) {
    if (someCondition) {
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
        [currentNotifications removeObject:notification];
    }
}
于 2012-09-27T09:37:13.590 に答える
2

私もこれに対する答えを探していました。私の問題は、ユーザーがドックアイコンからアプリを開いた場合に備えて、通知センターにあるすべてのアプリ関連の通知を「クリーンアップ」したかったことでした(以前に起動された通知には何もしないため...)

幸いなことに、cancelAllNotificationsスケジュールされたものだけでなく、すべてがキャンセルされるようです。そのため、既存のスケジュールされた通知の参照を保持してから、それらを爆破し、それに応じて再スケジュールしました。

UIApplication *app = [UIApplication sharedApplication];

NSLog(@"\nScheduled notif count (prior) = %d", app.scheduledLocalNotifications.count);

NSArray *scheduledNotifs = app.scheduledLocalNotifications; // hold on to a reference

[[UIApplication sharedApplication] cancelAllLocalNotifications]; // blast everything

NSLog(@"\nScheduled notif count (post-wipeout) = %d", app.scheduledLocalNotifications.count);

for (UILocalNotification *notif in scheduledNotifs) {
    [app scheduleLocalNotification:notif]; // put them back
}

NSLog(@"\nScheduled notif count (post-repopulation) = %d", app.scheduledLocalNotifications.count);

それが誰かに役立つかどうかはわかりませんが、これは私の状況ではうまくいきました.

于 2013-07-18T21:59:14.163 に答える
1

NSKeyedArchiver を使用して NSData に変換し、NSUserDefaults にも保存すると、通知をスケジュールするときに実行できます。

UILocalNotification として戻すには、NSKeyedUnarchiver を使用します。その後、cancelLocalNotification メソッドを使用して削除できます。

ここで完全に説明されています(Swiftバージョン+元のObj-Cソリューションへのリンク)

于 2015-09-04T04:36:18.977 に答える
1

このリンクを試してください:

アップルドキュメント

いくつかのチュートリアル

また、ローカル通知は、アプリではなく、デバイスの通知センターに登録されています。

ただし、アプリが実行中で、通知時間である場合は、次の方法でゲーム内の通知パラメーターを取得できます。

-(void) application:(UIApplication*)app didReceiveLocalNotification:(UILocalNotification*) notification
{
// local notification is geted
}
于 2012-05-18T12:17:33.957 に答える
0

更新されたコードを見た後、 for ループ内のすべての通知をキャンセルすることに興味があるようです。

 [[UIApplication sharedApplication] cancelAllLocalNotifications];
于 2012-05-18T13:51:24.900 に答える