Answers:
启用推送功能的应用程序首次注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。用户响应此警报后,除非恢复设备或将应用程序卸载至少一天,否则不会再次显示该警报。
如果要模拟应用程序的首次运行,可以将应用程序卸载一天。通过将系统时钟设置为一天或一天以上,完全关闭设备,然后重新打开设备,无需真正等待一天即可实现后者。
更新:如以下评论中所述,此解决方案自iOS 5.1起停止工作。我鼓励向Apple提交错误,以便他们可以更新其文档。当前的解决方案似乎是重置设备的内容和设置。
更新:技术说明已更新,并包含从iOS 7开始可以正常使用的新步骤。
- 从设备中删除您的应用。
- 完全关闭设备,然后重新打开。
- 转到设置>常规>日期和时间,然后将日期设置为一天或更早。
- 再次完全关闭设备,然后重新打开。
自iOS 9起更新
只需删除并重新安装该应用程序,即可将通知状态重置为notDetermined
(表示出现提示)。
感谢以下Gomfucius的回答:https ://stackoverflow.com/a/33247900/704803
另一个仅用于测试解决方案的方法是,只需更改您的bundle id。只是不要忘记在完成后将其更改回原来的状态!
在iOS 9.0.2上,每次删除并重新安装应用程序时,都会收到“注册推送通知警报”。对于AppStore生产下载和临时模式都是如此。
更新:确认这适用于iOS 9.x
如前所述,对于iOS5或更高版本,用于重置设备上应用程序的通知状态的方法已更改。
这对我在iOS6上有效:
但是,这只会使初始提示再次出现-不会删除任何其他与推送状态相关的内容。
plist:/private/var/mobile/Library/RemoteNotification/Clients.plist
...包含注册的推送通知客户端。删除您的应用程序条目将导致提示重新出现
以编程方式执行此操作似乎每次都对我有用。我有一个未注释以下行的构建:
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
每当我想从PN注销时,我都会运行它。您可能必须从“最新消息”列表中明确结束该应用程序,然后在“设置”应用程序中使用“通知中心”进行操作以使其正确。
同样,要求用户注册PN的UI提示也可能不会出现。不知道在任何最新的iOS版本中是否已禁用。
正如ianolito所说,设置日期应该可以:
通过将系统时钟设置为一天或一天以上,完全关闭设备,然后重新打开设备,无需真正等待一天即可实现后者。
我注意到在我的设备(iPhone 4,iOS 6.1.2)上,将系统时钟设置为每天或什至几天都不适合我。因此,我将日期设置为一个月,然后它生效了,我的应用程序再次显示了通知提示。
希望这对任何人都有帮助,可能有点头疼!
我同意micmdk的要求。我使用Push Notifications进行了开发环境设置,并且需要一种方法来重置手机,使其看起来像是初始安装……并且只有这些精确的步骤对我有用……需要重启设备两次:
从APPLE TECH DOC:
在iOS上重置推送通知权限警报首次启用推送的应用程序注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。用户响应此警报后,除非恢复设备或将应用程序卸载至少一天,否则不会再次显示该警报。
如果要模拟应用程序的首次运行,可以将应用程序卸载一天。通过执行以下步骤,您可以在无需实际等待一天的情况下实现后者:
从设备中删除您的应用。
完全关闭设备,然后重新打开。
转到设置>常规>日期和时间,然后将日期设置为一天或更早。
再次完全关闭设备,然后重新打开。
我过去对此一直感到疑惑,并得出结论,它实际上不是我的代码的有效测试用例。我认为您的应用程序代码实际上无法分辨出有人拒绝通知还是第一次从iPhone通知设置禁用通知之间的区别。的确,用户体验是不同的,但这隐藏在对registerForRemoteNotificationTypes的调用中。
调用unregisterForRemoteNotifications并不会从通知设置中完全删除该应用程序,尽管会删除该应用程序的设置内容。因此,这仍然不会导致对话框在下次运行该应用程序时再次显示给用户(至少不是在我目前正在测试的v3.1.3上)。但是正如我在上面说的那样,您可能不必为此担心。
此后,已使用适用于iOS 5及更高版本的解决方案更新了已接受的答案(TN2265-推送通知疑难解答)中引用的同一技术说明。
简而言之:每次创建一个备份并从中还原。
在iOS 5及更高版本上,通过从备份还原设备来重置推送通知权限警报(r。11450187)。以下是有效执行此操作的步骤:
- 使用Xcode Organizer在设备上安装您的应用程序。关键是第一次安装该应用程序而不运行它。
- 使用iTunes备份设备。
- 运行应用程序。将显示推送通知权限警报。
- 当您要重置推送通知权限警报时,请从您在第一步中创建的备份中还原设备。
Apple技术说明还介绍了您可以还原设备以重置“推送通知”对话框。
这并不是说您还可以在设备本身(iOS 5.x)上使用选项“常规->重置->删除所有内容和设置”。
除了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
}
}