UserNotifications、identifier にハマった・・・

iOS 10 以降、UserNotifications の framework が変わったようで、

UNNotificationRequest やら、UNNotificationCenter やら、頭に UN を冠する見慣れない class が出現した訳だ。で、実際に notification を登録するには次のような形を取る:

    UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:identifiername

                                                                          content:notification

                                                                          trigger:trigger];

ここで、requestWithIdentifier が曲者だ。自分の理解では、通知にもいろいろあるよね、例えば、週一回通知するもの、毎日通知するものみたいに分類したい場合があって、分類ごととに identifier 名を設定すればいいんだ、と思い込んでいた。

いやいや、全然そうではない。これ、通知を区別するための内部名称であり、通知一本一本ごとに違う名前を与えないとならない。違う言い方をすると、同じ identifier で登録すると、上書きされてしまうということ。

coreData に登録してある通知内容を取り出し、for 文でループして登録しようとする時、identifier 名を変えてやらないと、一つの identifier を何度も上書きしてしまい、最後の通知一本しか登録されないことになる。

え?では、for 文でまとめて通知しようとする時、identifier 名はどうやって変更すればいいの?という疑問も生まれる。そういう場合は、counter を用意しておいて、

                identifiername = [NSString stringWithFormat:@"%@%d", IDENTIFIERNAME, counter];

こんな感じで、名称の末に数字をつけてやればよい。

うーん、では、機能ごとに通知を変えるにはどうするんだ? A ボタンを押したら 1 分後に通知、B のボタンを押したら 5 分後に通知、のような場合。

登録済みの通知は一覧を取り出すことができ、名前も取り出すことができる。なので、登録済みの通知を取り出して、名前で区別することが可能。例えばこのような形:

    [[UNUserNotificationCenter currentNotificationCenter]

     getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests)

     {

         requestList = requests;

     }];

    for ( UNNotificationRequest* notification in requestList )

    {

         // notification.identifier ← こうすると、NSString が取り出せる。

    }

 

ってか、identifier の意味を考えたら、カテゴリの名前ではなくて、一本一本を区別するための名前なんだ、ということがわかるんだけどね・・・・