相关网址:http://www.cocoachina.com/bbs/read.php?tid=290239
http://www.cocoachina.com/ios/20160316/15665.html
http://www.360doc.com/content/15/0123/14/11411827_443080937.shtml 推送证书的创建
推送问题研究:
1、推送原理:
直白的说就是三个步骤:
1、app发起注册通知的请求,苹果通知中心(APNS Server),给这个app分配一个device Token。
2、app把device Token和pem证书文件给到自己的服务器/第三方推送服务器平台,用于加密和识别。
3、服务器主动把要发送的信息和device Token和pem证书融合,发送给APNS Server,APNS Server进行pem校验判断这个信息是否符合苹果开发规则,根据device Token建立通道,把消息发送给app。
2、注册通知
分两种情况:
第一种:iOS8 、iOS9、iOS10下需要使用新的 API
//创建消息上面要添加的动作
UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
action1.identifier = kNotificationActionIdentifileStar;
action1.title = @"赞";
//当点击的时候不启动程序,在后台处理
action1.activationMode = UIUserNotificationActivationModeBackground;
//需要解锁才能处理(意思就是如果在锁屏界面收到通知,并且用户设置了屏幕锁,用户点击了赞不会直接进入我们的回调进行处理,而是需要用户输入屏幕锁密码之后才进入我们的回调),如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
action1.authenticationRequired = YES;
/*
destructive属性设置后,在通知栏或锁屏界面左划,按钮颜色会变为红色
如果两个按钮均设置为YES,则均为红色(略难看)
如果两个按钮均设置为NO,即默认值,则第一个为蓝色,第二个为浅灰色
如果一个YES一个NO,则都显示对应的颜色,即红蓝双色 (CP色)。
*/
action1.destructive = NO;
//第二个动作
UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
action2.identifier = kNotificationActionIdentifileComment;
action2.title = @"评论";
//当点击的时候不启动程序,在后台处理
action2.activationMode = UIUserNotificationActivationModeBackground;
//设置了behavior属性为 UIUserNotificationActionBehaviorTextInput 的话,则用户点击了该按钮会出现输入框供用户输入
action2.behavior = UIUserNotificationActionBehaviorTextInput;
//这个字典定义了当用户点击了评论按钮后,输入框右侧的按钮名称,如果不设置该字典,则右侧按钮名称默认为 “发送”
action2.parameters = @{UIUserNotificationTextInputActionButtonTitleKey: @"评论"};
//创建动作(按钮)的类别集合
UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
//这组动作的唯一标示
category.identifier = kNotificationCategoryIdentifile;
//最多支持两个,如果添加更多的话,后面的将被忽略
[category setActions:@[action1, action2] forContext:(UIUserNotificationActionContextMinimal)];
//创建UIUserNotificationSettings,并设置消息的显示类类型
UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObject:category]];
[[UIApplication sharedApplication] registerUserNotificationSettings:uns];
也可以不添加动作:
UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:uns];
第二种:iOS6 、iOS7、<iOS8下需要使用老的的 API
// iOS8.0 以前远程推送设置方式
// 定义远程通知类型(Remote.远程 - Badge.标记 Alert.提示 Sound.声音)
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
3、注册通知反馈
// 注册远程通知 -根据远程通知类型
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#pragma mark - 远程通知(推送)回调
/** 远程通知注册成功委托 */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"\n>>>[DeviceToken Success]:%@\n\n", token);
// [3]:向自己的服务器或者第三方推送服务器注册deviceToken
[GeTuiSdk registerDeviceToken:token];
}
/** 远程通知注册失败委托 */
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"\n>>>[DeviceToken Error]:%@\n\n", error.description);
}
4、推送在三种情况下的接收情况:
第一、程序在前台运行
不出现通知栏,直接执行方法:- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
第二、程序在后台运行
出现通知栏,并且app图标出现小红点。
当用户点击通知时:软件启动。执行方法:- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
当用户没有点击通知,而是点击通知里面的可操作按钮时候:通知消失,但是小红点还存在,不启动软件;稍后点击软件图标进入软件后,执行方法:- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
当用户点击app图标启动软件时:- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification这个方法不执行;网上说可以通过didFinishLaunchingWithOptions方法获取到通知内容方法如下:NSDictionary *dic = [NSDictionary dictionaryWithDictionary:[launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]];但使用本地推送测试不能,远程推送不能测试?
第三、程序处于休眠状态
通知栏显示通知,并且app图标出现小红点。
当用户点击app图标启动软件:网上没有提及?
当用户点击通知启动软件:网上说:didFinishLaunchingWithOptions可以获取到通知,但使用本地推送测试不能,远程推送不能测试?
5、和第三方推送平台结合
在第三方平台创建应用,注意创建应用时候名字和bundleID一定不可以错,同时上传发布和开发两种环境的pem文件。结果就是获取到了启动第三方的必备参数;比如:kGtAppId、、kGtAppKey、kGtAppSecret。。。
在注册通知之前,首现启动第三方sdk。同时就需要实现相应的一些delegate方法;比如:是否启动成功,监测链接是否成功的方法。。。
就是注册通知,在反馈通知里面获取到DeviceToken时候,向自己的服务器或者第三方推送服务器注册deviceToken
然后就是接受通知的相关delegate方法。