iOS 信鸽推送

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 04:41   123   0

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


一.下载信鸽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];

}

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

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

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



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP