我正在开发一个有推送通知功能的应用程序。为了检查所有可能的用户交互方式,当用户在第一次启动时拒绝为我的应用程序启用推送通知时,我想测试我的应用程序。
然而,对话框(由 registerForRemoteNotificationTypes发起)在每个应用程序中只出现一次。如何重置应用程序的 iPhone 操作系统内存。删除应用程序并重新安装不会有任何帮助。
registerForRemoteNotificationTypes
过去我一直在思考这个问题,并得出结论: 对于我的代码来说,这实际上不是一个有效的测试用例。我不认为你的应用程序代码能够真正区分一个人是第一次拒绝通知还是后来从 iPhone 通知设置中禁用通知。的确,用户体验是不同的,但是它隐藏在对 registerForRemoteNotificationTypes 的调用中。
调用 unregisterForRemoteNotification 并不会从通知设置中完全删除应用程序——尽管它确实会删除该应用程序的设置内容。因此,这仍然不会导致在下次应用程序运行时第二次向用户显示对话框(至少不会在我目前正在测试的3.1.3版本上显示)。但正如我上面所说,你可能不应该担心这一点。
清单: /private/var/mobile/Library/RemoteNotification/Clients.plist
... 包含用于推送通知的注册客户端。删除应用程序的条目将导致提示重新出现
技术说明 TN2265: 推送通知故障排除
第一次启用推送功能的应用程序 推送通知寄存器,iOS 询问用户是否希望接收 应用程序的通知 用户已经响应了这个警报 除非设备 恢复或者应用程序已经 至少卸载一天。 如果你想模拟第一次 运行你的应用程序,你可以离开应用程序 卸载一天。 你可以实现 后者实际上没有等待 通过设置系统时钟 提前一天或更长时间,将 装置完全关闭,然后转动 设备重新启动
第一次启用推送功能的应用程序 推送通知寄存器,iOS 询问用户是否希望接收 应用程序的通知 用户已经响应了这个警报 除非设备 恢复或者应用程序已经 至少卸载一天。
如果你想模拟第一次 运行你的应用程序,你可以离开应用程序 卸载一天。 你可以实现 后者实际上没有等待 通过设置系统时钟 提前一天或更长时间,将 装置完全关闭,然后转动 设备重新启动
更新: 正如下面的评论中提到的,这个解决方案从 iOS 5.1开始就停止工作了。我鼓励苹果公司提交一个 bug,这样他们就可以更新他们的文档了。当前的解决方案似乎是重置设备的内容和设置。
更新: 技术说明已经更新了新的步骤,可以正常工作到 iOS7。
从设备中删除你的应用程序。 把设备完全关掉,然后再打开。 进入设置 > 一般 > 日期及时间,并将日期提前一天或以上。 把设备完全关掉,然后再打开。
更新 iOS9
只需删除和重新安装应用程序将重置通知状态为 notDetermined(意味着提示将出现)。
notDetermined
感谢 Gomfuius 的回答: Https://stackoverflow.com/a/33247900/704803
苹果技术说明也描述了你可以恢复设备来重置推送通知对话框。
它并没有说你也可以在设备本身(iOS 5.x)上使用“一般-> 重置-> 擦除所有内容和设置”选项。
正如 ianolito 所说,设定日期应该有效:
你可以实现后者而不需要等待一天,通过设置系统时钟向前一天或更多,完全关闭设备,然后打开设备回来。
我注意到我的设备(iPhone4,iOS6.1.2)为我设置了系统时钟 提前一天甚至几天都不行。因此,我设置日期前进 一个月,然后它的工作,我的应用程序显示通知提示再次。
希望这对任何人都有帮助,它可以是一种头痛!
以编程的方式做似乎每次都对我有用。 我有一个没有注释的版本:
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
我每次想从 PN 注销时都会运行它。您可能必须从最近的列表中显式结束应用程序,并在设置应用程序中使用通知中心来获得正确的结果。
此外,要求用户注册 PN 的 UI 提示可能不会显示。不确定是否在最近的 iOS 版本中禁用了。
另一个 只是为了测试解决方案是简单地更改绑定包 id。做完后别忘了换回来!
同样的技术说明提到了在接受的答案(TN2265-推送通知故障排除)已经被更新为 iOS5及以上的解决方案。
简而言之: 每次都创建一个备份并从中恢复。
在 iOS5和更高版本中,通过从备份中还原设备来重置推送通知权限警报(r. 11450187)。下面是有效地做到这一点的步骤: 使用 Xcode Organizer 在设备上安装应用程序。关键是第一次安装应用程序时不要运行它。 使用 iTunes 备份设备。 运行应用程序。将显示推送通知权限警报。 如果要重置推送通知权限警报,请从在第一步中创建的备份中还原设备。
在 iOS5和更高版本中,通过从备份中还原设备来重置推送通知权限警报(r. 11450187)。下面是有效地做到这一点的步骤:
除了 ianolito 的答案。
我一年前下载的一个应用程序也有同样的问题,最初拒绝了推送通知。现在想要推送通知,这些步骤对我的 iOS7测试版很管用。不确定具体是哪一点触发的。
谢天谢地,我没有“删除所有的内容和设置”。也许它会有所帮助的人。
正如已经指出的,为设备上的应用程序重置通知状态的方法在 iOS5中更新了。
这对我在 iOS6上很有用:
然而,这只会使初始提示再次出现-它不会删除任何其他推状态相关的东西。
我同意 Micmdk。.我有一个开发环境设置与推送通知,需要一种方法来重置我的手机看起来像一个初始安装... 只有这些精确的步骤为我工作... 需要两个设备重新启动:
来自苹果技术博士:
重置 iOS 上的推送通知权限警报 当一个支持推送的应用程序第一次注册推送通知时,iOS 会询问用户是否希望接收该应用程序的通知。一旦用户响应了这个警报,除非设备恢复或应用程序已经卸载至少一天,否则它不会再次出现。
如果你想模拟应用程序的第一次运行,你可以让应用程序卸载一天。通过以下步骤,你不用等上一天就可以实现后者:
从设备中删除你的应用程序。
把设备完全关掉,然后再打开。
进入设置 > 一般 > 日期及时间,并将日期提前一天或以上。
在 iOS9.0.2上,每次删除并重新安装应用程序时,我都会收到“注册推送通知警报”。对于 AppStore 生产下载和 adhoc 模式来说都是如此。
更新: 已经证实,这个操作系统适用于 iOS9. x
经过几个小时的搜索,没有运气与上面的建议,这工作就像一个魅力为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 } }
我最近在本地应用程序中遇到了类似的问题。IPhone OS 版本是13.1我卸载了应用程序并试图安装应用程序,注意到位置和通知权限都没有提示。
在检查设置,我可以看到我的应用程序启用了位置(从以前的安装) ,但没有相应的条目对通知尝试卸载和重新启动没有设置时间,它不工作。顺便说一下,我也试着下载 Appstore 应用程序,仍然是同样的行为。
只有在设置设备时间之后,问题才得到解决。