如何提示用户接受 AppDelegate 之外的推送通知?

Posted

技术标签:

【中文标题】如何提示用户接受 AppDelegate 之外的推送通知?【英文标题】:How can I prompt user to accept push notifications outside of AppDelegate? 【发布时间】:2017-03-15 16:40:31 【问题描述】:

我的应用加载到一个视图控制器中,该控制器告诉用户为什么他们应该接受推送通知。直到他们按下此视图控制器上的继续按钮后,我才希望提示他们接受推送通知。这意味着我需要在我的初始视图控制器中的某处包含代码,让我们称之为 BeforePromptController。我正在使用 Firebase,以防万一。

这是我在 AppDelegate 中的工作代码(但是我想更改它,以便在用户按下 BeforePromptController 中的继续按钮后出现提示)。我试图在这里只包含 AppDelegate 的重要部分..

import UIKit
import Firebase
import FirebaseMessaging
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, FIRMessagingDelegate 

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 

        FIRApp.configure()

        if #available(ios 10.0, *) 
            let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
            UNUserNotificationCenter.current().requestAuthorization(
                options: authOptions,
                completionHandler: _, _ in )

            // For iOS 10 display notification (sent via APNS)
            UNUserNotificationCenter.current().delegate = self
            // For iOS 10 data message (sent via FCM)
            FIRMessaging.messaging().remoteMessageDelegate = self

         else 
            let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            application.registerUserNotificationSettings(settings)
                

        application.registerForRemoteNotifications()

        return true
    



    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 

        if application.applicationState == UIApplicationState.active 

            var pushNotificationMessage = ""
            if let aps = userInfo["aps"] as? NSDictionary 
                if let alert = aps["alert"] as? NSDictionary 
                    if let message = alert["message"] as? NSString 
                        pushNotificationMessage = message as String
                    
                 else if let alert = aps["alert"] as? NSString 
                    pushNotificationMessage = alert as String
                
            

            let notificationAlert = UIAlertController(title: nil, message: pushNotificationMessage, preferredStyle: .alert)

            let defaultAction = UIAlertAction(title: "OK", style: .default, handler: 
                (alert: UIAlertAction!) -> Void in
            )
            defaultAction.setValue(Constants.activePushNotificationOKColor, forKey: "titleTextColor")

            notificationAlert.addAction(defaultAction)
            self.window?.rootViewController?.present(notificationAlert, animated: true, completion: nil)
        
    

【问题讨论】:

【参考方案1】:

您可以将代码移到需要授权的FIRApp.configure() 之后;你可以通过UIApplication.shared获得申请参考

【讨论】:

【参考方案2】:

调用application.registerForRemoteNotifications()会出现推送通知的提示,所以调用该函数会在需要的时候显示提示。

要访问您的 UIApplication,您可以在 Swift3 中使用 UIApplication.shared 或在 Swift2 中使用 UIApplication.sharedApplication()

【讨论】:

以上是关于如何提示用户接受 AppDelegate 之外的推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AppDelegate 之外处理 UIApplicationDidRegisterToRemoteNoticationsWithDeviceToken?

iOS:如何在 AppDelegate 之外调用“应用程序 didRegisterForRemoteNotificationsWithDeviceToken”?

我如何表明一个函数可以接受除字典之外的任何可迭代对象?

如何控制何时在 iOS 中提示用户提供推送通知权限

在 AppDelegate 之外,我如何在 UINavigationController 中包含一个 UIViewController,然后再对它执行基本的 `performSegueWIthIden

如何获取喜欢我的推文的用户列表和引用转发我的推文的用户列表?