2017-02-10 12 views
2

Прежде всего, у меня нет проблем для FCM, токен firebase никогда не является нулевым при каждом вызове tokenRefreshNotification. Но после того, как я добавлю Google analytics, у меня возникла странная проблема для токена Firebase. Каждый раз, когда я выключить и включить уведомление в моих настройках приложения используетсятокен firebase имеет значение null, а токен обновляется постоянно в моем testFlight.

UIApplication.shared.registerForRemoteNotifications()

мой tokenRefreshNotification, называется непрерывно, и это не останавливает цикл, пока я не заставить закрыть приложения. Сначала мое приложение аварийно, и когда я пытаюсь проследить его с помощью NsLog, я обнаружил, что токен Firebase равен нулю. Проблема возникает только тогда, когда я использую свои приложения, установленные из TestFlight/production. Когда я пытаюсь выполнить его из моего Xcode-конструктора, токен firebase имеет значение null только один раз, но второй вызов, токен firebase существует и перестает работать.

Для Google Analytics он отлично работает, и в моем сервисе GoogleService-info.plist я установил IS_ANALYTICS_ENABLED в YES и IS_GCM_ENABLED для YES. Для другого, IS_ADS_ENABLED = YES, IS_APPINVITE_ENABLED = НЕТ, и IS_SIGNIN_ENABLED = YES

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

     NotificationCenter.default.addObserver(self, selector: #selector(self.registerNotification), name: NSNotification.Name(rawValue: "registerNotification"), object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(self.tokenRefreshNotification(_:)), name: .firInstanceIDTokenRefresh, object: nil) 
     setupGoogleAnalytics() 
     return true 
} 
//when firebase token is null, this function is working continously until my firebase token is exist 
func tokenRefreshNotification(_ notification: Notification) { 
    print("token Refresh") 
    if FIRInstanceID.instanceID().token() == nil{ 
     NSLog("firebase token is null") 
    } 

    if (UserDefaults.standard.object(forKey: "id") != nil) && FIRInstanceID.instanceID().token() != nil{ 
     FIRInstanceID.instanceID().getWithHandler({ (instanceID, error) in 
      NSLog("instanceID: \(instanceID!)") 
      //save firebase token to my database, sorry i can`t show it 
     }) 
    } 

    // Connect to FCM since connection may have failed when attempted before having a token. 
    connectToFcm()   
} 

Примечание: При первом запуске, я назвал мой RegisterForRemoteNotifications, в TestFlight версии, когда tokenRefreshNotification называется, то firebase маркер имеет нулевое значение, но второй вызов, токен firebase существует, поэтому он может остановиться. Но, когда я запускаю свое приложение из Xcode, первый вызов является успешным, потому что токен firebase не равен нулю.

ответ

4

Я понял это! просто измените токен типа ANPS из Sandbox в Unknown!

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {   
    // With swizzling disabled you must set the APNs token here. 
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.unknown) 
} 
+0

<3 Я думал, что я единственный. – Warpling

+0

Привет, объясните, зачем использовать FIRInstanceIDAPNSTokenType.unknown, но не FIRInstanceIDAPNSTokenType.prod? –

+0

как я знаю, неизвестный тип может быть адаптируемым, его можно использовать для разработки или производства –