根据我应该收到什么样的UIUserNotificationType
,我得到了我认为iOS 8中推送通知的预期行为。
我运行的测试如下:
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
UIApplication *sharedApplication = [UIApplication sharedApplication];
[sharedApplication registerUserNotificationSettings:mySettings];
[sharedApplication registerForRemoteNotifications];
我收到了预期的UIApplicationDelegate调用,当我发送推送通知时,我收到了预期的警报。一切都很好,直到这里。
然后,我取消注册远程通知:
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
我运行了与上面相同的代码,但在这种情况下,我不会调用registerUserNotificationSettings:
UIApplication *sharedApplication = [UIApplication sharedApplication];
[sharedApplication registerForRemoteNotifications];
我再次获得所有预期的UIApplicationDelegate调用,但是当我发送相同的推送通知时,我在设备上收到警报,我认为这是不正确的。我想我不应该像documentation所说的那样得到警告,声音或徽章:
如果您希望应用的远程通知显示警报,播放声音或执行其他面向用户的操作,则必须调用registerUserNotificationSettings:方法来请求您要使用的通知类型。如果您不调用该方法,系统会以静默方式向您的应用程序发送所有远程通知。
要仔细检查一下,我在另一台设备上只运行了第二个片段:
UIApplication *sharedApplication = [UIApplication sharedApplication];
[sharedApplication registerForRemoteNotifications];
在那种情况下,我没有像预期的那样得到任何警报。
这是正常行为吗?我希望在取消注册后,在下一次注册中表达的首选项(在这种情况下没有首选项)优先,但似乎在未调用registerUserNotificationSettings:
时,先前的设置被缓存到某处并用于决定什么样的通知被发送到应用程序。
答案 0 :(得分:1)
为了实现您想要的行为,您应该使用未配置类型的设置调用registerUserNotificationSettings。这样您将覆盖缓存的设置。像这样:
UIUserNotificationType types = UIUserNotificationTypeNone;
UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
UIApplication *sharedApplication = [UIApplication sharedApplication];
[sharedApplication registerUserNotificationSettings:mySettings];
[sharedApplication registerForRemoteNotifications];
如果您没有重新配置用户通知设置,则会使用缓存的值(正如您所注意到的那样,会继续应用程序重新安装)。