2016-05-31 20 views
9

Podążyłem za samouczkiem google pod numerem https://firebase.google.com/docs/notifications/ios/console-topics#receive_and_handle_topic_messages, aby zasubskrybować temat Firebase w mojej aplikacji na iOS.Nie można odbierać powiadomień wypychanych w systemie iOS z Firebase 3.2.0 tematy

Po wysłaniu powiadomienia dotyczącego wypychania tematu z konsoli Firebase. Nie mogłem otrzymywać żadnych powiadomień push. Ale kiedy wysyłam powiadomienia push do segmentu użytkownika z konsoli, push działa idealnie. Kiedy sprawdzam konsolę Xcode, widzę ten błąd FIRMessaging.

2016-05-31 11:11:47.893: <FIRMessaging/WARNING> Cannot subscribe to topic: /topics/Notifications with token: (null) 

Próbowałem wyszukać ten błąd, ale nie znalazłem niczego. Nie jestem pewien, czy to jest problem, który powoduje, że moja aplikacja nie otrzymuje żadnych wiadomości z tematów.

Czy ktoś ma ten problem i wie, jak go rozwiązać?

Odpowiedz

29

Wygląda na to, że za wcześnie dzwonisz pod numer subscribeToTopic.

Po pierwsze, przed przystąpieniem do jakichkolwiek Firebase połączenia, upewnij się, że nazywają

FIRApp.configure() 

, który zapewni, że wszystkie usługi Firebase są prawidłowo skonfigurowane i inicjowany.

Następnie należy nieco poczekać, aby zasubskrybować tematy. Twój klient musi najpierw zarejestrować swoją aplikację zarówno z APN, jak i FCM, aby zapewnić, że może otrzymywać powiadomienia. Wiąże się to z połączeniem sieciowym, co oznacza, że ​​nie możesz subskrybować tematów po pierwszym uruchomieniu aplikacji.

Zamiast tego, polecam zamiast tego wstawić ten kod do twojego handlera application:didRegisterUserNotificationSettings. Coś takiego:

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { 
    NSLog(@"Hooray! I'm registered!"); 
    [[FIRMessaging messaging] subscribeToTopic:@"/topics/cool_users"]; 
} 

Edit: A wersja Swift ...

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { 
    print("Hooray! I'm registered!") 
    FIRMessaging.messaging().subscribeToTopic("/topics/swift_fans") 
} 
+0

Dzięki Todd. Działa idealnie! – howly

+5

Czy jest na to poprawka dla systemu iOS 10? Subskrybowanie tematów w systemie iOS 10 nie działa. – vnchopra

+6

Dla każdego, kto próbuje użyć tego kodu, powinieneś zasubskrybować '/ topics/cool_users' zamiast po prostu' cool_users' – henrikmerlander

5

The accepted solution nie działa dla mnie. Token nie zawsze jest dostępny po wywołaniu application:didRegisterUserNotificationSettings:. Na przykład, jeśli aplikacja jest świeżo zainstalowana i rozpoczyna się po raz pierwszy FIRInstanceID.instanceID().token() zwraca zero.

Musisz upewnić się, że wywołania aplikacji subscribeToTopic:po token jest dostępny. Skończyło się na tym, że utworzyłem obiekt pomocniczy, który zapisuje połączenia subscribeToTopic:, unsubscribeFrom: i wykonuje je w kolejności FIFO po nadejściu tokena.

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) 
      }) 
     } 
    } 
} 

TokenReadyOperation czeka aż pojawi się token. AsynchronousOperation jest używana jako klasa podstawowa w celu zminimalizowania wartości zadanej.

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() 
    } 
} 

Kilka rzeczy o których warto pamiętać:

  • App musi wywołać FIRApp.configure() lub FIRApp.configureWithOptions(_:) przed dokonaniem jakichkolwiek połączeń Firebase (jak Todd Kerpelman wspomniano)
  • subscribeToTopic:, unsubscribeFrom: nie są wątku bezpieczne i muszą być wykonywane na głównym wątku
  • Nazwy tematów muszą być w formacie "/ topics/*" (jak wspomniano henmer)
  • Należy użyć innego pliku plist do debugowania i wydania App Store aplikacji. Zobacz dokumentację FIRApp.configureWithOptions(_:).
  • Data & Czas powinien być aktualny, w przeciwnym razie token może nie zostać dostarczony.
  • Upewnij się, że używasz the newest framework version. Miałem problemy z dostawą powiadomień z SDK wydany około stycznia 2017
+0

Dzięki za twoje dochodzenie. Odsłuch dla "kFIRInstanceIDTokenRefreshNotification" na świeżej instalacji wydaje się być jedynym sposobem, aby zapobiec awariom subskrypcji tematów. – ray

2

Mój problem nie został rozwiązany przez wywołanie subscribeToTopic po

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {

zamiast pracował przez wywołanie subscribeToTopic po

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 

ta funkcja zostaje wywołana, gdy otrzymasz swój znacznik push od APNS n ot firebase.

Xcode 8.3.2

Swift 3.0

Powiązane problemy