Local notification changes after iOS 8

大多数 iOS 开发者应该知道,在 iOS 8 的时候推送通知的开发有了些变化。主要体现在一些命名的变化(Remote 改为 User),另外相对之前只需要一句代码就能解决,现在需要多一些步骤。但总的来说改变并不大,实现原理并未改变。

如 iOS 7:

iOS 7
1
2
3
4
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(
UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound )];

iOS 8:

iOS 8
1
2
3
4
UIUserNotificationType notificationTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
[[UIApplication sharedApplication] registerForRemoteNotifications];

虽然很多人早就已经知道并在实践中作出了改变,但可能依然有些人并不知道 iOS 做出这种改变的原因。

原因是要对本地通知进行规范,并与远程推送通知进行统一。

之前对于本地通知,是无需取得用户授权的,只有远程推送类型的通知需要申请用户授权。上面的那些代码也只是针对远程通知来说的(所以它们之前的命名中都带有”Remote”字眼),本地通知根本无须注册,直接发送通知就好了。但其实这并不合理。

进行改变之后,本地通知跟远程推送通知的概念进行了统一,它们唯一的不同只是消息来源的不同。所以本地通知也需要进行授权。

在代码上,它们的注册也只有一句代码的差距:如果只需要本地通知,则不书写最后的一句:

1
[[UIApplication sharedApplication] registerForRemoteNotifications];

即可。