问题描述:

I followed this tutorial https://developers.google.com/cloud-messaging/ios/client to implement Google Cloud Messaging on my iOS application. I use google app engine as server side and the java library for GCM to send messages and it works perfectly for my Android application. However my iOS application does not receive messages from it.

I don't understand why because I do get the registration token and send it to my server side. I don't get any error log. Here is my AppDelegate.m code:

#import "AppDelegate.h"

@interface AppDelegate ()

@property (nonatomic, strong) NSDictionary *registrationOptions;

@property (nonatomic, strong) GGLInstanceIDTokenHandler registrationHandler;

@end

@implementation AppDelegate

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

//-- Start the GCMService

[[GCMService sharedInstance] startWithConfig:[GCMConfig defaultConfig]];

if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])

{

// iOS 8 Notifications

[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];

[application registerForRemoteNotifications];

}

else

{

// iOS < 8 Notifications

[application registerForRemoteNotificationTypes:

(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];

}

self.registrationHandler = ^(NSString *registrationToken, NSError *error){

if (registrationToken != nil) {

//I do get the token, and I can store it

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:registrationToken forKey:CLE_TOKENGCM];

NSLog(@"Registration Token: %@", registrationToken);

} else {

NSLog(@"Registration to GCM failed with error: %@", error.localizedDescription);

}

};

return YES;

}

- (void)application:(UIApplication *)application

didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

// Start the GGLInstanceID shared instance with the default config and request a registration

// token to enable reception of notifications

NSLog(@"didRegisterForRemoteNotificationsWithDeviceToken");

[[GGLInstanceID sharedInstance] startWithConfig:[GGLInstanceIDConfig defaultConfig]];

self.registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken,

kGGLInstanceIDAPNSServerTypeSandboxOption:@NO};//I tried both YES and NO value

[[GGLInstanceID sharedInstance] tokenWithAuthorizedEntity:SENDER_ID

scope:kGGLInstanceIDScopeGCM

options:self.registrationOptions

handler:self.registrationHandler];

}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {

NSLog(@"Error in registration. Error: %@", err);

}

- (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:SENDER_ID

scope:kGGLInstanceIDScopeGCM

options:self.registrationOptions

handler:self.registrationHandler];

}

- (void)application:(UIApplication *)application

didReceiveRemoteNotification:(NSDictionary *)userInfo

fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler {

NSLog(@"Notification received: %@", userInfo);//This log never prints so the method is never called

// 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

// ...

}

- (void)application:(UIApplication *)application

didReceiveRemoteNotification:(NSDictionary *)userInfo {

NSLog(@"Notification received: %@", userInfo);//This log never prints so the method is never called

// 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

// ...

}

@end

网友答案:

Thanks to ztan comment and to the Google GCM sample, I found out what was wrong: I had to implement applicationDidBecomeActive: like this:

- (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 {
            NSLog(@"Connected to GCM");
            // ...
        }
    }];
}
相关阅读:
Top