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