iOS 信鸽推送

最近在项目中集成了信鸽推送,记录下集成信鸽的过程.


一.下载信鸽SDK

下载地址  http://xg.qq.com/xg/apps/ctr_app 

二.到苹果开发者中心注册推送证书.

这部分如果不清楚可以看 信鸽的ios证书设置指南.

证书指南网址:

http://developer.qq.com/wiki/xg/iOS接入/iOS%20证书设置指南/iOS%20证书设置指南.html


这部分我遇到问题就是把导出的p12 文件转换成pem文件这里,指南里只给了一句代码,不熟悉命令行的同学看这里:

1).打开终端 cd desktop  回车

2)openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes回车


这就OK啦


记得把推送证书的名字改为 CertificateName或者上面的名字改openssl pkcs12 -in 你的证书的名字.p12 -out你的证书的名字.pem -nodes


就是记得改名字就行了


三 .接入SDK 


1)

  • 获取Access ID和Access Key

前往信鸽官网 http://xg.qq.com ,用QQ号登录,添加应用基本信息并注册,之后可获取Access ID和Access Key


2)

  • 工程配置

1、 下载信鸽SDK压缩包到本地并解压;

2、 创建或打开Xcode iOS工程;

3、 将XGSetting.h 和 XGPush.h 和 libXG-SDK.a添加到Xcode工程

4、 添加对以下libraries的引用。包括CFNetwork.framework , SystemConfiguration.framework , CoreTelephony.framework , libz.dylib , libXG-SDK.a,Security.framework


介入程序


在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;  中写入

#pragma mark 信鸽推送


    [XGPushstartApp:2200199136appKey:@"IYU4A5NJ561W"];//你注册的Access ID和Access Key

    

    [selfmanagerPush:launchOptions];//这个是我自己写的方法

    

    //获取推送的信息字典

    _remoteNotification = [launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

    

    if (_remoteNotification) {

        

        _isLaunchedByNotification =YES;//用来判断是否是点击推送进入项目

        

    }else {

    

        _isLaunchedByNotification =NO;

        

    }


//下面的方法把信鸽提供的方法统一到了一个方法里

-(void)managerPush:(NSDictionary *)launchOptions{

    //注销之后再次注册之前的准备

    void (^successCallback)(void) = ^(void){

        //如果变成需要注册状态

        if(![XGPushisUnRegisterStatus])

        {

            //iOS8注册push方法

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= _IPHONE80_

            

            float sysVer = [[[UIDevicecurrentDevice]systemVersion]floatValue];

            if(sysVer <8){

                [selfregisterNofitication];

            }

            else{

                [selfregisterPushForIOS8];

            }

#else

            //iOS8之前注册push方法

            //注册Push服务,注册后才能收到推送

            [self registerNofitication];

#endif

        }

    };

    [XGPushinitForReregister:successCallback];

    //推送反馈(app不在前台运行时,点击推送激活时)

    [XGPushhandleLaunching:launchOptions];

    

    //推送反馈回调

    void (^successBlock)(void) = ^(void){

        //成功之后的处理

        NSLog(@"[XGPush]handleLaunching's successBlock");

    };

    

    void (^errorBlock)(void) = ^(void){

        //失败之后的处理

        NSLog(@"[XGPush]handleLaunching's errorBlock");

    };

    

    //角标清0

    

    [[UIApplicationsharedApplication]setApplicationIconBadgeNumber:0];

    //清除所有通知(包含本地通知)

//    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    

    [XGPushhandleLaunching:launchOptionssuccessCallback:successBlockerrorCallback:errorBlock];

    

}

//iOS5之后注册通知

- (void) registerNofitication {

    [[UIApplicationsharedApplication]registerForRemoteNotificationTypes:(UIUserNotificationTypeAlert |UIUserNotificationTypeBadge |UIUserNotificationTypeSound)];

}


下面这两个方法并没有用到,但这些是成功通知的回调

//注册UserNotification成功的回调

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings

{

    //用户已经允许接收以下类型的推送

    //UIUserNotificationType allowedTypes = [notificationSettings types];

    

}

//按钮点击事件回调

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler{

    if([identifierisEqualToString:@"ACCEPT_IDENTIFIER"]){

        NSLog(@"ACCEPT_IDENTIFIER is clicked");

    }

    

    completionHandler();

}

下面   注册设备信息
在application: didRegisterForRemoteNotificationsWithDeviceToken中调用。

注意:设备的deviceToken由苹果下发,可能会产生变化。同一设备在开发环境和生产环境是不相同的。


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

    

//    NSString * deviceTokenStr = [XGPush registerDevice:deviceToken];

    

    void (^successBlock)(void) = ^(void){

        //成功之后的处理

        NSLog(@"[XGPush Demo]register successBlock");

        当程序未运行时 收到通知  通过_isLaunchedByNotification获得是否是通知启动的项目

此时可以做出判断 调子或者注册通知


        if (_isLaunchedByNotification) {


            if ([_remoteNotification[@"grabOrder"]integerValue]==31) {

                

                NSNotificationCenter *center = [NSNotificationCenterdefaultCenter];

                

                [center postNotificationName:@"grab"object:niluserInfo:nil];

                

            }

        }

    };

    

    void (^errorBlock)(void) = ^(void){

        //失败之后的处理

        NSLog(@"[XGPush Demo]register errorBlock");

    };

    设置账号与设备 可以选择自己需要的位置,我写到了登陆成功之后,注意 设置账号之后要调用注册deviceToken方法

    // 设置账号

//    [XGPush setAccount:@"131"];

    

    //注册设备

    NSString * deviceTokenStr = [XGPushregisterDevice:deviceTokensuccessCallback:successBlockerrorCallback:errorBlock];

    

    //如果不需要回调

    [XGPush registerDevice:deviceToken];

    

    _deviceToken = deviceToken;

    

    //打印获取的deviceToken的字符串

    NSLog(@"[XGPush Demo] deviceTokenStr is %@",deviceTokenStr);


}

