Parse 的推送通知中有一个奇怪的行为。您可以在此处下载一个空白项目并进行一些实验 https://parse.com/downloads/ios/parse-starter-project/latest
要注册推送通知,我们需要在 didFinishLaunchingWithOptions
中使用此代码
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|
UIRemoteNotificationTypeAlert|
UIRemoteNotificationTypeSound];
然后,在 didRegisterForRemoteNotificationsWithDeviceToken
中,我们包括:
[PFPush storeDeviceToken:newDeviceToken];
案例如下:
情况 1。如果您的手机没有该应用程序的版本,并且您运行代码,它将为推送通知注册设备 - 一切正常。
情况 2。如果您最初不使用该代码,请将其从 didFinishLaunchingWithOptions
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|
UIRemoteNotificationTypeAlert|
UIRemoteNotificationTypeSound];
当然,应用程序不会为推送通知注册设备。然后,您插入代码。如果旧应用程序仍在您的手机中,运行它不会注册设备;但如果您卸载旧版本的应用程序,并使用插入的代码安装新应用程序,该应用程序将注册设备。
现在,我们的应用程序处于第 2 种情况。当用户从商店更新应用程序时,应用程序不会为推送通知注册他们的设备,除非他们先删除旧版本。这不是使用推送通知功能更新应用程序的理想方式。 有什么方法可以在不先删除旧版本的情况下更新应用程序并注册推送通知吗?
最佳答案
使用 NSUserDefaults
,您可以设置一个标志来标记设备是否注册了通知。在为它们注册通知后,将标志设置为是:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"Registered"];
在应用程序中确实完成了带有选项的启动,检查这个并且只有在 NO
时才注册它们。
现在,对于已经安装了该应用程序的人来说,他们不一定会重新启动他们的应用程序,因此他们也不一定会经历 appDidFinishLaunching...
但您可以尝试在应用程序的其他位置注册它们。您是否有一个几乎每个用户都一定会在某个时间点访问的主菜单或某个公共(public)位置?如果是这样,插入一些这样的代码:
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"Registered"]) {
// run the code to register and then set the flag to YES
}
关于ios - 解析不注册推送通知设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23970312/