studio notificaciones google gcm enviar ios objective-c push-notification google-cloud-messaging apple-push-notifications

enviar - iOS Google Cloud Messaging(GCM) no recibe notificaciones remotas



notificaciones push javascript (2)

El error 2001 que se obtiene NO es kGGLInstanceIDOperationErrorCodeMissingKeyPair sino más bien kGCMServiceErrorCodeAlreadyConnected . Esto último significa que ya está conectado a GCM. Para depurar mejor esto, intentaría enviar una notificación de visualización al token del dispositivo, es decir, enviar este

$ post_json_encode = ''{"notification": {"body": "''. $ msg. ''"}, "to": "/ topics / global"}'';

En teoría, debe conectarse a GCM cuando su aplicación esté en primer plano y desconectarse cuando vaya al fondo. Luego puedes reconectarte nuevamente cuando pasas al primer plano.

La data payload y la data payload notification payload son aplicables en iOS y Android. En iOS, la diferencia es que la carga útil de notificación se envía a través de APNS, mientras que la carga útil de datos se envía a través de la conexión propia de GCM, que solo está allí cuando la aplicación está en primer plano. En la carga útil de notificaciones de Android se agregaron recientemente las nuevas notificaciones de visualización.

Problema:
iOS no recibe notificaciones remotas de GCM, pero no puede encontrar ninguna información relacionada con por qué este sería el caso.
La primera vez que implementa notificaciones push, no está seguro de cuál es la causa del problema.

Situación:
Actualmente estoy trabajando en la versión de iOS de una aplicación que utiliza GCM para notificaciones automáticas. Las notificaciones se reciben bien en Android, sin embargo, parece que no están recibiendo nada en iOS.

Cuando ejecuto la aplicación, la consola me muestra que todo está bien, tiene un token, está conectado a GCM y está suscrito a temas

aplicación [579: 45511] Token de registro: bk3RNwTe3H0: CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1pLTQ / 8t-5QNiXbYwZYEWiSFD-frQKlsV8lgI
aplicación [579: 45511] Conectado a GCM
app [579: 45511] Ya estoy suscrito a / topics / global

Sin embargo, no recibe ninguna notificación y cuando abro el Centro de notificaciones o abro Control Center, aparece el siguiente mensaje en la consola

aplicación [579: 45511] No se pudo conectar a GCM: la operación no pudo completarse. (com.google.gcm error 2001.)

lo cual no me dice mucho más que referirse a ...

/// Falta KeyPair.
kGGLInstanceIDOperationErrorCodeMissingKeyPair = 2001,

Por otro lado, cuando lo envío a segundo plano con la función de tareas múltiples y lo traigo de vuelta, obtengo esto de nuevo:

aplicación [579: 45511] Conectado a GCM
app [579: 45511] Ya estoy suscrito a / topics / global

Preparar:
He seguido las instrucciones de GCM para configurar en iOS e incluso me he referido al GcmExample.xcodeproj para la implementación (hasta el punto de que el código es exactamente el mismo).

Establezca info.plist para ''Modos de fondo requeridos'' -> ''La aplicación descarga contenido en respuesta a notificaciones push''

Se encontró con otra pregunta de stackoverflow (no se puede encontrar ahora) sobre GCM e IP que no están en la lista blanca, pero descartó que no sea el problema.

Código:

