8

当您第一次安装应用程序并想要注册推送通知时,应用程序会询问您是否要接收警报。这将永久保存在设置中,即使在删除应用程序后也是如此。

基本上,为了保存令牌,我们这样做:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [[[deviceToken description]
            stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]
            stringByReplacingOccurrencesOfString:@" " withString:@""];
    [[NSUserDefaults standardUserDefaults] setValue:token forKey:kDeviceTokenKey];
}

但问题是,当应用程序从设备中删除时,NSUserDefaults 会被擦除,但推送设置不会。所以它不会再询问,因此不要再次调用委托方法,因此我不再拥有令牌,但推送仍然被激活。

在所描述的场景中是否有机会取回令牌?

4

2 回答 2

23

来自推送通知编程指南

应用程序应在每次启动时注册并为其提供者提供当前令牌。它调用 registerForRemoteNotificationTypes: 方法来启动注册过程。

通过在每次应用程序启动时请求设备令牌并将其传递给提供者,您可以帮助确保提供者拥有设备的当前令牌。如果用户将备份还原到创建备份的设备或计算机之外的设备或计算机(例如,用户将数据迁移到新设备或计算机),他或她必须至少启动一次应用程序才能使其恢复再次收到通知。如果用户将备份数据恢复到新设备或计算机,或重新安装操作系统,则设备令牌会更改。此外,永远不要缓存设备令牌并将其提供给您的提供商;始终在需要时从系统获取令牌。如果您的应用程序之前已注册,请调用 registerForRemoteNotificationTypes:

回答您的问题:registerForRemoteNotificationTypes:在每次发布时调用,并使用最新的令牌。

于 2013-06-07T11:14:12.060 回答
3

registerForRemoteNotificationTypes在每次启动您的应用程序时调用,以便您的方法didRegisterForRemoteNotificationsWithDeviceToken被调用,并且您每次都会从 APNS 获取您的设备令牌。您的应用程序的设备令牌在每次启动时都是相同的。

于 2013-06-07T12:22:21.057 回答