@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

= registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.

[2014-09-21 18:18:11]

iOS8にアップデートして,自作アプリでPush通知を受信できなくなりました.


コンソールにこんなメッセージがでてました.

registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.

Stack Overflowに解決策が.
apple - registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later - Stack Overflow

今まで application:didFinishLaunchingWithOptions: にこんな風に書いてたのですが,

  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

このようにバージョン毎に記述を切り替えるようにしました.

  // http://stackoverflow.com/questions/24454033/registerforremotenotificationtypes-is-not-supported-in-ios-8-0-and-later
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
  if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    // use registerUserNotificationSettings
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
  } else {
    // use registerForRemoteNotifications
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
  }
#else
  // use registerForRemoteNotifications
  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
#endif

このうち,下記の#ifの#else節はXcodeのバージョンを6だけで利用するなら不要みたいです.
他のバージョンと共存する場合は必要みたいなのですがXcode5が手元にないので確認できていません.
respondsToSelectorだけじゃだめなのかな?

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
  // ここに書いてあった内容だけを残して,したのelse部分は削除可能だと思う
#else
  // use registerForRemoteNotifications
  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
#endif