新手上路,也是最近才理通了iOS推送的整个逻辑,由于公司安卓和iOS要保持同步所以用的信鸽的SDK,但是本人感觉看了我这篇文章即使不借助第三方也是可以妥妥的搞通iOS的推送功能的,鄙人新手写的不好的地方请见谅,希望能给刚刚学习的学弟学妹们一点帮助吧,下面就开始吧!
1、首先登陆苹果的开发者中心,进入证书页
点击加号创建APPID
这一项一定要勾选,然后点击创建按钮,完成后就可以在APPIDS里面看到我们刚刚创建的APPID啦,然后点击它,往下拉会有一个编辑按钮,然后点击它
进入后往下拉就会看到此页面
制作这个CertificateSigningRequest东西的我就不说了网上都有的,选择制作好的CertificateSigningRequest,点击下一步在点击下载,下载完成后,双击这个证书就会自动弹出钥匙串,可以根据APPID的名称看到我们刚刚加入钥匙串的证书
然后选中这个证书点击鼠标右键,看到有个导出选项,点击到下面这个页面
点击储存的时候会让你输入密码随便输,记住就可以,等会转换pem格式证书的时候会用到,有的后台用的是PHP写的直接给他P12证书就可以了,但是有的需要pem证书
openssl pkcs12 -in 你的证书路径加名字.p12 -out 输出的路径加名字.pem -nodes 直接打开终端复制这句话进去,把证书直接拖进上面的“你的证书路径加名字.p12”,输出路径“输出的路径加名字.pem”,证书格式一定要pem的,然后点击回车键在会让你输入密码,然后就大功告成啦!
然后p12和pem证书就制作好了
之后就需要测试证书的可行性。
首先先说一下代码, 这是信鸽的推送设置,你们去他们的官网就能看到,(信鸽的demo写的还是算比较清楚的)
下面这些写到- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
这个方法里面
[XGPush startApp:787870890 appKey:@"I4K95FB23KNI"];
//注册通知
//注销之后需要再次注册前的准备
//如果变成需要注册状态
if(![XGPush isUnRegisterStatus])
{
//iOS8注册push方法
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= _IPHONE80_
float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue];
if(sysVer < 8){
[self registerNofitication];
}
else{
[self registerPushForIOS8];
}
#else
//iOS8之前注册push方法
//注册Push服务,注册后才能收到推送
[self registerNofitication];
#endif
}
//推送反馈回调版本示例
void (^successBlock)(void) = ^(void){
//成功之后的处理
NSLog(@"[XGPush]handleLaunching's successBlock");
};
void (^errorBlock)(void) = ^(void){
//失败之后的处理
NSLog(@"[XGPush]handleLaunching's errorBlock");
};
//角标清0
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
[XGPush handleLaunching:launchOptions successCallback:successBlock errorCallback:errorBlock];
//iOS5的推送方法
- (void)registerNofitication
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}
//iOS8以后的推送方法
- (void)registerPushForIOS8{
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= _IPHONE80_
//Types
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
//Actions
UIMutableUserNotificationAction *acceptAction = [[UIMutableUserNotificationAction alloc] init];
acceptAction.identifier = @"ACCEPT_IDENTIFIER";
acceptAction.title = @"Accept";
acceptAction.activationMode = UIUserNotificationActivationModeForeground;
acceptAction.destructive = NO;
acceptAction.authenticationRequired = NO;
//Categories
UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init];
inviteCategory.identifier = @"INVITE_CATEGORY";
[inviteCategory setActions:@[acceptAction] forContext:UIUserNotificationActionContextDefault];
[inviteCategory setActions:@[acceptAction] forContext:UIUserNotificationActionContextMinimal];
NSSet *categories = [NSSet setWithObjects:inviteCategory, nil];
UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
#endif
}
//这个我也没搞懂
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
//notification是发送推送时传入的字典信息
[XGPush localNotificationAtFrontEnd:notification userInfoKey:@"clockID" userInfoValue:@"myid"];
//删除推送列表中的这一条
[XGPush delLocalNotification:notification];
//[XGPush delLocalNotification:@"clockID" userInfoValue:@"myid"];
//清空推送列表
//[XGPush clearLocalNotifications];
}
//获取手机唯一标示的方法
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
//NSString * deviceTokenStr = [XGPush registerDevice:deviceToken];
void (^successBlock)(void) = ^(void){
//成功之后的处理
NSLog(@"[XGPush Demo]register successBlock");
};
void (^errorBlock)(void) = ^(void){
//失败之后的处理
NSLog(@"[XGPush Demo]register errorBlock");
};
//注册设备
XGSetting *setting = (XGSetting *)[XGSetting getInstance];
[setting setChannel:@"appstore"];
[setting setGameServer:@"巨神峰"];
NSString * deviceTokenStr = [XGPush registerDevice:deviceToken successCallback:successBlock errorCallback:errorBlock];
//如果不需要回调
//[XGPush registerDevice:deviceToken];
//打印获取的deviceToken的字符串
NSLog(@"____deviceTokenStr is %@",deviceTokenStr);
}
//如果deviceToken获取不到会进入此事件
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSString *str = [NSString stringWithFormat: @"Error: %@",err];
NSLog(@"[XGPush Demo]%@",str);
}
//处理APP在前端或者在后台收到的消息推送(就是app没有完全的退出的时候,就是没有双击home键把它划掉)
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
switch (application.applicationState) {
//app在前台 就是app在前台运行时
case UIApplicationStateActive:
{
ZZXAlert(@"这是在前台")
}
break;
//app在休眠 app进入了后台并且已经死了
case UIApplicationStateInactive:
{
ZZXAlert(@"这是在休眠")
}
break;
//app在后台 app在后台但是还没有死
case UIApplicationStateBackground:
{
ZZXAlert(@"这是在后台")
NSLog(@"推送信息——————————————%@",[userInfo objectForKey:@"orderId"]);
}
break;
default:
break;
}
NSLog(@"推送信息——————————————%@",[userInfo objectForKey:@"orderId"]);
NSLog(@"推送信息+++++++++++%@",userInfo);
}
如果app完全退出收到消息的方法就是这个方法。(其实就是app刚打开进入的那个方法)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
推送的内容 在这个launchOptions字典里面
NSString *alertStr = [[[launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"] objectForKey:@"aps"] objectForKey:@"alert"];
这样就可以拿到这个推送的提示内容啦。
//因为要测试app完全退出的的推送,就需要把程序从后台也退出,然后在xcode的控制台就看不到NSLog的输出了
要是想看这个字典的格式是可以这样做的,
只要数据线不断开一样可以看nslog的输出的。
第一次写博客,写的不好请见谅,这是我的QQ号:547834525,这是我的技术交流群:44261881 关于推送还不是很清楚的可以加我的QQ详聊。