iOS
プッシュ通知
iOS8

iOS8でのプッシュ通知の実装変更点

More than 3 years have passed since last update.

iOS8にアプリを対応させるにあたり

機能の追加などに伴いプッシュ通知でも幾つか変更が必要になりました。

変更点と実装を書いておこうと思います。


追加された関数と非推奨になった関数

iOS8から通知アクションなどが設定できるようになった影響で、一部の関数が非推奨になり使用できなくなりました。


デバイス登録

 iOS7まではデバイス登録の関数でアラートやバッジなどの通知の設定も行うことが出来ましたが

 通知アクションの設定が追加されたことで通知の設定は別の関数に分離されました。


iOS7まで

- (void)registerForRemoteNotificationTypes:(UIRemoteNotificationType)types



iOS8

- (void)registerForRemoteNotifications



通知の設定登録 New!

iOS8からデバイス登録関数では設定の登録ができなくなったのでこちらも呼ぶ必要があります。


iOS8で追加

- (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings



デバイス登録コールバック


iOS8でも同じ

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken



デバイス登録失敗コールバック


iOS8でも同じ

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error



通知の設定登録コールバック New!

iOS8から分離された通知の設定のコールバックです。


iOS8で追加

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings



デバイス登録解除


iOS8でも同じ

- (void)unregisterForRemoteNotifications



通知の設定取得

iOS7までは通知の設定を取得することで同時に登録されているか取得していたのですが、iOS8からは登録の有無は別の関数に分離されました。


iOS7まで

- (UIRemoteNotificationType)enabledRemoteNotificationTypes



iOS8

- (UIUserNotificationSettings *)currentUserNotificationSettings



デバイス登録されているか New!


iOS8で追加

- (BOOL)isRegisteredForRemoteNotifications



実装変更

上記をまとめると


  • デバイス登録時に設定の登録を呼ぶ

  • 設定の登録のコールバックを実装する

追加はこれくらいですね。あとは呼ぶ関数が違うとか列挙型が異なってるとかです。

下記の実装例ではiOS7 SDK(Xcode5)およびiOS8 SDK(Xcode6)でビルドできるように書いていきます。


デバイス登録


  1. SDKで許容するiOSバージョンのマクロ判定でiOS7SDKでビルドが通るようにする

  2. respondsToSelectorでメソッドの有効性チェックをして、実行時に関数の使い分けしてる

iOS7SDKでビルド通らなくてもいいなら1はいらないですね。開発環境の都合上、両方でビルドする時期がある場合とかですね。

2に関しても僕は有効性チェックにしていますが、iOSバージョンでもいいとは思います。

- (void)registerDevice

{
UIApplication *application = [UIApplication sharedApplication];
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
// iOS8 SDK の場合の処理
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)])
{
UIUserNotificationType types = UIUserNotificationTypeAlert;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerForRemoteNotifications];
[application registerUserNotificationSettings:settings];
}else{
[application registerForRemoteNotificationTypes:(RemoteNotificationTypeAlert)];
}
#else
// iOS7 SDK の場合の処理
[application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert)];
#endif
}


設定の登録コールバック

上記のデバイス登録と同じようにiOS7SDKでビルドが通るようにしてるだけです。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
}
#endif


リンク

UIApplication Class Reference

UIApplicationDelegate Protocol Reference