ios 当用户在最初拒绝访问后在设置中启用推送通知时,处理推送通知

nhhxz33t  于 12个月前  发布在  iOS
关注(0)|答案(2)|浏览(164)

我有一个关于远程推送通知和其他开发人员如何处理特定场景的问题。(仅供参考,我使用Firebrown Messaging进行远程推送通知。)
我需要处理一种情况,即用户最初使用requestAuthorization(options:completionHandler:)方法拒绝推送通知授权。然后用户转到设置应用,使用“允许推送”切换打开我的应用的通知,然后返回到我的应用。
如果用户杀死并重新启动应用,他们可以收到远程推送通知,因为应用委托中的所有代码在重新启动时都会再次运行。但是,如果用户在更改设置后没有重新启动我的应用,他们将不会在我的应用中收到远程通知。
具体来说,流程如下:
1.用户安装我的应用
1.用户进入我的应用程序中的通知选项卡,并被要求获得推送通知权限
1.用户点击“不允许”
1.用户进入设置应用程序并打开我的应用程序的“允许删除”切换
1.用户返回到我的应用程序(如果他们重新启动了我的应用程序,他们可以收到通知)
理想情况下,我希望用户能够在更改设置后接收远程通知,而不必杀死并重新启动应用程序。
在这种情况下,是否可以在不重新启动应用的情况下使推送通知工作?例如,当应用进入前台时调用UIApplication.shared.registerForRemoteNotifications()可以处理这种情况吗?
任何关于如何最好地处理这个用户流的见解将不胜感激。谢谢!

final class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        FirebaseApp.configure()
        Messaging.messaging().delegate = self

        UNUserNotificationCenter.current().getNotificationSettings { settings in
            guard settings.authorizationStatus == .authorized else { return }
            DispatchQueue.main.async {
                application.registerForRemoteNotifications()
            }
        }
        return true
    }
    
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // save device token
    }
    
    func application(_ application: UIApplication, didFailToContinueUserActivityWithType userActivityType: String, error: Error) {
        print("didFailToContinueUserActivityWithType: \(error)")
    }
}

// MARK: - MessagingDelegate

extension AppDelegate: MessagingDelegate {
    
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
    // save fcm token
    }
}

字符串

0x6upsns

0x6upsns1#

通知权限不是用于推送通知,而是用于显示通知。
如果调用registerForRemoteNotifications(),您的应用将始终收到通知令牌
如果您的应用尚未请求和接收(或用户随后已删除)通知权限,则您的服务器发送的任何推送通知都不会显示给用户。
所以,最简单的方法就是总是调用application.registerForRemoteNotifications()
一个更复杂的方法是检查didBecomeActive中的当前通知权限,如果通知权限已被删除,并且isRegisteredForRemoteNotificationstrue,则可以取消注册远程通知,但我不推荐这种方法。
考虑以下序列:

  • 授予通知权限
  • 您的应用注册远程通知
  • 用户删除设置中的通知权限
  • 用户打开您的应用,然后取消注册远程通知
  • 一段时间后,用户在设置中重新添加权限,但不会进入您的应用程序

现在,他们已启用通知,但由于您的应用尚未重新注册,因此无法接收推送通知。
如果你使用第一种方法,总是注册,这不是一个问题。你发送一些推送通知,可能不会显示给用户,但这不是一个大问题。

pu3pd22g

pu3pd22g2#

问题不是推送通知,而是应用程序的生命周期和响应生命周期的UIApplicationDelegate方法。
无论您在didFinishLaunchingWithOptions中调用什么代码,都只会在应用首次启动或重新启动时运行(在后台被用户或iOS“杀死”之后)。
如果您需要在应用程序每次激活时运行代码,请查看UIApplicationDelegate x的API的其他部分,如applicationDidBecomeActive x。

相关问题