[UILocalNotification] iOSの通知センターから通知を削除する方法

iOS5からUILocalNotificationがアラートではなく、通知センターに表示されるようになりました。

iPhoneの画面の上ぎりぎりから下にスワイプすると出てくるアレ。

通知があった時に通知センターからではなく、アプリを立ち上げた場合でも通知センターには残ったままになっちゃいます。これはまぁいいとしましょう。

しかし通知センターからアプリを起動しても通知センターには通知が残ったままになってしまいます。

最初は繰り返し設定していたから残っていたのではないかと考えたが、繰り返しなしのLocalNotificationを登録しても消えてくれない。

まさか繰り返しなしでも通知されたLocalNotificationが登録されっぱなしで明示的に削除してやらないといけないのか!?と思いscheduledLocalNotificationsを呼び出すも空っぽ。

スケジューリングされているものを取ってくるメソッドとしては正しい動作のような気がする。
うーん。
通知センターに残っているLocalNotificationを取る方法がいまのところない。

scheduldeLocalNotificationsもLocalNotificationが使えるようになったiOS4.0から使える訳ではなくiOS4.2からだ。
まだまだ発展途上?

少し本筋から外れてしまったけど、結局どうやって消すのかというと
通知センターからアプリを起動すると
application:didRecivedLocalNotification:メソッドが呼ばれます。

このメソッドの引数にあるnotificationが通知されたLocalNotificationなので、このnotificationをcancelしてやると通知センター上から消えてくれます。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    // キャンセル処理
    [[UIApplication sharedApplication] cancelLocalNotification:notification];
    if (notification.repeatInterval) {
        // 繰り返しありの場合は再登録
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    }
}

これで通知センターから起動した場合には、通知センターの通知も消えるようになります。

LocalNotificationが繰り返しありの場合、繰り返す分まで消えてしまうのでnotificationが繰り返す場合は再登録するようにしています。

通知センターから通知を消すのはアプリに任せるけど、特定の通知を消せるのは通知センターからアプリを起動した場合だけのもよう。

なにも考えずに通知を消したい場合はcancelAllLocalNotificationsを呼べばいいのですが、これだとまだ通知されていないLocalNotificationも消えてしまうのであまりお勧めしません。

一度全部キャンセルした後にもう一度通知が必要な物を再登録すればそれはそれで問題ないけど。。。

やるならこんな感じ?

    UIApplication* app = [UIApplication sharedApplication];
    // 通知されていないnotificationを取る
    NSArray* notifications = [[NSArray alloc] initWithArray:app.scheduledLocalNotifications copyItems:YES];
    // LocalNotification全部キャンセル
    [app cancelAllLocalNotifications];
    for (UILocalNotification* notification in notifications) {
        // 1つずつ再登録
        [app scheduleLocalNotification:notification];
    }

ちゃんと動くかは見てないので自己責任でおねがいします。

ちなみにRemoteNotificationは使った事ないのでわかりません(´・ω・`)

この記事を書いた人

どらぷー
どらぷー
株式会社ドラプロのマスコットキャラクター。 名前はどらぷー。オス。 こう見えてクマです。
Pocket