8.0消息推送

Wesley13
• 阅读 692

一直更新了iOS8,但是一直没有开始研究这个iOS8,今天因为项目用到了推送,于是体验了iOS8的推送,先讲讲这个推送。目前分为四个推送:用户推送,本地推送,远程推送,地理位置推送。

8.0消息推送

用户推送

我们先开始讲这个用户推送,我们要使用之前必须先注册这个推送,用户要允许这个程序进行推送

注册过程:

if (IS_IOS8) {  
        //1.创建消息上面要添加的动作(按钮的形式显示出来)  
        UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];  
        action.identifier = @"action";//按钮的标示  
        action.title=@"Accept";//按钮的标题  
        action.activationMode = UIUserNotificationActivationModeForeground;//当点击的时候启动程序  
        //    action.authenticationRequired = YES;  
        //    action.destructive = YES;  
          
        UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];  
        action2.identifier = @"action2";  
        action2.title=@"Reject";  
        action2.activationMode = UIUserNotificationActivationModeBackground;//当点击的时候不启动程序,在后台处理  
        action.authenticationRequired = YES;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;  
        action.destructive = YES;  
          
        //2.创建动作(按钮)的类别集合  
        UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];  
        categorys.identifier = @"alert";//这组动作的唯一标示,推送通知的时候也是根据这个来区分  
        [categorys setActions:@[action,action2] forContext:(UIUserNotificationActionContextMinimal)];  
          
        //3.创建UIUserNotificationSettings,并设置消息的显示类类型  
        UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:[NSSet setWithObjects:categorys, nil nil]];  
        [application registerUserNotificationSettings:notiSettings];  
          
    }else{  
        [application registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];  
    }  
  
  - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings  
{  
//    UIUserNotificationSettings *settings = [application currentUserNotificationSettings];  
//    UIUserNotificationType types = [settings types];  
//    //只有5跟7的时候包含了 UIUserNotificationTypeBadge  
//    if (types == 5 || types == 7) {  
//        application.applicationIconBadgeNumber = 0;  
//    }  
    //注册远程通知  
    [application registerForRemoteNotifications];  
}

我们现在仅仅是注册了通知的设置,还要注册推送通知的行为,在iOS8中,行为能直接在推送消息进行,如回复消息,拒绝消息等总结就是三个方法进行注册

8.0消息推送

