How to get GCM notifications on ios

Hi I am new to iOS. In my project I want to receive GCM notifications for this, I wrote the code but it shows an exception and my code looks like this:

#import "AppDelegate.h"
#import <Google/CloudMessaging.h>
#import "GGLInstanceID.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


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

    UIUserNotificationType allNotificationTypes =  (UIUserNotificationTypeSound |
                                                    UIUserNotificationTypeAlert |  UIUserNotificationTypeBadge);
    UIUserNotificationSettings *settings =  [UIUserNotificationSettings
                                             settingsForTypes:allNotificationTypes categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    [[UIApplication sharedApplication] registerForRemoteNotifications];

    _registrationHandler = ^(NSString *registrationToken, NSError *error){
        if (registrationToken != nil) {
            weakSelf.registrationToken = registrationToken;
            NSLog(@"Registration Token: %@", registrationToken);
            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)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

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

    _registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken,
                             kGGLInstanceIDAPNSServerTypeSandboxOption:@YES};
    [[GGLInstanceID sharedInstance] tokenWithAuthorizedEntity:_gcmSenderID
                                                        scope:kGGLInstanceIDScopeGCM
                                                      options:_registrationOptions
                                                      handler:_registrationHandler];
}

- (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];

}

      

But it shows Exception as

unresolved identifier "_registrationHandler"

and "weakSelf" in didFinishLaunchingWithOptions method

, and this is an exception to a didRegisterForRemoteNotificationsWithDeviceToken

method like unresolved identifier "_registrationOptions"

.

Please help me.

+3


source to share


1 answer


Here I refactored your code and it should work now.

static NSString *const INSTANCE_ID_REGISTRATION_NOTIF_KEY = @"instance-id-token";
static NSString *const GCM_SENDER_ID = @"<your sender id>"; // @"123456"

@interface AppDelegate ()

    @property (nonatomic, strong, readwrite) GGLInstanceIDTokenHandler registrationHandler;
    @property (nonatomic, strong, readwrite) NSString *registrationToken;

@end

@implementation AppDelegate

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

        UIUserNotificationType allNotificationTypes =  (UIUserNotificationTypeSound |
                                                        UIUserNotificationTypeAlert |  UIUserNotificationTypeBadge);
        UIUserNotificationSettings *settings =  [UIUserNotificationSettings
                                                 settingsForTypes:allNotificationTypes categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];

        return YES;
    }


    - (void)application:(UIApplication *)application
        didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

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

        NSDictionary *registrationOptions = @{
            kGGLInstanceIDRegisterAPNSOption:deviceToken,
            kGGLInstanceIDAPNSServerTypeSandboxOption:@YES
        };

        __weak typeof(self) weakSelf = self;
        GGLInstanceIDTokenHandler handler = ^(NSString *registrationToken, NSError *error){
            typeof(weakSelf) strongSelf = weakSelf;

            NSDictionary *userInfo;
            if (registrationToken != nil) {
                strongSelf.registrationToken = registrationToken;
                NSLog(@"Registration Token: %@", registrationToken);
                userInfo = @{ @"registrationToken" : registrationToken };
            } else {
                NSLog(@"Registration to GCM failed with error: %@", error.localizedDescription);
                userInfo = @{ @"error" : error.localizedDescription };
            }

            [[NSNotificationCenter defaultCenter] postNotificationName:INSTANCE_ID_REGISTRATION_NOTIF_KEY
                                                                object:nil
                                                              userInfo:userInfo];

        };

        [[GGLInstanceID sharedInstance] tokenWithAuthorizedEntity:GCM_SENDER_ID
                                                            scope:kGGLInstanceIDScopeGCM
                                                          options:registrationOptions
                                                          handler:handler];
    }

    - (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];
    }

@end

      



PS: As @Epaga already pointed out, you should try to start with a simple obj-c tutorial because your compiler problems were very trivial.

+2


source







All Articles