J'ai une application qui stocke la session de l'utilisateur dans NSUserDefaults. Lorsque l'application est forcée de fermer, vérifiez dans un premier temps si la session utilisateur du contrôleur de données y est présente, au cas où elle serait envoyée à la fenêtre de démarrage comme suit:
override func viewWillAppear(animated: Bool) {
self.view.hidden = true
let defaults = NSUserDefaults.standardUserDefaults()
if defaults.stringForKey("user") != nil
{
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let viewController:UIViewController = self.storyboard?.instantiateViewControllerWithIdentifier("vistaInicio") as! ViewControllerInicio
self.presentViewController(viewController, animated: true, completion: nil)
})
}else
{
self.view.hidden = false
}
}
Cela m'a bien fonctionné jusqu'à aujourd'hui, lorsque j'ai décidé d'implémenter les notifications Push avec la mise à jour de Firebase à la suite de ce tutoriel Configuration d'une application cliente de messagerie Firebase Cloud sur iOS . Le problème se produit lorsqu'il a tué l'application et que la saisie de nouveau donne le code d'erreur suivant:
2016-05-19 16:05:27.647: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(full)"
2016-05-19 16:05:27.659: <FIRMessaging/INFO> FIRMessaging library version 1.1.0
2016-05-19 16:05:27.831: <FIRMessaging/WARNING> FIRMessaging registration is not ready with auth credentials
Unable to connect with FCM. Optional(Error Domain=com.google.fcm Code=501 "(null)")
Voici la solution,
Téléchargez d'abord les certificats nécessaires dans la console Firebase Ensuite, dans votre application, activez les notifications push et les modes d'arrière-plan -> Notifications à distance
Après cela, dans App Delegate, utilisez le code ci-dessous (je spécifie la ligne délicate):
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
registerForPushNotifications(application)
// Override point for customization after application launch.
// Use Firebase library to configure APIs
FIRApp.configure()
return true
}
func registerForPushNotifications(application: UIApplication) {
let notificationSettings = UIUserNotificationSettings(
forTypes: [.Badge, .Sound, .Alert], categories: nil)
application.registerUserNotificationSettings(notificationSettings)
}
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
if notificationSettings.types != .None {
application.registerForRemoteNotifications()
}
}
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
var tokenString = ""
for i in 0..<deviceToken.length {
tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
}
//Tricky line
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown)
print("Device Token:", tokenString)
}
N'oubliez pas dans AppDelegate:
import Firebase
import FirebaseInstanceID
import FirebaseMessaging
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
registerForPushNotifications(application)
FIRApp.configure()
// Add observer for InstanceID token refresh callback.
NSNotificationCenter
.defaultCenter()
.addObserver(self, selector: #selector(AppDelegate.tokenRefreshNotificaiton),
name: kFIRInstanceIDTokenRefreshNotification, object: nil)
// Override point for customization after application launch.
return true
}
func registerForPushNotifications(application: UIApplication) {
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
print("===== didReceiveRemoteNotification ===== %@", userInfo)
}
func tokenRefreshNotificaiton(notification: NSNotification) {
let refreshedToken = FIRInstanceID.instanceID().token()!
print("InstanceID token: \(refreshedToken)")
// Connect to FCM since connection may have failed when attempted before having a token.
connectToFcm()
}
func connectToFcm() {
FIRMessaging.messaging().connectWithCompletion { (error) in
if (error != nil) {
print("Unable to connect with FCM. \(error)")
} else {
print("Connected to FCM.")
}
}
}
Assurez-vous également de le faire dans Info.plist: FirebaseAppDelegateProxyEnabled = NO
Je ne sais pas pour l'instant mais j'ai la print(...)
dans didReceiveRemoteNotification
mais je n'ai pas la popup. J'envoie le message de Firebase -> Console -> Notification -> Appareil unique et copie ici le token que j'ai obtenu de Xcode Console -> func tokenRefreshNotificaiton
La réponse est correcte, voici les étapes, mais vérifiez également l'heure de votre appareil. Parce que si votre heure et votre date sont trop éloignées, cela ne fonctionnera pas
Après avoir triplement vérifié l'intégralité de l'intégration, pour moi, le problème était que le test l'appareil avait la date changé à une semaine à l'avance. Le SDK FCM effectue probablement des vérifications basées sur la date.
L'erreur pourrait être moins générique du côté de Firebase, car j'ai perdu presque une journée à chercher une solution. J'espère que cela t'aides.