最近在项目中集成了信鸽推送,记录下集成信鸽的过程.
一.下载信鸽SDK
下载地址 http://xg.qq.com/xg/apps/ctr_app
二.到苹果开发者中心注册推送证书.
这部分如果不清楚可以看 信鸽的ios证书设置指南.
证书指南网址:
http://developer.qq.com/wiki/xg/iOS接入/iOS%20证书设置指南/iOS%20证书设置指南.html
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();
}
注意:设备的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];
}
特别注意: 模拟器是不能收到通知的,调试通知的时候用真机调试.另外,证书一定要对应.生产环境和开发环境要对应好.测试设备最好添加.
大家有遇到这里没写的问题可以留言,大家一起讨论(*^__^*)