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