在应用程序生命周期的另一个时间请求远程通知授权?

Posted

技术标签:

【中文标题】在应用程序生命周期的另一个时间请求远程通知授权?【英文标题】:Asking for Remote Notifications Authorization at another time in app's life cycle? 【发布时间】:2017-09-26 13:18:43 【问题描述】:

我遇到了一个奇怪的问题。当我使用以下代码在 didFinishLaunchingWithOptions 中请求远程通知授权时,我能够从我的服务器(Firebase 消息传递)获得推送远程通知,但是当我稍后尝试请求授权时 不在 didFinishLaunchingWithOptions 内 我无法收到任何通知。

我不想在发布时要求授权。例如,我想在用户登录后请求授权。

Apple 文档说:

在安排任何本地通知和 在注册 Apple 推送通知服务之前。 通常,您在配置您的启动时调用此方法 应用程序的通知支持。但是,您可以在其他时间调用它 在您的应用程序的生命周期中,前提是您在执行之前调用它 任何其他与通知相关的任务。

 // For ios 10 display notification (sent via APNS)
 UNUserNotificationCenter.current().delegate = self

 let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]

 UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: _, _ in )

 UIApplication.shared.registerForRemoteNotifications()

对这个问题有什么建议/解决方案吗?

应用信息: 部署目标:iOS 10.3 iOS 设备:装有 iOS 10 的 iPhone 6 / 装有 iOS 11 的 iPhone 7

【问题讨论】:

你叫它的另一点在哪里? 什么意思?! 您在哪里再次请求授权?也只是好奇为什么您需要在以后再次注册它?或者想稍后再注册 另外,也许试试看application(_:didFailToRegisterForRemoteNotificationsWithError:)是否也能帮助你 @TPN1994 我从用户操作处理程序内部请求。我不再要求了!我只是不想在发布时要求授权。 didRegisterForRemoteNotificationsWithDeviceToken 调用成功 【参考方案1】:

所以我是这样解决的:

在我的didFinishLaunchingWithOptions 中,我像这样注册远程通知:

UNUserNotificationCenter.current().delegate = self
UIApplication.shared.registerForRemoteNotifications()

然后在以后,例如用户登录后,我通过调用下面的方法请求授权;

 func reqeust()  
        // For iOS 10 display notification (sent via APNS)
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]

        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: _, _ in



        )

    

【讨论】:

所以你实际上在registerForRemoteNotifications 之后调用了requestAuthorization,尽管文档说了什么。你是这样拿到代币的吗? 我正在使用 Firebase 远程通知,所以即使用户没有请求授权,我还是得到了它。如果您不使用 Firebase,那么我认为一旦您请求授权,您就会得到它。

以上是关于在应用程序生命周期的另一个时间请求远程通知授权?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net页面生命周期请求管道19个事件

如何使 fcm 推送通知过期或设置生命周期?

Swift 清除特定的远程通知

未读推送通知的生命周期

推送通知和渠道​​生命周期

ServiceWorker 生命周期和推送通知