【问题标题】:Reset push notification settings for app重置应用的推送通知设置
【发布时间】:2011-01-27 03:50:48
【问题描述】:

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

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

【问题讨论】:

    标签: iphone push-notification


    【解决方案1】:

    Technical Note TN2265: Troubleshooting Push Notifications

    第一次支持推送的应用 注册推送通知,iOS 询问用户是否希望收到 该应用程序的通知。一旦 用户已响应此警报 不会再次出现,除非设备 已恢复或应用程序已 至少卸载了一天。

    如果您想模拟第一次 运行您的应用程序,您可以离开该应用程序 卸载了一天。 您可以实现 后者实际上没有等待 天通过设置系统时钟 前进一天或更长时间,转动 设备完全关闭,然后转动 设备重新开启。

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

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

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

    从 iOS 9 开始更新

    只需删除并重新安装应用程序,就会将通知状态重置为notDetermined(意思是会出现提示)。

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

    【讨论】:

    • 有没有人用 iOS 5.1 试过这个?我完全按照这些步骤操作,但我仍然无法让设备重置它...我什至尝试在通过 Xcode 安装之前将我的 Mac 上的时钟设置为正向。
    • 同上...我没有得到提示。
    • Apple 在 AppStore 提交指南中添加了一项新要求,该要求依赖于应用程序来显示提示。这可能表明自动提示已在 iOS 5.1 中删除。但是,没有 API 可以查询通知中心设置,因此不确定提示的目的是什么。请参阅我对类似问题的回复:stackoverflow.com/questions/10191006/…
    • 这太荒谬了。 Apple 是否没有意识到开发人员甚至用户可能希望能够在不使用非常糟糕的解决方法的情况下重置这些东西?
    • 当我在模拟器中尝试此操作时,我收到错误代码=3010“模拟器不支持远程通知”
    【解决方案2】:

    另一个仅用于测试的解决方案是简单地更改您的捆绑包ID。完成后别忘了改回来!

    【讨论】:

    • 您是否还需要为新的应用 ID 创建证书才能对其进行测试?
    • 这仅在您使用基于通配符的配置文件时才有效 - 否则,您需要为新捆绑包创建配置文件。
    • 即使您需要创建新的配置文件,也只需单击“修复”按钮并等待几秒钟 - 比完成所有这些重启周期要快得多。
    • 这是最快的解决方案!它对我来说效果很好!更改 bundle_id 时,您将无法使用相同的“配置文件”为应用程序签名。但别担心,在 xCode(我的版本 7.1.1)中,您可以单击“修复它”,它就可以完成这项工作。同样,不要忘记“功能”onglet,您可以在其中“修复”多个项目(通过单击“修复”按钮),然后它会运行得很好!
    • 这个答案是一个合法的选择,但对于 Apple 的愚蠢情况仍然是一个黑客修复。我没有修改 bundleID,也没有切换设备时钟。恰如其分,任何开发人员都可以编写一些短代码,显示一个询问“允许推送通知?”的 UIAlertView。 .. 是 = 调用注册方法;否 = 调用 didFailToRegisterForRemoteNotificationsWithError (等).. 这是我自己的解决方案,阅读此问答后我的收获。从技术上讲,这是让用户了解隐私信息的最佳方式...为什么必须启用或可选推送。
    【解决方案3】:

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

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

    【讨论】:

    • 我在 iOS 9.x 中遇到了相同的行为。我建议您通过添加 UPDATE: 来编辑原始答案
    • 终于!不再需要删除应用程序、关闭设备、将时钟设置为向前时间以及诸如此类的一些愚蠢的事情。
    【解决方案4】:

    如前所述,为设备上的应用重置通知状态的方法在 iOS5 更新版本中有所更改。

    这适用于我在 iOS6 上:

    • 从设备中删除应用程序
    • 提前两天或更早设置设备日期时间
    • 重启设备
    • 提前两天或更早设置设备日期时间
    • 重启设备
    • 再次安装并运行应用程序

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

    【讨论】:

    • 在 ios7 上也为我工作,你必须更改两次日期一次不起作用
    • 谢谢!这甚至适用于 iOS 8(我不得不重置 Twitter.app 的推送权限,因为它在“设置”的首选项窗格中没有“应用程序图标徽章”设置)。
    【解决方案5】:

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

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

    【讨论】:

    • 为 App Store 开发的无用答案
    • 如果越狱者可以做到这一点,那么开发人员应该可以在未越狱的手机上进行操作,对吧?这不是一个无用的答案,因为这不是您将其放入应用程序以提交到商店的东西。开发人员可以在测试时进行。
    • 此文件不是 iOS 5.x 的一部分。
    • 在此问题中查看更新的答案:stackoverflow.com/questions/13021066/…
    【解决方案6】:

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

     [[UIApplication sharedApplication] unregisterForRemoteNotifications];
    

    我每次想从 PN 注销时都会运行它。您可能必须明确地从最近列表中结束该应用,然后在“设置”应用中使用“通知中心”才能正确设置。

    另外,要求用户注册 PN 的 UI 提示可能不会出现。不确定是否已在任何最近的 iOS 版本中禁用。

    【讨论】:

    • 为我工作 iOS 10 / iPhone 6S。请注意,我在重新安装之前取消了注册,然后删除了应用程序。
    【解决方案7】:

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

    您可以通过将系统时钟提前一天或更长时间,完全关闭设备,然后重新打开设备来实现后者,而无需实际等待一天。

    我注意到在我的设备(iPhone 4、iOS 6.1.2)上设置系统时钟提前一天甚至几天都不起作用。所以我将日期提前一个月,然后它确实起作用了,我的应用程序再次显示通知提示。

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

    【讨论】:

    • 请不要回答“最新的操作系统”——它一直在变化。这种行为在 6.1.2 中似乎仍然存在问题,但也许它在 6.0.1 中有效?
    • 编辑了答案,在 6.1.2 中仍然有这个,是的,在 6.0.1 之前也有。仅当我至少将日期设置为 +1 个月时,它才对我有用。
    • 我也听说过 24 小时,所以试了一下,提前 2 天还是不行。从现在开始将其设置为 3 个月后,权限弹出窗口再次出现!谢谢!
    • 旧帖子,但很高兴看到它仍然有帮助!祝你好运:)
    【解决方案8】:

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

    来自苹果技术文档:

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

    如果您想模拟应用的首次运行,可以将应用卸载一天。您可以按照以下步骤实现后者,而无需实际等待一天:

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

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

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

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

    【讨论】:

    • 这在另一个答案中被提到不再起作用。
    • 它工作得很好。在 iOS 5.1 中停止工作的是另一个答案的 old 版本,它在删除应用程序和提前设置时钟之间省略了重新启动。
    【解决方案9】:

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

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

    【讨论】:

    • 我希望有一个更好的答案,但我想没有一个。还是谢谢!
    【解决方案10】:

    已接受的答案中提到的相同技术说明(TN2265 - Troubleshooting Push Notifications) 已更新为适用于 iOS 5 及更高版本的解决方案。

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

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

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

    【讨论】:

    • 它可能曾经推荐过,但现在不再推荐了。当前的建议是删除应用程序,重新启动,将时钟调快,重新启动,可选择将时钟设置回正确的日期和时间,然后运行应用程序。
    【解决方案11】:

    Apple 技术说明还描述了您可以恢复设备以重置推送通知对话框。

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

    【讨论】:

    • 为了它的价值:我刚刚尝试“删除所有设置”,但没有奏效。尝试所有内容和所有设置...
    • “所有内容和设置”确实有效,谢谢!但是神圣的核选项,蝙蝠侠!这绝对是疯了。
    • 听说购买新设备也会清除推送通知警告!
    • 我尝试购买新设备,但也没有用。将新设备带到天才吧后,他们施展了一些魔法并修复了更多的钱......我很惊讶苹果这么多年仍然没有提供一种实用且简单的方法来重置推送权限。太可笑了
    【解决方案12】:

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

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

    设置设备时间后问题才解决。

    【讨论】:

      【解决方案13】:

      除了ianolito的回答。

      我一年前下载的应用程序也遇到了同样的问题,最初拒绝推送通知。现在想要推送通知,这些步骤在 iOS 7 beta 上对我有用。不确定是哪一点触发了它。

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

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

      【讨论】:

        【解决方案14】:

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

        【讨论】:

        • 你读过这个问题吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 2021-09-20
        相关资源
        最近更新 更多