前言
在实现本地通知之前, 我们需要清楚的明白本地通知和系统的通知中心是两个不同的概念,一个是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版本废弃掉了, 但还是有很多人在使用着,所以也是需要好好的了解一番.