文档章节

8.0消息推送

小春0618
 小春0618
发布于 2014/11/26 20:57
字数 1019
阅读 16
收藏 0

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

推送界面

用户推送

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

注册过程:

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中,行为能直接在推送消息进行,如回复消息,拒绝消息等总结就是三个方法进行注册

直接在推送消息进行回复


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

  • 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];

  • Maybe和Accept

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

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

    Decline和Accept


  • 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通知代理方法

    iOS6的通知代理方法

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

    添加本地推送的通知代理方法

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

    iOS 8推送的通知代理方法

  • - (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不会被调用

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

    推送的流程


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


本文转载自:http://blog.csdn.net/apple_app/article/details/39228221

小春0618
粉丝 8
博文 40
码字总数 10552
作品 0
海淀
程序员
私信 提问
加载中

评论(0)

Android 8.0 正式版要来了,预计 8 月初推出

Android 8.0 从预告到预览版推送,已有一段时间,谷歌此前仅透露正式版会在第三季度发布。 最新的消息,据 PhoneArena 报道,Android 8.0 正式版定于2017年8月中上旬推出。本月底,最后一个开...

王练
2017/07/20
4.2K
17
判断并打开系统设置

参考了这位博主的文章: http://www.jianshu.com/p/19602f48309b //在应用活跃的时候判断系统设置中的通知是否打开 (void)applicationDidBecomeActive:(UIApplication *)application { // R...

大侠LKS
2015/12/11
16
0
Android通知栏微技巧,8.0系统中通知栏的适配

版权声明:本文出自郭霖的博客,转载必须注明出处。 https://blog.csdn.net/sinyu890807/article/details/79854070 转载请注明出处:https://blog.csdn.net/guolinblog/article/details/7985...

guolin
2018/04/17
0
0
Android 8.0 正式版将要发布 谷歌还要建超人模型

Android 8.0正式版明天凌晨就要到来,而有关它的系统代号,谷歌迟迟没有公布,到底是哪个甜点代言呢,外界的猜测还没有停止。 从目前曝光的情况看,Android O的系统代号极有可能是OREO(奥利...

局长
2017/08/21
2.8K
8
安卓 8.0 正式版来了 下周开始推送!

目前,Android O(安卓8.0)已经推送了全部四个版本的开发者预览,基本面貌和轮廓定型。 按计划,谷歌有望在本月发布正式版,消息得到了著名安卓垂直媒体Android Police责任编辑David Ruddo...

局长
2017/08/04
4.5K
26

没有更多内容

加载失败,请刷新页面

加载更多

jenkins Euleros镜像打包

一、下载需要的软件 mkdir jenkins_software && cd jenkins_softwarewget --no-check-certificate -q https://mirrors.huaweicloud.com/epel/RPM-GPG-KEY-EPEL-7 -O RPM-GPG-KEY-EPEL-7......

mbzhong
8分钟前
8
0
Spring Boot 如何以 Web 应用的方式启动

在 Spring Boot 启动的时候,在进程完成后会自动退出。 如何让 Spring Boot 以 Web 方式启动,并且进程不退出呢? 需要确定下 Web 的这个依赖是否在你的依赖中。 <dependency> ...

honeymoose
37分钟前
78
0
leetcode892(三维形体的表面积)--C语言实现

求: 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。 请你返回最终形体的表面积。 示例 1: 输入:[[2]] 输出:...

拓拔北海
42分钟前
74
0
使用* args和** kwargs [重复] - Use of *args and **kwargs [duplicate]

问题: This question already has answers here : 这个问题已经在这里有了答案 : What does ** (double star/asterisk) and * (star/asterisk) do for parameters? **(双星号/星号)和*(......

技术盛宴
47分钟前
53
0
spring-boot之@ConfigurationProperties的使用

@ConfigurationProperties是什么? Using the @Value("${property}") annotation to inject configuration properties can sometimes be cumbersome, especially if you are working with mu......

书中迷梦
48分钟前
73
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部