web-dev-qa-db-fra.com

Notifications Push iOS Firebase: Comment donner un jeton de périphérique de l'utilisateur de Firebase et envoyer une notification

Un peu récemment lors de l'événement Google I/O, Google a rénové Firebase et ajouté de nombreuses nouvelles fonctionnalités, tout en apportant quelques retouches. J'ai essayé d'implémenter les notifications push iOS via Firebase dans mon application via le niveau le plus élémentaire. J'ai donc créé une application très simple qui ne fait rien d'autre que recevoir des notifications Push à distance.

Dans Firebase, j'ai téléchargé mon certificat et dans Xcode, mes profils d'approvisionnement ont été ajoutés à la fois à la cible et au projet. Dans Firebase, j'ai également téléchargé le certificat approprié. Vous trouverez ci-dessous le code contenu dans mon AppDelegate.Swift fichier mais parce que mon ViewController.Swift est "vide", je ne l'ai pas inclus.

Bien qu'il n'y ait pas de crash ou d'erreur d'exécution, j'accepte les notifications lorsque je charge l'application. Ensuite, je quitte l'application et éteins mon appareil. Dans Firebase, j'envoie la notification à la bonne application. Après quelques minutes, dans Firebase, il est indiqué que la notification était "Completed".

Cependant, je n'ai jamais reçu la notification sur l'appareil. En conclusion, j’ai donc besoin d’une solution pour envoyer à Firebase ce deviceToken, puis utiliser "Notifications de Firebase" pour envoyer le message de notification Push.

Toute aide pour mon code ou en général serait grandement appréciée et j'espère que cela aidera les futurs téléspectateurs. Merci! Mon code dans AppDelegate.Swift:

import UIKit
import Firebase
import FirebaseMessaging

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        FIRApp.configure()

        let notificationTypes : UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound]

        let notificationSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil)

        application.registerForRemoteNotifications()
        application.registerUserNotificationSettings(notificationSettings)

        return true
    }

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {

        print("Device Token: \(deviceToken)")

    }

    func applicationWillResignActive(application: UIApplication) {

    }

    func applicationDidEnterBackground(application: UIApplication) {

    }

    func applicationWillEnterForeground(application: UIApplication) {

    }

    func applicationDidBecomeActive(application: UIApplication) {

    }

    func applicationWillTerminate(application: UIApplication) {

    }

    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

        print("MessageID : \(userInfo["gcm.messgae_id"]!)") // or gcm_etc...

        print(userInfo)

    }


}
17
EQOxx123

Mise à jour: à partir de Firebase 4.0.4, vous pouvez suivre https://github.com/onmyway133/blog/issues/64

COMMENT APNS DEVICE TOKEN IS HANDLED

Je lisais envoyer une notification à un segment d'utilisateur sur iOS mais il n'y a aucune mention du jeton de périphérique APNS, qui est essentiel pour les notifications Push.

Donc, Firebase doit faire des miracles sous le capot. En fait c'est. Lire la documentation principale Messages en aval nous donne l’idée

Swizzling désactivé: mappage de votre jeton APNs et de votre jeton d'enregistrement

If you have disabled method swizzling, you'll need to explicitly map your APNs token to the FCM registration token. Override the

méthodes didRegisterForRemoteNotificationsWithDeviceToken pour récupérer le jeton APNs, puis appeler setAPNSToken.

func application(application: UIApplication,
                   didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
  FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenTypeSandbox)
}

J'essaie surtout d'éviter autant que possible de grésiller. Lecture Migrer une application client GCM pour iOS vers la messagerie en nuage Firebase nous explique comment le désactiver.

Activer/désactiver la méthode swizzling

La méthode swizzling disponible avec FCM simplifie votre code client. Cependant, pour les développeurs qui préfèrent ne pas l’utiliser, FCM vous permet de désactiver la méthode en ajoutant FIRMessagingAutoRegisterEnabledflag dans le fichier Info.plist de l’application et en définissant sa valeur sur NO (valeur booléenne).

FCM swizzling affects how you handle the default registration token, and how you handle downstream message callbacks. Where

applicable, ce guide fournit des exemples de migration avec et sans méthode swizzling activée.

MONTRE LE CODE

Avoir ceci dans votre Podfile

pod 'Firebase'
pod 'FirebaseMessaging'

Voici le code complété

import Firebase
import FirebaseMessaging

override func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  FIRApp.configure()

  NSNotificationCenter.defaultCenter().addObserver(self,
                                                   selector: #selector(tokenRefreshNotification(_:)),
                                                   name: kFIRInstanceIDTokenRefreshNotification,
                                                   object: nil)
}