#import "AppDelegate.h" @interface AppDelegate () @property(nonatomic, strong) void (^registrationHandler) (NSString *registrationToken, NSError *error); @property(nonatomic, assign) BOOL connectedToGCM; @property(nonatomic, strong) NSString* registrationToken; @property(nonatomic, assign) BOOL subscribedToTopic; @end NSString *const SubscriptionTopic = @"/topics/global"; @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // [START_EXCLUDE] _registrationKey = @"onRegistrationCompleted"; _messageKey = @"onMessageReceived"; // Configure the Google context: parses the GoogleService-Info.plist, and initializes // the services that have entries in the file NSError* configureError; [[GGLContext sharedInstance] configureWithError:&configureError]; if (configureError != nil) { NSLog(@"Error configuring the Google context: %@", configureError); } _gcmSenderID = [[[GGLContext sharedInstance] configuration] gcmSenderID]; // [END_EXCLUDE] // Register for remote notifications UIUserNotificationType allNotificationTypes = (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge); UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; [[UIApplication sharedApplication] registerForRemoteNotifications]; // [END register_for_remote_notifications] // [START start_gcm_service] [[GCMService sharedInstance] startWithConfig:[GCMConfig defaultConfig]]; // [END start_gcm_service] __weak typeof(self) weakSelf = self; // Handler for registration token request _registrationHandler = ^(NSString *registrationToken, NSError *error){ if (registrationToken != nil) { weakSelf.registrationToken = registrationToken; NSLog(@"Registration Token: %@", registrationToken); [weakSelf subscribeToTopic]; NSDictionary *userInfo = @{@"registrationToken":registrationToken}; [[NSNotificationCenter defaultCenter] postNotificationName:weakSelf.registrationKey object:nil userInfo:userInfo]; } else { NSLog(@"Registration to GCM failed with error: %@", error.localizedDescription); NSDictionary *userInfo = @{@"error":error.localizedDescription}; [[NSNotificationCenter defaultCenter] postNotificationName:weakSelf.registrationKey object:nil userInfo:userInfo]; } }; [[NSNotificationCenter defaultCenter] postNotificationName:_messageKey object:nil userInfo:nil]; return YES; } - (void)subscribeToTopic { // If the app has a registration token and is connected to GCM, proceed to subscribe to the // topic if (_registrationToken && _connectedToGCM) { [[GCMPubSub sharedInstance] subscribeWithToken:_registrationToken topic:SubscriptionTopic options:nil handler:^(NSError *error) { if (error) { // Treat the "already subscribed" error more gently if (error.code == 3001) { NSLog(@"Already subscribed to %@", SubscriptionTopic); } else { NSLog(@"Subscription failed: %@", error.localizedDescription); } } else { self.subscribedToTopic = true; NSLog(@"Subscribed to %@", SubscriptionTopic); } }]; } } - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } // [START disconnect_gcm_service] - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. [[GCMService sharedInstance] disconnect]; // [START_EXCLUDE] _connectedToGCM = NO; // [END_EXCLUDE] } // [END disconnect_gcm_service] - (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. // Connect to the GCM server to receive non-APNS notifications [[GCMService sharedInstance] connectWithHandler:^(NSError *error) { if (error) { NSLog(@"Could not connect to GCM: %@", error.localizedDescription); } else { _connectedToGCM = true; NSLog(@"Connected to GCM"); // [START_EXCLUDE] [self subscribeToTopic]; // [END_EXCLUDE] } }]; } // [END connect_gcm_service] - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } // [START receive_apns_token] - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // [END receive_apns_token] // [START get_gcm_reg_token] // Start the GGLInstanceID shared instance with the default config and request a registration // token to enable reception of notifications [[GGLInstanceID sharedInstance] startWithConfig:[GGLInstanceIDConfig defaultConfig]]; _registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken, kGGLInstanceIDAPNSServerTypeSandboxOption:@YES}; [[GGLInstanceID sharedInstance] tokenWithAuthorizedEntity:_gcmSenderID scope:kGGLInstanceIDScopeGCM options:_registrationOptions handler:_registrationHandler]; // [END get_gcm_reg_token] } // [START receive_apns_token_error] - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"Registration for remote notification failed with error: %@", error.localizedDescription); // [END receive_apns_token_error] NSDictionary *userInfo = @{@"error" :error.localizedDescription}; [[NSNotificationCenter defaultCenter] postNotificationName:_registrationKey object:nil userInfo:userInfo]; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"Notification received: %@", userInfo); // This works only if the app started the GCM service [[GCMService sharedInstance] appDidReceiveMessage:userInfo]; // Handle the received message // [START_EXCLUDE] [[NSNotificationCenter defaultCenter] postNotificationName:_messageKey object:nil userInfo:userInfo]; // [END_EXCLUDE] } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler { NSLog(@"Notification received: %@", userInfo); // This works only if the app started the GCM service [[GCMService sharedInstance] appDidReceiveMessage:userInfo]; // Handle the received message // Invoke the completion handler passing the appropriate UIBackgroundFetchResult value // [START_EXCLUDE] [[NSNotificationCenter defaultCenter] postNotificationName:_messageKey object:nil userInfo:userInfo]; handler(UIBackgroundFetchResultNoData); // [END_EXCLUDE] } // [END ack_message_reception] // [START on_token_refresh] - (void)onTokenRefresh { // A rotation of the registration tokens is happening, so the app needs to request a new token. NSLog(@"The GCM registration token needs to be changed."); [[GGLInstanceID sharedInstance] tokenWithAuthorizedEntity:_gcmSenderID scope:kGGLInstanceIDScopeGCM options:_registrationOptions handler:_registrationHandler]; } // [END on_token_refresh] @end