//如果deviceToken获取不到会进入此事件

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

    

    NSString *str = [NSStringstringWithFormat:@"Error: %@",err];

    

    NSLog(@"[XGPush Demo]%@",str);

    

}

app运行时(无论前台还是后台运行) 收到通知会调用此接口


- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo

{

    _isLaunchedByNotification =YES;


    //推送反馈(app运行时)

    [XGPushhandleReceiveNotification:userInfo];

    

    //回调版本示例

    

     void (^successBlock)(void) = ^(void){

     //成功之后的处理

     NSLog(@"[XGPush]handleReceiveNotification successBlock");

     };

     

     void (^errorBlock)(void) = ^(void){

     //失败之后的处理

     NSLog(@"[XGPush]handleReceiveNotification errorBlock");

     };

    NSLog(@"userInfo%@",userInfo);

    

    

     void (^completion)(void) = ^(void){

     //完成之后的处理

         //userinfo里是运行时推送的弹窗信息

         

         int i =0;

         i = i+ [userInfo[@"badge"]intValue];

         [UIApplicationsharedApplication].applicationIconBadgeNumber=i;

         

         if (_isBackGround) {  //用这个bool值判断是否是从后台运行时打开 

             

             _isBackGround =NO;

             

         }else {   //不是后台运行时打开后的操作

                  }

         

     NSLog(@"[xg push completion]userInfo is %@",userInfo);


     };

     

     [XGPushhandleReceiveNotification:userInfosuccessCallback:successBlockerrorCallback:errorBlockcompletion:completion];

    

}

特别注意: 模拟器是不能收到通知的,调试通知的时候用真机调试.

另外,证书一定要对应.生产环境和开发环境要对应好.测试设备最好添加.

大家有遇到这里没写的问题可以留言,大家一起讨论(*^__^*) 



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值