// NOTE: Need to use this when swizzling is disabled
public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {

  FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Sandbox)
}

func tokenRefreshNotification(notification: NSNotification) {
  // NOTE: It can be nil here
  let refreshedToken = FIRInstanceID.instanceID().token()
  print("InstanceID token: \(refreshedToken)")

  connectToFcm()
}

func connectToFcm() {
  FIRMessaging.messaging().connectWithCompletion { (error) in
    if (error != nil) {
      print("Unable to connect with FCM. \(error)")
    } else {
      print("Connected to FCM.")
    }
  }
}

public func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
  print(userInfo)
}
31
onmyway133

Intégrer sans CocoaPods

Première lecture du document Firebase => Firebase Doc

  1. Enregistrer le projet sur Firebase ici => Enregistrer le projet ici

  2. Obtenir le fichier GoogleService-Info.plist à partir d'ici => projet => paramètres => Général

  3. Fichier GoogleService-Info.plist déposé dans votre projet.

  4. définir Notification .p12 Certificats (Production et développement) dans Firebase => projet => paramètres => Cloud Messaging

  5. Téléchargez le SDK Firebase ici => Téléchargement du SDK Firebase

  6. Créez un dossier SDK dans votre projet et déposez-y tous les dossiers SDK.

  7. Ajoutez maintenant ce framework dans votre Xcode => libicucore.tbd

  8. Définir les modes d'arrière-plan sur ON dans Xcode => Projets => Capacités => Mode d'arrière-plan sur ON => RemoteNotification
  9. Ajoutez dans votre fichier Info.Plist FirebaseAppDelegateProxyEnabled Définissez BOOL [~ # ~] non [~ # ~] .

enter image description here

Dans Objective-c, votre fichier Appdelegate.m

#import "AppDelegate.h"
#import "Firebase.h"
#import "AFNHelper.h"

@interface AppDelegate (){

    NSString *InstanceID;
}
@property (nonatomic, strong) NSString *strUUID;
@property (nonatomic, strong) NSString *strDeviceToken;
@end
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    UIUserNotificationType allNotificationTypes =
    (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
    UIUserNotificationSettings *settings =
    [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    [[UIApplication sharedApplication] registerForRemoteNotifications];

    [FIRApp configure];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tokenRefreshNotification:) name:kFIRInstanceIDTokenRefreshNotification object:nil];

    return YES;
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    NSLog(@"Message ID: %@", userInfo[@"gcm.message_id"]);
    [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

    NSLog(@"userInfo=>%@", userInfo);
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    [[FIRInstanceID instanceID] setAPNSToken:deviceToken type:FIRInstanceIDAPNSTokenTypeProd];
    NSLog(@"deviceToken1 = %@",deviceToken);

}
- (void)tokenRefreshNotification:(NSNotification *)notification {
   NSLog(@"instanceId_notification=>%@",[notification object]);
    InstanceID = [NSString stringWithFormat:@"%@",[notification object]];

 [self connectToFcm];  
}

- (void)connectToFcm {

[[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) {
    if (error != nil) {
        NSLog(@"Unable to connect to FCM. %@", error);
    } else {

        NSLog(@"InstanceID_connectToFcm = %@", InstanceID);
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

            dispatch_async(dispatch_get_main_queue(), ^{
                [self sendDeviceInfo];
                NSLog(@"instanceId_tokenRefreshNotification22=>%@",[[FIRInstanceID instanceID] token]);

            });
        });


    }
}];
}
13
Sanandiya Vipul

Les documents sont assez pauvres pour le FCM pour iOS maintenant.

Suivez le exemple app qu'ils ont sur github

Partie importante ajoutée ici:

import Firebase
import FirebaseInstanceID
import FirebaseMessaging

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Register for remote notifications
    if #available(iOS 8.0, *) {
      let settings: UIUserNotificationSettings =
      UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
      application.registerUserNotificationSettings(settings)
      application.registerForRemoteNotifications()
    } else {
      // Fallback
      let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound]
      application.registerForRemoteNotificationTypes(types)
    }

    FIRApp.configure()

    // Add observer for InstanceID token refresh callback.
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.tokenRefreshNotificaiton),
        name: kFIRInstanceIDTokenRefreshNotification, object: nil)

    return true
  }

 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()
  }
  // [END refresh_token]

  // [START connect_to_fcm]
  func connectToFcm() {
    FIRMessaging.messaging().connectWithCompletion { (error) in
      if (error != nil) {
        print("Unable to connect with FCM. \(error)")
      } else {
        print("Connected to FCM.")
      }
    }
  }

Votre jeton a maintenant été envoyé au serveur FCM.

5
Shubhank