GCM通知不会在iOS中处于后台模式时收到

我在我现有的应用程序中configuration了GCM,并在那里接收通知。 现在我面临两个问题:1)我没有收到通知当我退出应用程序或应用程序在后台。 2)我没有收到iphone的通知区域通知,只有当我的应用程序正在运行我只直接接收警报消息那里。 当我拉下通知区域时,我在xcode的控制台中看到这条消息: “无法连接到GCM:操作无法完成(com.google.gcm error 2001.)”

我的PHP文件在下面

<?php // Payload data you want to send to iOSdevice(s) // (it will be accessible via intent extras) $data = array( 'message' => 'Hello World!'); // The recipient registration tokens for this notification // http://developer.android.com/google/gcm/ $ids = array( 'kucy6xoUmx********eeRsla' ); // Send a GCM push sendGoogleCloudMessage( $data, $ids ); function sendGoogleCloudMessage( $data, $ids ) { // Insert real GCM API key from Google APIs Console // https://code.google.com/apis/console/ $apiKey = 'AIz******9JA'; // Define URL to GCM endpoint $url = 'https://gcm-http.googleapis.com/gcm/send'; // Set GCM post variables (device IDs and push payload) $post = array( 'registration_ids' => $ids, 'data' => $data, ); // 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 JSON post data curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $post ) ); // Actually send the push $result = curl_exec( $ch ); // Error handling if ( curl_errno( $ch ) ) { echo 'GCM error: ' . curl_error( $ch ); } // Close curl handle curl_close( $ch ); // Debug GCM response echo $result; } ?> 

这是我的AppDelegate.m文件

 // [START register_for_remote_notifications] - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // [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]; NSAssert(!configureError, @"Error configuring Google services: %@", configureError); _gcmSenderID = [[[GGLContext sharedInstance] configuration] gcmSenderID]; // Register for remote notifications if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) { // iOS 7.1 or earlier UIRemoteNotificationType allNotificationTypes = (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge); [application registerForRemoteNotificationTypes:allNotificationTypes]; } else { // iOS 8 or later // [END_EXCLUDE] 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] GCMConfig *gcmConfig = [GCMConfig defaultConfig]; gcmConfig.receiverDelegate = self; [[GCMService sharedInstance] startWithConfig:gcmConfig]; // [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]; } }; 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); } }]; } } // [START connect_gcm_service] - (void)applicationDidBecomeActive:(UIApplication *)application { // 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] // [START disconnect_gcm_service] - (void)applicationDidEnterBackground:(UIApplication *)application { [[GCMService sharedInstance] disconnect]; // [START_EXCLUDE] _connectedToGCM = NO; // [END_EXCLUDE] } // [END disconnect_gcm_service] // [START receive_apns_token] - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // [END receive_apns_token] // [START get_gcm_reg_token] // Create a config and set a delegate that implements the GGLInstaceIDDelegate protocol. GGLInstanceIDConfig *instanceIDConfig = [GGLInstanceIDConfig defaultConfig]; instanceIDConfig.delegate = self; // Start the GGLInstanceID shared instance with the that config and request a registration // token to enable reception of notifications [[GGLInstanceID sharedInstance] startWithConfig:instanceIDConfig]; _registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken, kGGLInstanceIDAPNSServerTypeSandboxOption:@"NO"}; [[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]; } // [START ack_message_reception] - (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] // [START upstream_callbacks] - (void)willSendDataMessageWithID:(NSString *)messageID error:(NSError *)error { if (error) { // Failed to send the message. } else { // Will send message, you can save the messageID to track the message } } - (void)didSendDataMessageWithID:(NSString *)messageID { // Did successfully send message identified by messageID } // [END upstream_callbacks] - (void)didDeleteMessagesOnServer { // Some messages sent to this device were deleted on the GCM server before reception, likely // because the TTL expired. The client should notify the app server of this, so that the app // server can resend those messages. } 

我不是一个PHP脚本大师,所以请帮助我,我怎么能解决我的问题。

我已经添加了

  'content_available' => true,//to trigger when iOS app is in background 'priority' => 'high', 'notification' => $data, $data = array( 'message' => 'Hello World!', 'body' => 'Hello World!'); 

到你的代码。 请尝试下面的代码;

 <?php // Payload data you want to send to iOSdevice(s) // (it will be accessible via intent extras) $data = array( 'message' => 'Hello World!', 'body' => 'Hello World!'); // The recipient registration tokens for this notification // http://developer.android.com/google/gcm/ $ids = array( 'kucy6xoUmx********eeRsla' ); // Send a GCM push sendGoogleCloudMessage( $data, $ids ); function sendGoogleCloudMessage( $data, $ids ) { // Insert real GCM API key from Google APIs Console // https://code.google.com/apis/console/ $apiKey = 'AIz******9JA'; // Define URL to GCM endpoint $url = 'https://gcm-http.googleapis.com/gcm/send'; // Set GCM post variables (device IDs and push payload) $post = array( 'registration_ids' => $ids, 'data' => $data, 'content_available' => true, 'priority' => 'high', 'notification' => $data, ); // 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 JSON post data curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $post ) ); // Actually send the push $result = curl_exec( $ch ); // Error handling if ( curl_errno( $ch ) ) { echo 'GCM error: ' . curl_error( $ch ); } // Close curl handle curl_close( $ch ); // Debug GCM response echo $result; } ?> 

在IOS方面; 遵循GCM网站上的订单

编辑1:你可以尝试发送通知给ios;

我编辑你的PHP代码上面; 变化是;

'notification'=> $ data,

$ data = array('message'=>'Hello World!','body'=>'Hello World!');

GCM接收无效状态通知2。

为Android和iOS使用GCM集成的开发人员需要在Post调用中添加特定的内容到GCM服务器。 对于iOS:我们需要两个额外的东西来在iOS中进行相同的调用:'notification'=> $ data,'content_available'=>'true',

Apple推送通知服务要求content_available为true。 然后'通知'=> $数据可以帮助通知中心知道通知已经到达并且需要被推送到设备。