我正在使用推送通知开发应用。要检查所有可能的用户交互方式,我想在用户拒绝在第一次启动时为我的应用启用推送通知时测试我的应用。
然而,对话框(由registerForRemoteNotificationTypes
启动)每个应用只出现一次。如何重置iPhone OS的应用程序内存。删除应用程序并重新安装没有帮助。
答案 0 :(得分:297)
Technical Note TN2265: Troubleshooting Push Notifications
第一次启用推送的应用 注册推送通知,iOS 询问用户是否希望收到 该应用的通知。一旦 用户已响应此警报 除非设备,否则不会再次出现 恢复或应用程序已经恢复 卸载至少一天。
如果你想第一次模拟 运行你的应用程序,你可以离开应用程序 卸载了一天。 你可以实现 后者没有真正等待 通过设置系统时钟的一天 转发一天或更长时间 设备完全关闭,然后转动 设备重新开启。
更新:如下面的评论中所述,此解决方案自iOS 5.1起停止工作。我鼓励向Apple提交一个错误,以便他们可以更新他们的文档。目前的解决方案似乎是重置设备的内容和设置。
更新:技术说明已更新,其中的新步骤在iOS 7中正常运行。
- 从设备中删除您的应用。
- 完全关闭设备并重新打开。
- 转到设置>一般>日期&时间并将日期设定为一天或更长时间。
- 再次完全关闭设备并重新打开。
醇>
自iOS 9起更新
只需删除并重新安装应用即可将通知状态重置为notDetermined
(意味着会出现提示)。
感谢Gomfucius的答案如下: https://stackoverflow.com/a/33247900/704803
答案 1 :(得分:47)
另一个仅用于测试解决方案,只需更改您的包ID即可。一旦你完成,别忘了把它改回来!
答案 2 :(得分:35)
在iOS 9.0.2上,每次删除应用程序并重新安装时,我都会收到“注册推送通知提醒”。这适用于AppStore生产下载和adhoc模式。
更新:确认这适用于iOS 9.x
答案 3 :(得分:19)
如前所述,重置iOS5设备上应用的通知状态的方法已针对iOS5进行了更新。
这适用于iOS6:
然而,这只会使初始提示再次出现 - 它不会删除任何其他推送状态相关的东西。
答案 4 :(得分:9)
plist: /private/var/mobile/Library/RemoteNotification/Clients.plist
...包含推送通知的注册客户端。删除应用的条目将导致提示重新出现
答案 5 :(得分:7)
以编程方式执行它似乎每次都适合我。 我有一个没有注释的以下行的构建:
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
每次我想从PN取消注册时都会运行它。您可能必须从最近列表中明确地结束应用,并使用“设置”应用中的“通知中心”来正确使用该应用。
此外,要求用户注册PN的UI提示可能不会显示。不确定是否已在最近的任何iOS版本中禁用。
答案 6 :(得分:5)
正如ianolito所说,设定日期应该有效:
通过将系统时钟向前设置一天或更长时间,完全关闭设备,然后重新打开设备,您可以在不实际等待一天的情况下实现后者。
我注意到我的设备(iPhone 4,iOS 6.1.2)为我设置了系统时钟前一天甚至几天不起作用。所以我将日期设置为一个月,然后它确实有效,我的应用程序再次显示通知提示。
希望这对任何人都有帮助,它可能有点头痛!
答案 7 :(得分:5)
我同意micmdk ..我有一个推送通知的开发环境设置,需要一种方法来重置我的手机看起来像一个初始安装......只有这些精确的步骤适合我...需要重新启动设备:
来自APPLE TECH DOC:
重置iOS上的推送通知权限警报 第一次启用推送的应用程序注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。一旦用户响应此警报,除非设备已恢复或应用程序已卸载至少一天,否则不会再次显示该警报。
如果您想模拟首次运行的应用,可以将应用程序卸载一天。您可以通过以下步骤实现后者而无需等待一天:
从设备中删除您的应用。
完全关闭设备并重新打开。
转到设置>一般>日期&时间并将日期设定为一天或更长时间。
再次完全关闭设备并重新打开。
答案 8 :(得分:3)
我在过去对此有所疑惑并得出结论,它实际上并不是我的代码的有效测试用例。我不认为您的应用程序代码实际上可以区分第一次拒绝通知或稍后从iPhone通知设置禁用通知的人之间的区别。确实,用户体验不同,但隐藏在对registerForRemoteNotificationTypes的调用中。
调用unregisterForRemoteNotifications并未从通知设置中完全删除应用程序 - 尽管它确实删除了该应用程序的设置内容。所以这仍然不会导致在下次应用程序运行时第二次向用户显示对话框(至少在我目前正在测试的v3.1.3上没有)。但正如我上面所说,你可能不应该担心这一点。
答案 9 :(得分:3)
在接受的答案中提到的相同技术说明(TN2265 - Troubleshooting Push Notifications)已经更新了iOS 5及更高版本的解决方案。
简而言之:每次创建备份并从中恢复。
在iOS 5及更高版本中,通过从备份恢复设备来重置推送通知权限警报(r.11450187)。以下是有效执行此操作的步骤:
- 使用Xcode Organizer在设备上安装您的应用。关键是首次安装应用程序而不运行它。
- 使用iTunes备份设备。
- 运行该应用。将显示推送通知权限警报。
- 如果要重置推送通知权限警报,请从您在第一步中创建的备份中恢复设备。
醇>
答案 10 :(得分:2)
Apple Tech Note还描述了您可以恢复设备以重置推送通知对话框。
并未说明您还可以在设备本身(iOS 5.x)上使用“常规 - >重置 - >删除所有内容和设置”选项。
答案 11 :(得分:1)
除了ianolito的答案。
与我一年前下载的应用程序存在同样的问题并且最初拒绝推送通知。现在想要回推推送通知,这些步骤适用于iOS 7测试版。不确定哪个点完全触发了它。
感谢上帝,我没有“删除所有内容和设置”。也许它会帮助别人。
答案 12 :(得分:1)
我最近在本机应用程序中遇到了类似的问题。 iPhone OS版本为13.1,我卸载了该应用程序并尝试安装该应用程序,并发现未提示位置和通知权限。
在检查设置后,我可以看到我的应用程序已启用位置(来自先前的安装),但是没有相应的通知,通知未尝试卸载并重新启动而未设置时间,但它不起作用。顺便说一句,我也试图下载Appstore应用,仍然是相同的行为。
仅在设置设备时间后,该问题才能解决。
答案 13 :(得分:0)
经过几个小时的搜索,上面的建议没有运气,这就像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
}
}