Swift 3 – Notificación Push de Firebase, ¿Cómo puedo hacer?

A mí me gusta más abajo en Swift 2. Pero no funciona en Swift 3. ¿Cómo puedo proporcionar esto? Si alguien explica esto Sería genial.

didFinishLaunchingWithOptions

let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) UIApplication.shanetworkingApplication().registerUserNotificationSettings(notificationSettings) application.registerForRemoteNotifications() 

y

 func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { if notificationSettings.types != .None { application.registerForRemoteNotifications() } } func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { print("Meesage ID \(userInfo["gcm_message_id"]!)") print(userInfo) } 

Puedo hacer notifications locales simples, pero no pude enviar notifications remotas desde Firebase.

Lo intenté

 UNUserNotificationCenter.currentNotificationCenter().delegate = self UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Alert, .Badge, .Sound]) { (success, error:NSError?) in if success { print("Notification access true!") application.registerForRemoteNotifications() } else { print(error?.localizedDescription) } } 

y

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { print("Meesage ID \(userInfo["gcm_message_id"]!)") print(userInfo) } 

Todavía no funciona.

Los nombres del método AppDelegate han cambiado un poco y se ha introducido el marco UserNotifications. Debe usar este marco para las notifications en iOS 10 y versiones posteriores ya que los otros methods están en desuso.

 import UserNotifications ... @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { ... func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in // Enable or disable features based on authorization. } application.registerForRemoteNotifications() return true } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> ()) { print("Message ID \(userInfo["gcm.message_id"]!)") print(userInfo) } ... } 

¿Registro para Notificaciones Push en Xcode 8 / Swift 3.0?

Es muy importante recordar que puede haber diferentes dispositivos que ejecuten diferentes versiones de iOS, y que tengan diferentes capacidades de notificación. Entiendo que la respuesta anterior apunta en la dirección correcta.

Necesitamos import FirebaseInstanceID , si vamos a recibir una instancia o notifications basadas en events. Estas notifications son como las que aparecen cuando alguien retweets nuestra publicación, o le gusta una publicación, o una notificación de post.

Sin embargo, si alguien está buscando el código completo que entra en la function didFinishLaunchingWithOptions en AppDelegate , aquí está:

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { FIRApp.configure() if #available(iOS 10.0, *) { let authOptions : UNAuthorizationOptions = [.Alert, .Badge, .Sound] UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions( authOptions, completionHandler: {_,_ in }) } else { // Fallback on earlier versions let settings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) application.registerUserNotificationSettings(settings) application.registerForRemoteNotifications() } application.registerForRemoteNotifications() // Add observer for InstanceID token refresh callback. NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.tokenRefreshNotification), name: kFIRInstanceIDTokenRefreshNotification, object: nil) return true } func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { // This is requinetworking if you are receiving a notification message while your app is in the background, which is the most common case!! print("Message ID: \(userInfo["gcm.message_id"]!)") print("%@", userInfo) } func tokenRefreshNotification(notification: NSNotification) { if 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.") } } } func applicationDidBecomeActive(application: UIApplication) { connectToFcm() } func applicationDidEnterBackground(application: UIApplication) { FIRMessaging.messaging().disconnect() print("Disconnected from FCM.") } 

Esto es lo que me funciona Xcode 8, Swift 3.

Inside didFinishLaunchingwithOptions func en AppDelegate.swift

 if #available(iOS 10.0, *) { let authOptions : UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: {granted, error in print(granted) }) // For iOS 10 display notification (sent via APNS) UNUserNotificationCenter.current().delegate = self // For iOS 10 data message (sent via FCM) FIRMessaging.messaging().remoteMessageDelegate = self } else { let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) application.registerUserNotificationSettings(settings) } application.registerForRemoteNotifications() FIRApp.configure() // [START set_messaging_delegate] FIRMessaging.messaging().remoteMessageDelegate = self // [END set_messaging_delegate] 

Y los delegates deben recibir notifications de la database:

 @available(iOS 10, *) extension AppDelegate : UNUserNotificationCenterDelegate { // Receive displayed notifications for iOS 10 devices. func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { let userInfo = notification.request.content.userInfo // Print message ID. print("Message ID: \(userInfo["gcm.message_id"]!)") // Print full message. print("%@", userInfo) let aps = userInfo["aps"] as! [String: Any] let notificationMessage = aps["alert"] as! String // processed content from notificaton } } extension AppDelegate : FIRMessagingDelegate { // Receive data message on iOS 10 devices. func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) { print("%@", remoteMessage.appData) } }