ACTUALIZAR
backend php code para enviar un mensaje GCM

//------------------------------ // Payload data you want to send // to Android device (will be // accessible via intent extras) //------------------------------ $msg = addslashes($_POST["msg"]); //------------------------------ // The recipient registration IDs // that will receive the push // (Should be stored in your DB) // // Read about it here: // http://developer.android.com/google/gcm/ //------------------------------ //------------------------------ // Call our custom GCM function //------------------------------ sendGoogleCloudMessage( $msg ); echo "send"; //------------------------------ // Define custom GCM function //------------------------------ function sendGoogleCloudMessage( $msg ) { //------------------------------ // Replace with real GCM API // key from Google APIs Console // // https://code.google.com/apis/console/ //------------------------------ $apiKey = ''abc''; //------------------------------ // Define URL to GCM endpoint //------------------------------ $url = ''https://android.googleapis.com/gcm/send''; //------------------------------ // Set CURL request headers // (Authentication and type) //------------------------------ $headers = array( ''Authorization: key='' . $apiKey, ''Content-Type: application/json'' ); //------------------------------ // Initialize curl handle //------------------------------ $ch = curl_init(); //------------------------------ // Set URL to GCM endpoint //------------------------------ curl_setopt( $ch, CURLOPT_URL, $url ); //------------------------------ // Set request method to POST //------------------------------ curl_setopt( $ch, CURLOPT_POST, true ); //------------------------------ // Set our custom headers //------------------------------ curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); //------------------------------ // Get the response back as // string instead of printing it //------------------------------ curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); //------------------------------ // Set post data as JSON //------------------------------ $post_json_encode = ''{"data":{"message":"'' . $msg . ''"},"to":"/topics/global"}''; curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_json_encode ); //------------------------------ // Actually send the push! //------------------------------ $result = curl_exec( $ch ); //------------------------------ // Error? Display it! //------------------------------ if ( curl_errno( $ch ) ) { echo ''GCM error: '' . curl_error( $ch ); } //------------------------------ // Close curl handle //------------------------------ curl_close( $ch ); //------------------------------ // Debug GCM response //------------------------------ $arr_result = json_decode($result, true); foreach ($arr_result as $name => $value) { echo "<p>".$name .": ". $value ."</p>"; } }


Estaba enfrentando el mismo problema en iOS. Luego encontré la solución en el sitio web PushBots. Está funcionando bien para mí ahora.

En XCode, vaya a Objetivos> Configuraciones de compilación> Identidad de firma de código y asegúrese de que no sea automático y establezca el certificado de coincidencia de perfil vinculado a la Id. De la aplicación, por ejemplo