重置应用的推送通知设置

我正在开发一个推送通知的应用程序。 要检查所有可能的用户交互方式,我想在用户拒绝在第一次启动期间为我的应用程序启用推送通知时testing我的应用程序。

然而,该对话框(由registerForRemoteNotificationTypes启动)仅对每个应用出现一次。 如何重置我的应用程序iPhone操作系统的内存。 删除应用程序并重新安装不起作用。

技术说明TN2265:排除推送通知

当推送应用程序首次注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。 一旦用户对此警报作出响应,除非设备已恢复或应用程序已卸载至less一天,否则不会再次显示。

如果您想模拟首次运行您的应用,则可以将该应用卸载一天。 您可以实现后者,而无需等待一天,方法是将系统时钟设置为一天或更长时间,完全closures设备,然后重新打开设备。

更新:正如在下面的评论中指出的,这个解决scheme从iOS 5.1起停止工作。 我会鼓励向苹果提交一个bug,以便他们能够更新他们的文档。 目前的解决scheme似乎是重置设备的内容和设置。

更新:技术说明已更新为iOS 7以上正确运行的新步骤。

  1. 从设备上删除您的应用程序。
  2. 完全closures设备并重新打开。
  3. 进入设置>常规>date和时间,并设置date提前一天或更多。
  4. 将设备再次完全closures,然后重新打开。

另一个testing解决scheme是通过简单地改变你的包ID。 一旦你完成,不要忘记把它改回来!

在iOS 9.0.2上,我每次删除应用程序并重新安装时都会收到“注册推送通知警报”。 对于AppStore生产下载和adhoc模式都是如此。

更新:确认这是适用于iOS 9.x

正如已经注意到的那样,在iOS5上更新设备上重置通知状态的方法。

这适用于我在iOS6上:

  • 从设备中删除应用程序
  • 设备date时间提前两天或更多
  • 重新启动设备
  • 设备date时间提前两天或更多
  • 重新启动设备
  • 再次安装并运行应用程序

但是,这只会使初始提示再次出现 – 它不会删除任何其他推状态相关的东西。

plist:/private/var/mobile/Library/RemoteNotification/Clients.plist

…包含推送通知的注册客户端。 删除您的应用程序的条目将导致提示重新出现

以编程方式执行似乎每次都适用于我。 我有一个build立与以下行未注释:

  [[UIApplication sharedApplication] unregisterForRemoteNotifications]; 

我每次想从PN取消注册时都运行它。 您可能必须从最近列表中明确地结束应用程序,并使用“设置”应用程序中的通知中心进行操作才能正确使用。

此外,要求用户注册PN的UI提示可能不会显示出来。 不确定是否在最近的iOS版本中被禁用。

正如ianolito所说,确定date应该是有效的:

您可以实现后者,而无需等待一天,方法是将系统时钟设置为一天或更长时间,完全closures设备,然后重新打开设备。

我注意到在我的设备(iPhone 4,iOS 6.1.2)设置系统时钟前一天甚至几天没有为我工作 。 所以我将date设置为一个月 ,然后确实工作,我的应用程序再次显示通知提示。

希望这有助于任何人,它可以是头痛!

我同意micmdk ..我有一个推送通知的开发环境设置,需要一种方法来重置我的手机看起来像一个初始安装…只有这些精确的步骤工作…我需要两个设备重新启动:

来自APPLE TECH DOC:

重置iOS上的推送通知权限警报当第一次启用推送的应用程序注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。 一旦用户对此警报作出响应,除非设备已恢复或应用程序已卸载至less一天,否则不会再次显示。

如果您想模拟首次运行您的应用,则可以将该应用卸载一天。 你可以通过以下步骤实现后者,而不需要等待一天:

  1. 从设备上删除您的应用程序。

  2. 完全closures设备并重新打开。

  3. 进入设置>常规>date和时间,并设置date提前一天或更多。

  4. 将设备再次完全closures,然后重新打开。

过去我一直在想这个,并得出结论,这对我的代码实际上并不是有效的testing用例。 我不认为你的应用程序代码实际上可以分辨出有人第一次拒绝通知,或者稍后将其从iPhone通知设置中禁用。 确实,用户体验不同,但隐藏在registerForRemoteNotificationTypes调用中。

调用unregisterForRemoteNotifications不会完全从通知设置中删除应用程序 – 尽pipe它会删除该应用程序设置的内容。 所以这仍然不会导致该对话在下一次应用程序运行时被第二次呈现给用户(至less不在我目前正在testing的v3.1.3上)。 但正如我上面所说,你可能不应该担心这一点。

在接受的答案( TN2265 – 推送通知疑难解答)中提到的技术说明已经更新为针对iOS 5及更高版本的解决scheme。

简而言之:每次创build一个备份和恢复。

在iOS 5及更高版本中,通过从备份还原设备(r。11450187)重置推送通知权限警报。 以下是有效执行此操作的步骤:

  1. 使用Xcode Organizer在设备上安装您的应用程序。 关键是第一次安装应用程序而不运行它。
  2. 使用iTunes备份设备。
  3. 运行应用程序。 将显示推送通知权限警报。
  4. 如果要重置推送通知权限警报,请从第一步中创build的备份恢复设备。

Apple技术说明还介绍了可以恢复设备以重置“推送通知”对话框。

并不是说你也可以在设备本身(iOS 5.x)上使用选项“常规 – >重置 – >清除所有内容和设置”。

除了ianolito的回答。

与我一年前下载的应用程序有同样的问题,最初拒绝推送通知。 现在想要推送通知,这些步骤适用于我在iOS 7testing版。 不确定哪个点(s)完全触发了它。

  • closures并删除应用程序。
  • 转到您的iCloud设置,并从iCloud中删除应用程序。 在启用了应用程序的iCloud备份的所有其他设备上执行此操作。 停用和删除后,重新创build一个备份。 应用程序不应该在备份下列出。 (这也许就是为什么由ianolito描述的苹果技术说明在iOS 5中停止工作,因为iCloud是在iOS 5中引入的,许多iCloud备份已启用。)
  • 去你的时间设置,并设置时间超过1个月。
  • closuresiPhone(不重置)。
  • 等一下,再次打开它并再次下载应用程序。
  • 启动应用程序,我又被提交了对话框。
  • 重新启用应用备份,因为它仍然处于停用状态。 纠正时间。

感谢上帝,我不必“删除所有内容和设置”。 也许它会帮助别人。

经过几个小时的search,并没有运气与上述build议,这就像一个3.x +的魅力

 override func viewDidLoad() { super.viewDidLoad() requestAuthorization() } func requestAuthorization() { if #available(iOS 10.0, *) { UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in print("Access granted: \(granted.description)") } } else { // Fallback on earlier versions } }