如果你还在代码里用 registerForRemoteNotificationTypes 这个方法来注册推送功能,你的 App 又用 iOS 8 的 SDK 编译了,那么你的 App 在 iOS 8 下将无法注册功能推送(在 iOS 7 下是可以的)。Apple 直接将这个 API 在 iOS 8 下设置成了「无法工作」,而不是简单的标记了 deprecated。
那么在 iOS 8 下用哪个 API 去注册远程推送功能?用新的 API:registerForRemoteNotifications。
但是,这个 API,仅仅会注册一个静默功能的远程推送,尽管 App 之后会收到推送并进行处理,它不会在用户界面上有任何提示。那么如何在 iOS 8 下完成和 iOS 7 下一样的远程推送注册支持?下面的代码可以让推送的支持在 iOS 7 和 iOS 8 下都正常工作,if 里面的是 iOS 8 的,而 else 那里是 iOS 7。
UIApplication *application = [UIApplication sharedApplication]; if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil]; [application registerUserNotificationSettings:settings]; [application registerForRemoteNotifications]; } else { [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert)]; }
可以看到,iOS 8 把原先一步到位的 RemoteNotification 的注册分成两部分,一部分是注册新引入的那个「UIUserNotificationSettings」,另一部分才是 RemoteNotifications。Apple 为什么要这样设计?
简单的说,Apple 在 iOS 8 将 RemoteNotification 和 LocalNotification 统一了起来。两种 Notifications 将统一由 UIUserNotificationSettings 来管理用户界面相关的东西:标记、声音和提醒。除了统一用户界面的通知外,UIUserNotificationSettings 还引入了 UIUserNotificationCategory,可以让用户方便的直接在 Notification 上进行一些快捷的操作(Action)。这部分我还没玩过,所以又不多讲了。
总之,Apple 为了推进新的技术,不惜直接把老的 API 弄成不工作,实在是让人惊叹…