para notification ningún hay firebaseappdelegateproxyenabled esta equipo clave autenticación apns aplicación almacenado ios firebase apple-push-notifications firebase-cloud-messaging

ios - notification - no hay ningún id de equipo almacenado para esta aplicación



Las notificaciones push no se envían desde FCM después del cambio de Cert APNs (3)

Actualice los Certificados APN (Producción y Desarrollo) en YourProjectSetting => cloudmessaging => configuración de la aplicación iOS. Firebase Cloud Messaging puede usar una clave de autenticación APNs o un certificado APN para conectarse con APNs

Nota: confirme las credenciales de su proyecto (SenderID, clave de servidor heredada, clave de servidor).

Solicitud HTTP POST: Para enviar notificaciones.

https://fcm.googleapis.com/fcm/send Content-Type:application/json Authorization:key=AIzaSyZ-1u......7Udno5aA { "registration_ids": ["regId1","regId2"], "data": { "title": "App Name", "message": "Hello this is for testing", "body": "Hello this is for testing" }, "content-available": true, "priority": "high", "notification": { "title": "App Name", "message": "Hello this is for testing", "body": "Hello this is for testing" } }

Agregue el siguiente código en su AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { self.fcmInitialSetup(application) return true } func fcmInitialSetup(_ application: UIApplication){ // [START register_for_notifications] if #available(iOS 10.0, *) { let uns: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) application.registerUserNotificationSettings(uns) application.registerForRemoteNotifications() } else { let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) application.registerUserNotificationSettings(settings) } application.registerForRemoteNotifications() // [END register_for_notifications] FIRApp.configure() // Add observer for InstanceID token refresh callback. NotificationCenter.default.addObserver(self, selector: #selector(self.tokenRefreshNotification), name: NSNotification.Name.firInstanceIDTokenRefresh, object: nil) if let token = FIRInstanceID.instanceID().token() { sendTokenToServer(token) } } func sendTokenToServer(_ currentToken: String) { print("sendTokenToServer() Token: /(currentToken)") // Send token to server ONLY IF NECESSARY print("InstanceID token: /(currentToken)") self.token = currentToken UserDefaults.standard.set(self.token, forKey: "token") UserDefaults.standard.synchronize() if self.token != nil{ let userInfo = ["token": self.token] NotificationCenter.default.post( name: Notification.Name(rawValue: self.rkey), object: nil, userInfo: userInfo) } } // NOTE: Need to use this when swizzling is disabled func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenChars = (deviceToken as NSData).bytes.bindMemory(to: CChar.self, capacity: deviceToken.count) var tokenString = "" for i in 0..<deviceToken.count { tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]]) } FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.unknown) print("Device Token:", tokenString) print("FIRInstanceID.instanceID().token() Token:", FIRInstanceID.instanceID().token()) if let tokenData = FIRInstanceID.instanceID().token(){ UserDefaults.standard.set(tokenData, forKey: "token") UserDefaults.standard.synchronize() let userInfo = ["token": tokenData] } } func tokenRefreshNotification(_ notification: Notification) { // NOTE: It can be nil here // print("Token:/(FIRInstanceID.instanceID().token()!)") if let refreshedToken = FIRInstanceID.instanceID().token() { print("InstanceID token: /(refreshedToken)") UserDefaults.standard.set(refreshedToken, forKey: "token") UserDefaults.standard.synchronize() print("update now /(self.token)") if self.token != nil{ let userInfo = ["token": self.token] NotificationCenter.default.post( name: Notification.Name(rawValue: self.rkey), object: nil, userInfo: userInfo) } } // Connect to FCM since connection may have failed when attempted before having a token. connectToFcm() } // [END refresh_token] func connectToFcm() { FIRMessaging.messaging().connect { (error) in if (error != nil) { print("Unable to connect with FCM. /(error)") } else { print("Connected to FCM.") } } } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { print(userInfo) } func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { print("Within open URL") return true } // [START receive_apns_token_error] func application( _ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error ) { print("Registration for remote notification failed with error: /(error.localizedDescription)") // [END receive_apns_token_error] let userInfo = ["error": error.localizedDescription] NotificationCenter.default.post( name: Notification.Name(rawValue: rkey), object: nil, userInfo: userInfo) } func registrationHandler(_ token: String!, error: NSError!) { if (token != nil) { self.token = token! print("Registration Token: /(self.token)") UserDefaults.standard.set(self.token, forKey: "token") UserDefaults.standard.synchronize() let userInfo = ["token": self.token] NotificationCenter.default.post( name: Notification.Name(rawValue: self.rkey), object: nil, userInfo: userInfo) } else { print("Registration to GCM failed with error: /(error.localizedDescription)") let userInfo = ["error": error.localizedDescription] NotificationCenter.default.post( name: Notification.Name(rawValue: self.rkey), object: nil, userInfo: userInfo) } } func registerForPushNotifications(_ application: UIApplication) { let notificationSettings = UIUserNotificationSettings( types: [.badge, .sound, .alert], categories: nil) application.registerUserNotificationSettings(notificationSettings) } func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) { if notificationSettings.types != UIUserNotificationType() { application.registerForRemoteNotifications() } } // [START receive_message] func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // If you are receiving a notification message while your app is in the background, // this callback will not be fired till the user taps on the notification launching the application. // TODO: Handle data of notification // Print message ID. add Toast print(userInfo); print(application.keyWindow?.visibleViewController() ?? "") print("Message ID: /(userInfo["gcm.message_id"]!)") // Print full message. print("%@", userInfo) } // [END receive_message] func applicationDidBecomeActive(_ application: UIApplication) { connectToFcm() } // [START disconnect_from_fcm] func applicationDidEnterBackground(_ application: UIApplication) { // FIRMessaging.messaging().disconnect() // print("Disconnected from FCM.") } func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { } // [END disconnect_from_fcm] // [START ios_10_message_handling] @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 message ID. add Toast // Print full message. print("%@", userInfo) // Print full message. print("%@", userInfo) } } extension AppDelegate : FIRMessagingDelegate { // Receive data message on iOS 10 devices. func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) { print("%@", remoteMessage.appData) } } // [END ios_10_message_handling]

Referencia: https://firebase.google.com/docs/cloud-messaging/ios/device-group

Espero que esto te ayudará.

No tenía problemas con el envío de notificaciones push desde FCM a mi aplicación iOS antes de que uno de mis certificados expirara. Después de cambiarlo, FCM ya no está entregando mensajes. Leí este artículo ( https://firebase.googleblog.com/2017/01/debugging-firebase-cloud-messaging-on.html ) y aquí están los pasos de validación que he seguido hasta ahora, pero me estoy golpeando la cabeza en la pared ahora ...

  • Comentó cualquier función de connectToFCM
  • Pusher descargado y con éxito puede enviar notificaciones al dispositivo utilizando el certificado APNs
  • Hizo con éxito las llamadas de curl a FCM con éxito (respuesta a continuación)
    • {"multicast_id": 7774794018682407760, "success": 1, "failure": 0, "canonical_ids": 0, "results": [{"message_id": "0: 1493321644068397% b76e8527b76e8527"}]}
  • Intenté recrear los certificados de desarrollo y producción.
  • Intenté exportarlos desde el llavero con y sin contraseña

¿Alguien tiene experiencia con esta cosa super frustrante y tiene consejos sobre cómo proceder?

También vale la pena señalar que no puedo eliminar los certificados APN, veo la opción, pero está atenuada y no puedo seleccionarla.


En lugar de utilizar certificados APNS para notificaciones push, puede crear una clave APN y usarla para todas las aplicaciones.

APN Utilice el servicio de notificaciones push de Apple para sus solicitudes de notificación. Se utiliza una clave para todas sus aplicaciones. Para obtener más información, consulte la Guía de programación de notificaciones locales y remotas.

Incluso FCM apoya esto. ahora puede evitar el dolor de cabeza de crear un certificado APNS para cada ID de aplicación.


Esto es útil para entender el flujo.


Imagen cortesía de https://firebase.googleblog.com/2017/01/debugging-firebase-cloud-messaging-on.html

Has probado que el APN envía a la aplicación. Así que el certificado está bien.

Desde https://firebase.googleblog.com/2017/01/debugging-firebase-cloud-messaging-on.html que vinculaste, obtener una respuesta exitosa al hacer una llamada de enrollamiento solo significa que FCM está recibiendo el mensaje. No significa que el mensaje esté llegando a los APN.

Envíe un mensaje directamente usando el panel de notificaciones de Firebase, para ver si el FCM se está comunicando con los APN.

Si eso funciona, hay un problema con el formato de tu mensaje.

Si no funciona.

Asegurar:

  1. la prioridad del mensaje se establece en high , por lo que se envían de inmediato.

  2. "content_available": true

  3. desinstalar y reinstalar la aplicación

  4. compruebe el código de su servidor.