我按照https://firebase.google.com/docs/notifications/ios/console-topics#receive_and_handle_topic_messages上的谷歌教程在我的iOS应用上订阅了Firebase主题。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
FIRMessaging.messaging().subscribeToTopic("/topics/Notifications")
let homeViewController = UINavigationController(rootViewController: HomeViewController())
UINavigationBar.appearance().translucent = false
window = UIWindow(frame: UIScreen.mainScreen().bounds)
window?.rootViewController = homeViewController
window?.makeKeyAndVisible()
return true
}
但是,当我从Firebase控制台发送主题推送通知时。我无法收到任何推送通知。但是当我从控制台向用户段发送推送通知时,推送工作正常。当我检查Xcode控制台时,我看到了这个FIRMessaging错误。
2016-05-31 11:11:47.893: <FIRMessaging/WARNING> Cannot subscribe to topic: /topics/Notifications with token: (null)
我试图搜索此错误,但没有找到任何运气。我不确定这是否是导致我的应用程序无法接收任何主题推送的问题。
有没有人有这个问题,知道如何解决它?
答案 0 :(得分:34)
看起来你可能过早地打电话给subscribeToTopic
。
首先,在设置任何Firebase呼叫之前,请务必致电
FIRApp.configure()
这将确保正确设置和初始化所有Firebase服务。
接下来,您需要稍等一下才能订阅主题。您的客户需要首先使用APN和FCM注册您的应用程序,以确保它可以接收通知。这涉及网络呼叫,这意味着您无法在应用首次启动时订阅主题。
相反,我建议将该代码放入application:didRegisterUserNotificationSettings
处理程序中。像这样:
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
NSLog(@"Hooray! I'm registered!");
[[FIRMessaging messaging] subscribeToTopic:@"/topics/cool_users"];
}
编辑:和Swift版本......
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
print("Hooray! I'm registered!")
FIRMessaging.messaging().subscribeToTopic("/topics/swift_fans")
}
答案 1 :(得分:6)
accepted solution对我不起作用。调用application:didRegisterUserNotificationSettings:
时,令牌并不总是可用。
例如,如果应用程序是新安装的并且第一次启动FIRInstanceID.instanceID().token()
则返回nil。
您需要确保在令牌可用后{@ 1}} 应用程序调用。
我最终创建了一个帮助对象,它将subscribeToTopic:
,subscribeToTopic:
调用队列,并在令牌到达后以FIFO顺序执行它们。
unsubscribeFrom:
TokenReadyOperation等待,直到出现令牌。 AsynchronousOperation用作最小化样板的基类。
class FIRMessagingHelper {
private let queue: OperationQueue
init() {
queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.addOperation(TokenReadyOperation())
}
func subscribeTo(topic: String) {
queue.addOperation {
OperationQueue.main.addOperation({
FIRMessaging.messaging().subscribeToTopic(topic)
})
}
}
func unsubscribeFrom(topic: String) {
queue.addOperation {
OperationQueue.main.addOperation({
FIRMessaging.messaging().unsubscribeFromTopic(topic)
})
}
}
}
要记住的事情很少:
class TokenReadyOperation : AsynchronousOperation {
override init() {
super.init()
NotificationCenter.default.addObserver(self,
selector: #selector(TokenReadyOperation.tokenRefreshed(notification:)),
name: .firInstanceIDTokenRefresh,
object: nil)
}
override func didStart() {
finishIfTokenAvailable()
}
private func finishIfTokenAvailable() {
guard FIRInstanceID.instanceID().token() != nil else { return }
markFinished()
}
/// Posted every time token changes
@objc private func tokenRefreshed(notification: Notification) {
finishIfTokenAvailable()
}
}
或FIRApp.configure()
,然后再拨打任何Firebase(提及Todd Kerpelman)FIRApp.configureWithOptions(_:)
,subscribeToTopic:
不是线程安全的,必须在主线程上执行unsubscribeFrom:
文档。答案 2 :(得分:2)
在
之后调用subscribeToTopic
无法解决我的问题
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
而是在
之后调用subscribeToTopic
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
当你从 APNS 而不是firebase获得推送令牌时,会调用此函数。
Xcode 8.3.2
Swift 3.0