我们如何能进行这些行为,首先我们需注册这些行为。

  • Actions

  •   UIMutableUserNotificationAction *acceptAction = [[UIMutableUserNotificationAction alloc] init];  
      acceptAction.identifier = @"RickAction";  
      acceptAction.title = @"Accept";  
      acceptAction.activationMode = UIUserNotificationActivationModeBackground;  
      acceptAction.destructive = NO;  
      acceptAction.authenticationRequired = NO;
    
  • Categories

  •   UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init];  
      inviteCategory.identifier = @"INVITE_CATEGORY";  
      [inviteCategory setActions:@[acceptAction] forContext:UIUserNotificationActionContextDefault];
    
  • 8.0消息推送

    我们需要注意这个UIUserNotificationActionContextDefault,如果我们使用这个,我们会得到这个推送行为,Maybe和Accept

    我们还可以使用UIUserNotificationActionContextMinimal得到的是Decline和Accept行为

    8.0消息推送

  • Settings

    在这些行为注册之后,我们加上之前提到的推送设置就完成了注册推送的这个流程了

  •   NSSet *categories = [NSSet setWithObjects:inviteCategory, nil nil];  
      UIUserNotificationType  types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert ;  
      UIUserNotificationSettings  *mySettings  = [UIUserNotificationSettings settingsForTypes:types categories:categories];  
      [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    
  • 远程推送

    远程推送,所有消息大小不超过2KB,我们获取远程推送的json格式的消息,解析这个消息就是我们的远程推送了:

  •   {  
          “aps”: {  
              "content-available": 1,  
              "alert": "This is the alert text",  
              "badge": 1,  
              "sound": "default"  
          }  
      }
    
  • 若要使用远程推送,满足两个条件:一、用户需要调用注册用户推送registerUserNotificationSettings;二、在info.plist文件中UIBackgroundModes必须包含远程通知。

  •   [[UIApplication sharedApplication] registerForRemoteNotifications];
    
  •   - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {  
          NSString *token=[NSString stringWithFormat:@"%@",deviceToken];  
          token=[token stringByReplacingOccurrencesOfString:@"<" withString:@""];  
          token=[token stringByReplacingOccurrencesOfString:@">" withString:@""];  
          token=[token stringByReplacingOccurrencesOfString:@" " withString:@""];  
            
      }
    
  •   - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {  
           
      }
    
  • iOS7通知代理方法

    8.0消息推送

    后来又增加了本地通知的代理方法

    8.0消息推送

    iOS8的推送代理方法只有两个了

    8.0消息推送

  •   - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler  
      {  
      }  
        
      - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler  
      {  
      }  
        
      - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler  
      {  
          if ([identifier isEqualToString:@"RickAction"]) {  
              [self handleAcceptActionWithNotification:notification];  
          }  
          completionHandler();  
      }  
        
      - (void)handleAcceptActionWithNotification:(UILocalNotification*)notification  
      {  
      }
    
  • 地理位置推送

    这个推送是新的API才有的特性,必须配合CLLocation定位一起使用。

  •   //Location Notification  
          CLLocationManager *locMan = [[CLLocationManager alloc] init];  
          locMan.delegate = self;  
          [locMan requestWhenInUseAuthorization];  
        
      #pragma mark - CLLocationManager  
        
      - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status  
        
      {  
          BOOL canUseLocationNotifications = (status == kCLAuthorizationStatusAuthorizedWhenInUse);  
          if (canUseLocationNotifications) {  
              [self startShowLocationNotification];  
          }  
      }  
      - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification  
        
      {  
          CLRegion *region = notification.region;  
          if (region) {  
          }  
      }  
        
      - (void)startShowLocationNotification  
        
      {  
          CLLocationCoordinate2D local2D ;  
          local2D.latitude = 123.0;  
          local2D.longitude = 223.0;  
          UILocalNotification *locNotification = [[UILocalNotification alloc] init];  
          locNotification.alertBody = @"你接收到了";  
          locNotification.regionTriggersOnce = YES;  
          locNotification.region = [[CLCircularRegion alloc] initWithCenter:local2D radius:45 identifier:@"local-identity"];  
          [[UIApplication sharedApplication] scheduleLocalNotification:locNotification];  
      }
    
  • 如果没有开启Core Location 那么上面的didReceiveLocalNotification不会被调用

    最后再总结一下,整个推送流程我觉得是这样子的,先注册推送,然后推送消息,客户端接收推送消息,执行推送行为。如果有错误,还请在文章下面评论,欢迎指正。

    8.0消息推送

    这个博客写的也不错:http://blog.csdn.net/yujianxiang666/article/details/35260135

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
3分钟了解华为推送服务优势,第一项就让你心动!
消息推送(Pushnotification)指产品运营人员通过自身或三方的“推送服务”向用户主动地推送消息。简单来说,我们在移动设备(例如:手机)的通知中心或锁屏界面看到的消息都属于消息推送。作为消息推送的服务提供商之一,华为推送具有怎样的特点和优势?!在这里插入图片描述(https://imgblog.csdnimg.cn/202012221
Stella981 Stella981
3年前
Android 必备进阶之百度推送
写在前边今天给大家推送一篇关于百度推送的文章。我们手机上常用的App都会时不时的推送消息在我们的消息栏显示,常用的是QQ消息推送、微信消息推送、支付宝转账消息推送等。以后再做大大小小的项目都会用到推送,今天就总结了一篇用百度云做推送消息,以后做项目会经常用到的,有时间就学习一下吧!!(https://oscimg.oschin
Stella981 Stella981
3年前
JVM 字节码指令表
字节码助记符指令含义0x00nop什么都不做0x01aconst\_null将null推送至栈顶0x02iconst\_m1将int型1推送至栈顶0x03iconst\_0将int型0推送至栈顶0x04iconst\_1将int型1推送至栈顶0x05ic
Wesley13 Wesley13
3年前
IOS8 兼容本地推送
if (UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:))            {                UIApplication sharedApplication 
Stella981 Stella981
3年前
Easypush微信消息推送——打破传统的消息推送方式
通过使用EasyPush实现信息推送官网:https://easypush.baigekeji.com/Easypush从1.1.0(发行版)开始,进行行业模块分析,致力于高效下服务消息推送,将原先常见的推送开发模式统一封装,实现多种推送方式,目前仍在不断研发,在提服务提醒领域更加智能化(不定时更新)
Stella981 Stella981
3年前
Go实现基于WebSocket的弹幕服务
拉模式和推模式拉模式1、数据更新频率低,则大多数请求是无效的2、在线用户量多,则服务端的查询负载高3、定时轮询拉取,实时性低推模式1、仅在数据更新时才需要推送2、需要维护大量的在线长连接3、数据更新后可以立即推送基于webSocket推送1、浏览器支持的socket编
融云IM即时通讯 融云IM即时通讯
23小时前
融云IM干货丨如何衡量推送通知的及时性?
衡量推送通知的及时性可以通过以下几个指标来进行:推送到达时间:衡量从服务器发送推送通知到用户实际接收到通知的时间差。理想情况下,这个时间应该尽可能短,以确保信息的时效性。用户拒绝通知权限请求的速度:如果用户很快就拒绝接收通知权限请求,这可能意味着推送通知的
融云IM即时通讯 融云IM即时通讯
3星期前
融云干货丨Uni-app 集成 IM SDK,后台运行时,如何解决收到消息没有推送通知?
在Uniapp中集成IMSDK时,如果后台运行时收到消息没有推送通知,可以按照以下步骤进行排查和解决:确保推送服务已开通:首先需要确认是否已经开通了推送服务,并且在IM控制台中正确配置了推送信息。如果是使用融云IMSDK,参考融云技术文档检查推送证书配置:
融云IM即时通讯 融云IM即时通讯
23小时前
融云IM干货丨IM服务消息推送,推送通知失败时,SDK会提供哪些错误信息?
当推送通知失败时,SDK可能会提供以下错误信息:推送服务未开启或配置错误:确保已经在IM控制台开启了推送服务,并且正确配置了推送证书或密钥。设备未正确注册推送服务:检查设备是否成功注册到了推送服务,获取到了正确的设备令牌。应用权限问题:确保应用有发送通知的
融云IM即时通讯 融云IM即时通讯
23小时前
融云IM干货丨如果用户不在线,推送通知会怎样处理?
如果用户不在线,融云的推送通知会按照以下方式处理:离线消息推送:当用户不在线时,融云会将收到的单聊消息、群聊消息、系统消息、超级群消息通过第三方推送厂商或融云自建的推送服务通知客户端。这意味着即使用户的应用没有运行,他们也能通过系统通知栏接收到消息提醒。服