推送问题研究

相关网址: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方法。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值