iOS10からのNotificationが変わったぞと聞いたので、どの様に変わったのか調べたら・・・。すべてswiftでした(^^;
時代はswiftなんだと痛感しましたが、あまのじゃくHikaruappはObjective-Cでの使い方を調べてみました。
検証環境
Xcode 8 GM
iOS 10.0.2
UNUserNotificationCenter
iOS9までのNotificationと使い方はほぼ同じですが、完全に別APIとなりSingletoneとなったので同じ設計をすると失敗しそうです。コードはほぼ流用できますが新規設計と思っていた方が良いと思います。
今回は、単純に5秒後に通知を出す方法と追加になったアプリがフォアグランドにいても通知を出す方法の使い方の説明をします。
初期設定
UNUserNotificationCenterの使う種類を設定し、ユーザーに対して許諾画面を出します。
ここは、旧Notificationとほとんど同じですね。
[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert ) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted) { // APNSはここで設定するの? } }]; [UNUserNotificationCenter currentNotificationCenter].delegate = self;
ここで気を付けないといけないのがUNUserNotificationCenterは、singletoneでdelegeteの設定は後勝ちになります。
5秒後に通知を出す
5秒後に通知を出すように設定します。ここも旧Notificationとほとんど同じですね。
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init]; content.title = [NSString localizedUserNotificationStringForKey:@"Hello!" arguments:nil]; content.body = [NSString localizedUserNotificationStringForKey:@"Hello_message_body" arguments:nil]; content.subtitle = [NSString localizedUserNotificationStringForKey:@"Hello_subtitle" arguments:nil]; content.sound = [UNNotificationSound defaultSound]; // Deliver the notification in five seconds. UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO]; UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond" content:content trigger:trigger]; // Schedule the notification. UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (!error) { NSLog(@"notifer request sucess"); } }];
requestWithIdentifierで指定するStringは通知を管理するために使用します。重複すると後勝ちになります。
delegate
delegateで呼ばれるメソッドは2個あり、そのうちの一つは新しく追加された機能でアプリがフォアグランドにあっても通知を表示する事ができる様になりました。
ユーザーが通知をタップ後に呼ばれる
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler { completionHandler(); }
completionHandler()を呼ぶ前にゴニョゴニョ処理コードを書きます。
アプリがフォアグランドにある場合で表示する前に呼ばれる
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { // アプリがフォアグランドにいた場合の通知動作を指定する。 completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert); };
通知をどの様に表示させるかcompletionHandlerに指定します。
まとめ
今回は、旧APIからの修正する場合での説明程度にしておきましたが、実は、変わっただけではありません。新しい機能が沢山盛り込まれました。
詳細はUserNotifications – Apple Developer Documentationに書かれています
それと、iOS10で動作しなくなるから早く治して!と言われるのですが、iOS10専用でビルドしなければ旧APIもiOS10で使用できます。ここ注意です。実機で動作させて納得させてあげましょう。
あわせて、こちらの記事もどうぞ
Github
サンプルコード – github
Xcode8 GM用でビルド確認してコミットしました。
コメント