1

我正在使用HTTP POST将通知发送给应用上的所有用户。要做到这一点,我有一个主题订阅称为“全球”。我希望每个用户都能自动订阅此主题以确保他们获得通知(假设他们已启用通知)。如何在应用程序启动后为用户订阅通知的主题?

在我的代码中,我应该将订阅放在哪里以确保它们始终会订阅?我的恐惧是,我把它放在一个错误的地方,他们永远不会被订阅。我尝试在didFinishLaunchingWithOptions结尾处订阅,但它看起来在这里执行它为时过早(我想因为用户可能没有接受通知提示呢?)。

目前预订是在didRegisterForRemoteNotificationsWithDeviceToken但是这不会被调用的第一个应用程序运行,从而为它工作,我需要运行的应用程序进行第二次......这是我在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 applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) { 
    print("applicationReceivedRemoteMessage") 
} 



func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
    if let refreshedToken = FIRInstanceID.instanceID().token() { 
     print("InstanceID token: \(refreshedToken)") 
     FIRMessaging.messaging().subscribe(toTopic: "/topics/global") 
    } 
} 



@available(iOS 10.0, *) 
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    completionHandler(UNNotificationPresentationOptions.alert) 
} 



func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { 
    // If you are receiving a notification message while your app is in the background, 
    // this callback will not be fired till the user taps on the notification launching the application. 
} 



func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 
    // If you are receiving a notification message while your app is in the background, 
    // this callback will not be fired till the user taps on the notification launching the application. 
} 

回答

3

您需要在两个地方订阅主题。

紧跟在FIRApp.configure()之后。同时更新Firebase iOS SDK版本。似乎你有一个旧版本。

根据新版本(FirebaseMessaging 2.0.1)。

if Messaging.messaging().fcmToken != nil { 
    Messaging.messaging().subscribe(toTopic: “foo”) 
} 

然后第二个当标记刷新。

func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) { 
    Messaging.messaging().subscribe(toTopic: “foo”) 
} 

以下是原始答案的链接。检查提供者提供的答案。

https://github.com/firebase/quickstart-ios/issues/307

0

井火力地堡消息4.0.4将它添加到didRegisterForRemoteNotificationsWithDeviceToken方法,这将完成剩下的

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
     Messaging.messaging().apnsToken = deviceToken 
     Messaging.messaging().subscribe(toTopic: hubId) 
    } 
相关问题