重置应用的推送通知设置


173

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

registerForRemoteNotificationTypes但是,对话框(由发起)在每个应用中仅出现一次。如何重置应用程序的iPhone OS内存。删除应用程序并重新安装没有帮助。

Answers:


300

技术说明TN2265:对推送通知进行故障排除

启用推送功能的应用程序首次注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。用户响应此警报后,除非恢复设备或将应用程序卸载至少一天,否则不会再次显示该警报。

如果要模拟应用程序的首次运行,可以将应用程序卸载一天。通过将系统时钟设置为一天或一天​​以上,完全关闭设备,然后重新打开设备,无需真正等待一天即可实现后者。

更新:如以下评论中所述,此解决方案自iOS 5.1起停止工作。我鼓励向Apple提交错误,以便他们可以更新其文档。当前的解决方案似乎是重置设备的内容和设置。

更新:技术说明已更新,并包含从iOS 7开始可以正常使用的新步骤。

  1. 从设备中删除您的应用。
  2. 完全关闭设备,然后重新打开。
  3. 转到设置>常规>日期和时间,然后将日期设置为一天或更早。
  4. 再次完全关闭设备,然后重新打开。

自iOS 9起更新

只需删除并重新安装该应用程序,即可将通知状态重置为notDetermined(表示出现提示)。

感谢以下Gomfucius的回答:https ://stackoverflow.com/a/33247900/704803


16
有没有人尝试过这个iOS 5.1?我完全按照这些步骤操作,但仍然无法使设备重设...我什至尝试通过Xcode安装Mac之前设置时钟。
nrj 2012年

1
同上...我没有得到提示。
罗布

2
苹果对AppStore提交指南添加了新要求,该要求依赖于应用程序来显示提示。这可能表明自动提示已在iOS 5.1中删除。但是,没有用于查询通知中心设置的API,因此无论如何都不确定提示的目的。看到我对类似问题的回复:stackoverflow.com/questions/10191006/…–
Greg

10
这是荒唐的。苹果公司是否没有意识到开发人员甚至用户可能希望能够在不使用真正不好的解决方法的情况下重置这些内容?
2014年

2
当我在模拟器中尝试此操作时,出现错误代码= 3010“模拟器中不支持远程通知”
Thomas Zimmer 2015年

48

另一个仅用于测试解决方案的方法是,只需更改您的bundle id。只是不要忘记在完成后将其更改回原来的状态!


12
您是否还需要为新的应用程序ID创建证书以进行测试?
托尼

1
仅当您使用基于通配符的供应配置文件时,此方法才有效-否则,您将需要为新捆绑包创建一个配置文件。
佐拉尔

即使您需要创建新的配置文件,也只需单击“修复”按钮并等待几秒钟,这比经历所有这些重新启动周期要快得多。
伊利亚2015年

这是最快的解决方案!对我来说效果很好!更改bundle_id时,您将无法使用相同的“配置文件”对应用程序进行签名。但是不用担心,在xCode(我的7.1.1版)中,您可以单击“修复”,它就可以完成工作。同样,不要忘了“功能” onglet,在这里您可以有几个要“修复”的项目(通过单击“修复”按钮),然后它将很好用!
Dam Fa

这个答案是一个合法的选择,但对于苹果公司的愚蠢情况,仍然是一个修补程序。我没有修改bundleID,也没有切换设备时钟。适当地,任何开发人员都可以编写一些简短的代码来显示要求“允许推送通知?”的UIAlertView。..是=调用register方法;否=调用didFailToRegisterForRemoteNotificationsWithError(etc)..这是我自己的解决方案,我在阅读完此问答后将自己摘录下来。从技术上讲,这是使用户了解隐私信息的最佳方法...为什么必须启用或可选推送。
汤姆·佩斯

36

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

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


1
对于iOS 9.x,我会遇到相同的行为。我建议您通过添加更新
Yevhen Dubinin

3
最后!不再需要删除应用程序,关闭设备,将时钟设置为正向时间以及诸如此类的愚蠢的东西。
mkeremkeskin 2015年

19

如前所述,对于iOS5或更高版本,用于重置设备上应用程序的通知状态的方法已更改。

这对我在iOS6上有效:

  • 从设备上删除应用
  • 将设备日期时间提前两天或更长时间
  • 重启设备
  • 将设备日期时间提前两天或更长时间
  • 重启设备
  • 重新安装并运行该应用

但是,这只会使初始提示再次出现-不会删除任何其他与推送状态相关的内容。


在ios7上也为我工作过,您必须两次更改日期,一次却不起作用
2013年

1
谢谢!这甚至可以在iOS 8上运行(我必须重置Twitter.app的推送权限,因为它在“设置”的“首选项”窗格中没有“应用程序图标标志”设置)。
gklka 2014年

9

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

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


11
如果您是为App Store开发的,
则无

20
如果这对于越狱者来说是可能的,那么开发人员应该可以在不越狱的手机上进行操作,对吗?这不是一个无用的答案,因为这不是您要放入应用程序中以提交到商店的内容。供开发人员进行WHILE TESTING。
奥斯卡

1
该文件不是iOS 5.x的一部分。
gmogames 2012年

看到更新后的答案作为该问题的一部分:stackoverflow.com/questions/13021066/…–
AriX

7

以编程方式执行此操作似乎每次都对我有用。我有一个未注释以下行的构建:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

每当我想从PN注销时,我都会运行它。您可能必须从“最新消息”列表中明确结束该应用程序,然后在“设置”应用程序中使用“通知中心”进行操作以使其正确。

