本地通知的实现

前言

在实现本地通知之前, 我们需要清楚的明白本地通知和系统的通知中心是两个不同的概念,一个是UILocalNotification, 另一个是NSNotificationCenter, 并且UILocalNotification在iOS10版本就被废弃掉, 官方文档中提示使用UserNotifications库中的UNNotificationRequest来代替实现本地通知, 但是在了解UNNotificationRequest之前我们还是学习一下UILocalNotification方式来实现本地通知.

一, UILocalNotification的属性

     // 设置系统发送通知的时间(假设时间为过去的时间或者是0,那么就会立刻发起通知)
     @property(nullable, nonatomic,copy) NSDate *fireDate;
     
     // 设置时间的时区
     @property(nullable, nonatomic,copy) NSTimeZone *timeZone;
     
     // 设置周期性通知, 默认是0
     @property(nonatomic) NSCalendarUnit repeatInterval;
     
     // NSCalendarUnit对象是枚举,设定通知的周期
     @property(nullable, nonatomic,copy) NSCalendar *repeatCalendar;
     
     // location-based scheduling
     
     // 设置CLRegion对象以在用户进入或离开地理区域时触发通知
     @property(nullable, nonatomic,copy) CLRegion *region
     
     // 如果YES,通知将只触发一次。如果NO,则每次输入或退出区域时(取决于clregion对象的配置),都会触发通知。默认为“YES”。
     @property(nonatomic,assign) BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);
     
     // 默认为nil, 通知的内容主体
     @property(nullable, nonatomic,copy) NSString *alertBody;
     
     // 是否隐藏滑动启动按钮, 默认是YES
     @property(nonatomic) BOOL hasAction;
     
     // 设置滑动打开的提示文字
     @property(nullable, nonatomic,copy) NSString *alertAction;
     
     // 设置滑动打开的图片
     @property(nullable, nonatomic,copy) NSString *alertLaunchImage;
     
     // 标题
     @property(nullable, nonatomic,copy) NSString *alertTitle;
     
     // 提示音乐UILocalNotificationDefaultSoundName
     
     @property(nullable, nonatomic,copy) NSString *soundName;
     
     // 头标, 默认为0
     @property(nonatomic) NSInteger applicationIconBadgeNumber;
     
     // 通知字典信息
     @property(nullable, nonatomic,copy) NSDictionary *userInfo;
     
     // category identifer of the local notification, as set on a UIUserNotificationCategory and passed to +[UIUserNotificationSettings settingsForTypes:categories:]
     @property (nullable, nonatomic, copy) NSString *category;
     
     @end
     
     // 提示音乐
     UIKIT_EXTERN NSString *const UILocalNotificationDefaultSoundName

二, UILocalNotification的实现步骤:

  • 2.1, 授权: 需要在程序启动的时候添加询问授权并注册
  //如果已经得到授权,就直接添加本地通知,否则申请询问授权
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[UIApplication sharedApplication]currentUserNotificationSettings].types!=UIUserNotificationTypeNone) {
         // 允许接收通知
    }else{
        [[UIApplication sharedApplication]registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound  categories:nil]];

        // 不允许接收通知
    }
    return YES;
}

  • 2.2, 添加本地通知的一下方法
-(void)addLocalNotification{
    //定义本地通知对象
    UILocalNotification *notification=[[UILocalNotification alloc]init];
    //设置调用时间
    notification.fireDate=[NSDate dateWithTimeIntervalSinceNow:0];//立即触发
    //设置通知属性
    notification.alertBody=@"这里是信息主体"; //通知主体
    notification.applicationIconBadgeNumber=1;//应用程序图标右上角显示的消息数
    notification.soundName=UILocalNotificationDefaultSoundName;//收到通知时播放的声音,默认消息声音
    //调用通知
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
  • 2.3, 当应用进入前台后需要将右上角的头标清除掉
-(void)applicationWillEnterForeground:(UIApplication *)application{
    [[UIApplication sharedApplication]setApplicationIconBadgeNumber:0];//进入前台取消应用消息图标
}

// 假设我们不在需要这个通知时, 需要直接清除
[[UIApplication sharedApplication] cancelAllLocalNotifications];

注意点:
前面我们提到了一个属性userInfo, 它是字典, 这个是通知的主体信息字典.我们可以在注册的时候将这个参数设置, 然后当我们接受到通知后,直接使用get方法获取即可.但是获取该字典的时需要注意App的状态:
1, 假设APP在前台或者后台进入前台时, 则我们在-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;这个方法中获取字典信息.
2, 假设App已关闭或者进程被杀死, 则需要在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;方法中获取到我们的参数

 //接收通知参数   
  UILocalNotification *notification=[launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    NSDictionary *userInfo= notification.userInfo;

这是简易封装后的本地通知UILocalNotification方式本地通知

总结

UILocalNotification方式已经在ios10版本废弃掉了, 但还是有很多人在使用着,所以也是需要好好的了解一番.

你可能感兴趣的:(本地通知的实现)