本地推送

作者: iOS_Ru | 来源:发表于2018-03-21 11:02 被阅读18次

    一、创建本地通知事例详解

    首先本地推送分为iOS10之前的版本 和 之后的版本
    iOS之后的版本 有一些新的功能
    首先申请权限不区分本地和远程推送了
    利用独立的UserNotifications.framework框架来管理通知;并且增加了撤销单条通知、更新已展示通知、中途修改通知内容等等,以及在通知中展示图片视频,自定义通知UI等一系列新功能;总之,iOS 10的通知功能十分强大。
    iOS10之后的授权

    // 获取通知授权和设置    
    [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {        
    /*         
    UNAuthorizationStatusNotDetermined : 没有做出选择         
    UNAuthorizationStatusDenied : 用户未授权         
    UNAuthorizationStatusAuthorized :用户已授权         
    */        
    if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) 
    {                       
          NSLog(@"未选择");                  
    }else if (settings.authorizationStatus == UNAuthorizationStatusDenied){                        
          NSLog(@"未授权");                   
    }else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized){                      
          NSLog(@"已授权");        
    }       
    }];
    
    
    UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];    
    // 请求授权    
    /*     
    UNAuthorizationOptionBadge   = (1 << 0),     
    UNAuthorizationOptionSound   = (1 << 1),     
    UNAuthorizationOptionAlert   = (1 << 2),     
    UNAuthorizationOptionCarPlay = (1 << 3),     
    */    
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge)                          completionHandler:^(BOOL granted, NSError * _Nullable error) {                             
    }];
    
    

    iOS10之前的授权

        // 注册本地通知
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge) categories:nil];
        
        //注册通知
        [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
    

    iOS10之后的本地通知的创建

    - (void)creatLocalPushIOS10{
        
        
        //注册
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    //    [center setDelegate:self];  这里如果设置了代理 就不会走之前的appdelegate里面的didReceiveLocalNotification方法了 就走代理的方法  如果不设置还是会默认走之前的didReceiveLocalNotification方法
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge |UNAuthorizationOptionSound ) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    
            if (granted) {
                NSLog(@"授权成功");
            }else {
                NSLog(@"没有授权");
            }
    
        }];
        [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
            NSLog(@"%@",settings);
        }];
        
        
        // 创建本地通知也需要在appdelegate中心进行注册
        // 1.创建通知内容
        UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
        content.title = @"本地通知标题";
      
        content.subtitle = @"本地通知副标题";
        content.body = @"本地通知内容";
        content.badge = @1;
        NSError *error = nil;
        NSString *path = [[NSBundle mainBundle] pathForResource:@"imageName@2x" ofType:@"png"];
        // 2.设置通知附件内容
        NSMutableDictionary *optionsDict = [NSMutableDictionary dictionary];
        // 一个包含描述文件的类型统一类型标识符(UTI)一个NSString。如果不提供该键,附件的文件扩展名来确定其类型,常用的类型标识符有 kUTTypeImage,kUTTypeJPEG2000,kUTTypeTIFF,kUTTypePICT,kUTTypeGIF ,kUTTypePNG,kUTTypeQuickTimeImage等。
        
        // 需要导入框架 #import<MobileCoreServices/MobileCoreServices.h>
        optionsDict[UNNotificationAttachmentOptionsTypeHintKey] = (__bridge id _Nullable)(kUTTypeImage);
        // 是否隐藏缩略图
    //    optionsDict[UNNotificationAttachmentOptionsThumbnailHiddenKey] = @YES;
        // 剪切缩略图
        optionsDict[UNNotificationAttachmentOptionsThumbnailClippingRectKey] = (__bridge id _Nullable)((CGRectCreateDictionaryRepresentation(CGRectMake(0.25, 0.25, 0.5 ,0.5))));
        // 如果附件是影片,则以第几秒作为缩略图
    //    optionsDict[UNNotificationAttachmentOptionsThumbnailTimeKey] = @1;
        // optionsDict如果不需要,可以不设置,直接传nil即可
        UNNotificationAttachment *att = [UNNotificationAttachment attachmentWithIdentifier:@"identifier" URL:[NSURL fileURLWithPath:path] options:optionsDict error:&error];
        if (error) {
            NSLog(@"attachment error %@", error);
        }
        content.attachments = @[att];
        content.launchImageName = @"imageName@2x";
        // 2.设置声音
        UNNotificationSound *sound = [UNNotificationSound defaultSound];
        content.sound = sound;
        // 3.触发模式 多久触发,是否重复
        // 3.1 按秒 这里如果设置为YES 那么时间间隔必须大于60秒 否则会崩溃报错
        UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:61  repeats:YES];
        // 3.2 按日期
        //    // 周二早上 9:00 上班
        //    NSDateComponents *components = [[NSDateComponents alloc] init];
        //    // 注意,weekday是从周日开始的计数的
        //    components.weekday = 3;
        //    components.hour = 9;
        //    UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];
        // 3.3 按地理位置
        // 一到某个经纬度就通知,判断包含某一点么
        // 不建议使用!!!!!!CLRegion *region = [[CLRegion alloc] init];
        
        //    CLCircularRegion *circlarRegin = [[CLCircularRegion alloc] init];
        //    // 经纬度
        //    CLLocationDegrees latitudeDegrees = 123.00; // 维度
        //    CLLocationDegrees longitudeDegrees = 123.00; // 经度
        //
        //    [circlarRegin containsCoordinate:CLLocationCoordinate2DMake(latitudeDegrees, longitudeDegrees)];
        //    UNLocationNotificationTrigger *trigger = [UNLocationNotificationTrigger triggerWithRegion:circlarRegin repeats:NO];
        
        
        // 4.设置UNNotificationRequest
        NSString *requestIdentifer = @"TestRequest";
        UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger];
        
        //5.把通知加到UNUserNotificationCenter, 到指定触发点会被触发
        [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
            
            NSLog(@"添加成功");
        }];
        
    }
    
    //代理方法如下
    //Ios 10之后如果设置了代理 就会走这个方法
    #pragma mark - UNUserNotificationCenterDelegate
    // iOS10 推送回调
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
        NSDictionary *userInfo = notification.request.content.userInfo;
        UNNotificationRequest *request = notification.request; // 收到推送的请求
        UNNotificationContent *content = request.content; //收到推送消息的全部内容
        NSNumber *badge = content.badge; // 推送消息的角标
        NSString *body = content.body; // 收到推送消息具体内容
        UNNotificationSound *sound = content.sound; //声音
        NSString *subTitle = content.subtitle; // 推送收到的副标题
        NSString *title = content.title; // 推送收到的标题
        
        if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
            NSLog(@"iOS10 收到远程通知");
        }else{
            NSLog(@"ios10 收到本地通知%@%@%@%@%@",title,subTitle,body,badge,userInfo);
        }
        completionHandler(UNNotificationPresentationOptionBadge |
                          UNNotificationPresentationOptionSound |
                          UNNotificationPresentationOptionAlert );
        // 需要执行此方法,选择是否提醒用户,有以上三种那个类型可选
        
    }
    // 通知的点击事件
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
        NSDictionary *userInfo = response.notification.request.content.userInfo;
        UNNotificationRequest *request = response.notification.request;
        UNNotificationContent *content = request.content; //收到推送消息的全部内容
        NSNumber *badge = content.badge; // 推送消息的角标
        NSString *body = content.body; // 收到推送消息具体内容
        UNNotificationSound *sound = content.sound; //声音
        NSString *subTitle = content.subtitle; // 推送收到的副标题
        NSString *title = content.title; // 推送收到的标题
        NSLog(@">>>通知的点击事件");
        if ([request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
            NSLog(@"iOS10 收到远程通知");
        }else{
            NSLog(@"ios10 收到本地通知%@%@%@%@%@",title,subTitle,body,badge,userInfo);
        }
        completionHandler(); //系统要求执行此方法
        
    }
    
    
    
    
    
    
    iOS10后的补充
    UserNotifications提供了三种触发器:
    UNTimeIntervalNotificationTrigger :一定时间后触发
    UNCalendarNotificationTrigger : 在某月某日某时触发
    UNLocationNotificationTrigger : 在用户进入或是离开某个区域时触发
    
    - 移除还未展示的通知
    [center removePendingNotificationRequestsWithIdentifiers: @[@“rjb_notification”
    ]];
    [center removeAllPendingNotificationRequests]; //  - (void)cancelAllLocalNotifications;
    - 移除已经展示过的通知
    [center removeDeliveredNotificationsWithIdentifiers:@[@“ rjb_notification”
    ]];
    [center removeAllDeliveredNotifications];
    - 获取未展示的通知    
    [center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
       NSLog(@"%@",requests);    
    }];    
    - 获取展示过的通知    
    [center getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> * _Nonnull notifications) { 
      NSLog(@"%@",notifications);
    }];
    
    
    
    
    

    demo 地址: https://github.com/rjb0514/LocalNotification

    参考:https://www.cnblogs.com/fishbay/p/7206827.html
    https://www.jianshu.com/p/3d602a60ca4f

    相关文章

      网友评论

      • iOS_Ru:app名称改了 推送显示的还是老名字。 目前解决办法是:1、删除应用重新下载 2.重启手机
      • iOS_Ru:app名称改了 推送显示的还是老名字。
      • iOS_Ru:记录一个问题:最近在做应用 修改名称的工作,之前的已经上线的应用 现在要进行名称的更改,在以新名称进行appstore提交更改后,审核也通过了,更新后,收到的推送通知,应用名称显示的 还是 没改之前的名称, 设置里的 通知 选项的 还是之前的名称, 后来重启了一下手机,收到的推送通知都正常了,这里记录一下!

      本文标题:本地推送

      本文链接:https://www.haomeiwen.com/subject/mumbqftx.html