同样,要求用户注册PN的UI提示也可能不会出现。不知道在任何最新的iOS版本中是否已禁用。


为我工作iOS 10 / iPhone 6S。请注意,我先取消注册,然后再删除应用程序,然后再重新安装。
加布里埃尔·詹森

5

正如ianolito所说,设置日期应该可以:

通过将系统时钟设置为一天或一天​​以上,完全关闭设备,然后重新打开设备,无需真正等待一天即可实现后者。

我注意到在我的设备(iPhone 4,iOS 6.1.2)上,将系统时钟设置为每天或什至几天都不适合我。因此,我将日期设置为一个月,然后它生效了,我的应用程序再次显示了通知提示。

希望这对任何人都有帮助,可能有点头疼!


1
请不要回答“最新操作系统”,它一直在变化。这种行为在6.1.2中似乎仍然无效,但也许在6.0.1中有效吗?
patr1ck

编辑了答案,也是在6.1.2是和6.0.1之前都有。仅当我至少将日期设置为+1个月时,它才对我有用。
文森特·科恩

1
我也听说过24小时的事,所以尝试了一下,但提前2天就没用。从现在开始将其设置为大约3个月,然后再次出现权限弹出窗口!谢谢!
marcshilling

旧帖子,但很高兴看到它仍然有帮助!祝您好运:)
Vincent Cohen

5

我同意micmdk的要求。我使用Push Notifications进行了开发环境设置,并且需要一种方法来重置手机,使其看起来像是初始安装……并且只有这些精确的步骤对我有用……需要重启设备两次:

从APPLE TECH DOC:

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

如果要模拟应用程序的首次运行,可以将应用程序卸载一天。通过执行以下步骤,您可以在无需实际等待一天的情况下实现后者:

  1. 从设备中删除您的应用。

  2. 完全关闭设备,然后重新打开。

  3. 转到设置>常规>日期和时间,然后将日期设置为一天或更早。

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


已经提到这已不再适用于其他答案。
新样式2015年

它工作正常。在iOS 5.1中停止工作的是该其他答案的版本,该版本在删除应用程序和设置时钟之前没有进行重启。
dgatwood

3

我过去对此一直感到疑惑,并得出结论,它实际上不是我的代码的有效测试用例。我认为您的应用程序代码实际上无法分辨出有人拒绝通知还是第一次从iPhone通知设置禁用通知之间的区别。的确,用户体验是不同的,但这隐藏在对registerForRemoteNotificationTypes的调用中。

调用unregisterForRemoteNotifications并不会从通知设置中完全删除该应用程序,尽管会删除该应用程序的设置内容。因此,这仍然不会导致对话框在下次运行该应用程序时再次显示给用户(至少不是在我目前正在测试的v3.1.3上)。但是正如我在上面说的那样,您可能不必为此担心。


我一直希望有一个更好的答案,但我猜只是没有答案。不管怎么说,还是要谢谢你!
hanno 2010年

3

此后,已使用适用于iOS 5及更高版本的解决方案更新了已接受的答案(TN2265-推送通知疑难解答)中引用的同一技术说明。

简而言之:每次创建一个备份并从中还原。

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

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

它可能一次建议这样做,但现在不再建议这样做。当前的建议是删除应用程序,重新启动,设置时钟为正,重新启动,可以选择将时钟设置为正确的日期和时间,然后运行应用程序。
dgatwood

2

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

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


1
对于它的价值:我只是尝试“擦除所有设置”,但这没有用。尝试所有内容和所有设置...
Groxx 2012年

8
而且“所有内容和设置”确实有效,谢谢!但是,神圣的核选择,蝙蝠侠!太疯狂了
Groxx 2012年

94
我听说购买新设备也会清除推送通知警告!
samvermette 2012年

我尝试购买新设备,但这也没有用。将新设备带到天才酒吧之后,他们做了一些魔术,并花了更多钱修理了我。。。令我惊讶的是,这么多年后,Apple仍未提供一种实用且简单的方法来重置推送权限。这太荒谬了
克里斯(Chris)

1

除了ianolito的答案。

我一年前下载的某个应用遇到了同样的问题,最初拒绝了推送通知。现在想要向后推送通知,这些步骤对我适用于iOS 7 beta。不知道是哪一点触发了它。

  • 关闭并删除该应用。
  • 转到您的iCloud设置,然后从iCloud中删除该应用程序。在为应用程序启用了iCloud备份的所有其他设备上执行此操作。停用并删除后,进行全新备份。该应用程序不应再在备份中列出。(这也许就是为什么ianolito描述的Apple技术说明停止在iOS 5中工作的原因,因为iCloud是在iOS 5中引入的,并且许多人都为应用程序启用了iCloud备份。)
  • 转到您的时间设置,并将时间设置为提前1个月以上。
  • 关闭iPhone(不重设)。
  • 等待一分钟,再次打开它,然后再次下载该应用程序。
  • 启动应用程序,然后再次向我显示对话框。
  • 重新启用应用程序备份,因为它仍处于停用状态。更正时间。

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


1

我最近在本机应用程序中遇到了类似的问题。iPhone OS版本为13.1,我卸载了该应用程序并尝试安装该应用程序,并发现未提示位置和通知权限。

在检查设置时,我可以看到我的应用程序已启用位置(来自以前的安装),但是没有相应通知,通知未尝试卸载并重新启动但未设置时间,但它不起作用。顺便说一句,我也试图下载Appstore应用,仍然是相同的行为。

仅在设置设备时间后才能解决此问题。


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
        }

    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.