代码之家  ›  专栏  ›  技术社区  ›  hanno

重置应用程序的推送通知设置

  •  167
  • hanno  · 技术社区  · 16 年前

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

    对话框(由 registerForRemoteNotificationTypes 但是,每个应用程序只显示一次。如何重置iPhone操作系统的应用程序内存。删除应用并重新安装没有帮助。

    13 回复  |  直到 8 年前
        1
  •  297
  •   andrewtweber    8 年前

    Technical Note TN2265: Troubleshooting Push Notifications

    第一次推送应用程序 推送通知寄存器,iOS 询问用户是否希望接收 该应用程序的通知。一旦 用户已对此警报做出响应,它是 除非设备 已还原或应用程序已 已卸载至少一天。

    如果你想第一次模拟 运行你的应用程序,你可以离开应用程序 卸载一天。 你可以做到 后者没有实际等待 设置系统时钟的日期 向前走一天或更多,将 设备完全关闭,然后关闭 设备重新启动。

    更新: 正如下面的评论中所指出的,此解决方案自iOS 5.1之后停止工作。我鼓励向苹果提交一个bug,以便他们更新文档。当前的解决方案似乎正在重置设备的内容和设置。

    更新: 技术说明已更新为从iOS 7起正常工作的新步骤。

    1. 从设备中删除应用程序。
    2. 完全关闭设备并重新打开。
    3. 转到“设置”>“常规”>“日期和时间”,并将日期提前一天或更多。
    4. 再次完全关闭设备并重新打开。

    从iOS 9开始更新

    简单地删除并重新安装应用程序将通知状态重置为 notDetermined (将出现提示)。

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

        2
  •  47
  •   capikaw    13 年前

    另一个 只是为了测试 解决这个问题的方法就是简单地更改您的包ID。只要别忘了在完成后再更改它!

        3
  •  35
  •   Genki    10 年前

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

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

        4
  •  19
  •   micmdk    13 年前

    如前所述,重置设备上应用程序的通知状态的方法已针对iOS5更新版本进行了更改。

    这对我来说很有用6:

    • 从设备中删除应用程序
    • 提前两天或两天以上设置设备日期时间
    • 重新启动设备
    • 提前两天或两天以上设置设备日期时间
    • 重新启动设备
    • 重新安装并运行应用程序

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

        5
  •  9
  •   Erik Johnson    16 年前

    上流社会: /private/var/mobile/library/remotenotification/clients.plist

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

        6
  •  7
  •   dagnytaggart    13 年前

    以编程的方式进行似乎每次都对我有用。 我有一个未注释以下行的生成:

     [[UIApplication sharedApplication] unregisterForRemoteNotifications];
    

    每次我想从PN注销时都会运行它。您可能需要从Recents列表中显式结束应用程序,并在设置应用程序中与通知中心一起玩,以使其正确。

    此外,用户界面提示要求用户注册PN可能不会出现。不确定是否在任何最新的iOS版本中被禁用。

        7
  •  5
  •   Vincent Cohen    13 年前

    正如伊诺里托所说,设定日期应该有效:

    您可以在不等待一天的情况下实现后者,方法是将系统时钟向前拨一天或更长时间,完全关闭设备,然后重新打开设备。

    我注意到在我的设备(iPhone4,iOS 6.1.2)上设置系统时钟 前一天甚至几天都不行 为了我。所以我把日期提前了 一个月 然后它开始工作,我的应用程序再次显示了通知提示。

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

        8
  •  5
  •   lepert    12 年前

    我同意Micmdk的观点。我有一个带有推送通知的开发环境设置,需要一种方法来重置我的手机,使其看起来像是初始安装,只有这些精确的步骤对我有效,需要重新启动两次设备:

    来自Apple Tech Doc:

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

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

    1. 从设备中删除应用程序。

    2. 完全关闭设备并重新打开。

    3. 转到“设置”>“常规”>“日期和时间”,并将日期提前一天或更多。

    4. 再次完全关闭设备并重新打开。

        9
  •  3
  •   kharrison    16 年前

    在过去,我一直在想这个问题,并得出结论,对于我的代码来说,它实际上不是一个有效的测试用例。我不认为你的应用程序代码能真正分辨出有人在第一次拒绝通知或以后在iPhone通知设置中禁用通知。用户体验确实不同,但它隐藏在对registerforremotenotificationtypes的调用中。

    调用UnregisterForRemoteNotifications并不能从通知设置中完全删除应用程序-尽管它确实删除了该应用程序设置的内容。因此,这仍然不会导致下次应用程序运行时(至少在我当前测试的v3.1.3版本上)再次向用户显示对话框。但正如我上面所说,你可能不应该担心这一点。

        10
  •  3
  •   David Rönnqvist    13 年前

    接受答案中引用的相同技术说明( TN2265 - Troubleshooting Push Notifications) 已使用iOS 5及更高版本的解决方案进行了更新。

    简而言之:每次创建备份并从中恢复。

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

    1. 使用xcode管理器在设备上安装应用程序。关键是第一次安装应用程序而不运行它。
    2. 使用iTunes备份设备。
    3. 运行应用程序。将显示推送通知权限警报。
    4. 如果要重置推送通知权限警报,请从第一步中创建的备份还原设备。
        11
  •  2
  •   hotdogsoup.nl    14 年前

    Apple Tech Note还介绍了您可以恢复设备以重置推送通知对话框。

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

        12
  •  1
  •   Masa    13 年前

    除了伊诺里托的回答。

    我一年前下载的一个应用程序也出现了同样的问题,一开始拒绝推送通知。现在想要回推通知,这些步骤在iOS7测试版上对我很有效。不确定是哪个点触发了它。

    • 关闭并删除应用程序。
    • 转到您的iCloud设置并从iCloud中删除应用程序。在所有其他启用iCloud应用备份的设备上执行此操作。停用和删除后,重新备份。应用程序不应再列在备份下。(这可能就是为什么iOlito所描述的苹果公司的技术说明在iOS 5中停止工作的原因,因为iCloud是在iOS 5中引入的,而且许多应用程序都启用了iCloud备份。)
    • 转到时间设置,并将时间设置为超过1个月。
    • 关闭iPhone(不重置)。
    • 请稍等,再次打开并再次下载应用程序。
    • 启动应用程序,我再次看到对话框。
    • 再次启用应用程序备份,因为它仍然处于停用状态。更正时间。

    感谢上帝,我不必“删除所有内容和设置”。也许它能帮助别人。

        13
  •  0
  •   Felecia Genet    9 年前

    经过数小时的搜索,对上面的建议没有把握,这对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
            }
    
        }