推送通知跟NSNotification的区别:
(1)NSNotification是抽象的,不可见的
(2)推送通知是可见的(能用肉眼看到)
iOS中提供了2种推送通知
(1)本地推送通知(Local Notification)
(2)远程推送通知(Remote Notification)//Remote远程的
推送通知的作用:可以让不在前台运行的app,告知用户app内部发生了什么事情
本地通知
本地通知是由本地应用触发的,它是基于时间行为的一种通知形式。不需要联网就能发出的推送通知(不需要服务器的支持)。
常用来定时提醒用户完成一些任务,比如:清理垃圾、记账、买衣服、看电影、玩游戏、吃药。
步骤:
- 创建UILocalNotification。
- 设置处理通知的时间fireDate。
- 配置通知的内容:通知主体、通知声音、图标数字等。
- 配置通知传递的自定义数据参数userInfo(这一步可选)。
- 调用通知,可以使用scheduleLocalNotification:按计划调度一个通知,也可以使用presentLocalNotificationNow立即调用通知。
获得被调度(定制)的所有本地推送通知 (已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
//调度本地通知
- (void)scheduleLocalNotification:(UILocalNotification *)notification;
立即发出本地推送通知,比如QQ收到消息,但是运行在前台使用没有意义。
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;
✨当用户点击本地推送通知,会自动打开app,这里有2种情况
1⃣️app并没有关闭,一直隐藏在后台
让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
2⃣️app已经被关闭(进程已死)
启动app,启动完毕会调用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象
AppDelegate.h文件中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {/* UIUserNotificationTypeNone = 0, 没有,没有本地通知
UIUserNotificationTypeBadge = 1 << 0, 接受图标右上角提醒数字
UIUserNotificationTypeSound = 1 << 1, 接受通知时候,可以发出音效
UIUserNotificationTypeAlert = 1 << 2, 接受提醒(横幅/弹窗)
*/
//兼容iOS7.0及以后的版本, 版本适配
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]]; //要使用本地通知,需要得到用户的许可}
//被杀掉进程后,接收本地通知
UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (notification) {
//应用程序是点击本地通知启动的 可以在这里添加逻辑:添加新的控件、显示新的东西UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:notification.userInfo[@"notification"] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
return YES;
}
#pragma mark 调用过用户注册通知方法之后执行(也就是调用完registerUserNotificationSettings:方法之后执行)
//接收本地通知, 应用程序在后台
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
NSLog(@"%@", notification.userInfo[@"notification"]);
//取消本地通知
[application cancelLocalNotification:notification];
}
#pragma mark 进入前台后设置消息信息
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[UIApplication sharedApplication]setApplicationIconBadgeNumber:0];// 默认0 进入前台取消应用消息图标
}
.m文件中
- (IBAction)addNotification:(id)sender {
//1.注册通知
//实例化通知对象
UILocalNotification *notification = [[UILocalNotification alloc] init];
//通知发出的时间, 当前时间7秒钟之后
notification.fireDate = [[NSDate date] dateByAddingTimeInterval:7];
//设置循环提醒
//循环标准的日历
notification.repeatCalendar = [NSCalendar currentCalendar];
//循环的标准 通知重复次数
notification.repeatInterval = NSCalendarUnitMinute;
//时区
notification.timeZone = [NSTimeZone defaultTimeZone];
//提醒的内容
notification.alertBody = @"今天没吃药,吃药时间到了。";
notification.alertAction = @"打开"; //待机界面的滑动动作提示
//提醒的声音
notification.soundName = @"msgcome.wav";
notification.alertLaunchImage=@"";//通过点击通知打开应用时的启动图片
//应用程序图标右上角显示的消息数
notification.applicationIconBadgeNumber = 1;
//附加的备注信息
notification.userInfo = @{@"notification" : @"吃药"};
//2.调用通知
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
使用通知的注意事项:
保证标记的内容是最新的
- 对同一事件不要发出多个通知
- 通知内容不用包含应用程序的名称
- 对于标记型通知,当所有的事项都解决后,标记会自动消失
- 在横幅和提醒中,以及顶部的通知中心里,iOS系统会自动在消息里显示应用程序的名称, 所以在设计通知的内容时,就无需包含app的名称了
- 关注于信息的表达,而不是用户的动作。避免提示用户去点哪一个按钮或者是怎样打开app
- 简短,最好不超过两行。长信息难以快速阅读,而且必然会有滚动条
- 使⽤用句式大写(sentence-style capitalization,第一个单词的首字母大写)和合适的标点符号,结尾一般使用句号
效果:
7秒之后:
点击后进入程序: