推送通知
• 推送通知是可见的(能用肉眼看到)
● iOS中提供了2种推送通知
-
● 本地推送通知(Local Notification)
-
● 远程推送通知(Remote Notification)
● 推送通知的作用
● 在屏幕顶部显示一块横幅(显示具体内容)
● 在屏幕中间弹出一个UIAlertView(显示具体内容)
● 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
● 播放音效(提醒作用)
● 发出推送通知时,如果程序正运行在前台,那么推送通知就不会被呈现出来
● 不管app打开还是关闭,推送通知都能如期发出
● 顾名思义,就是不需要联网就能发出的推送通知(不需要服务器的支持)
● 本地推送通知的使用场景
● 常用来定时提醒用户完成一些任务,比如
• 清理垃圾、记账、买衣服、看电影、玩游戏
如何发出本地推送通知
UILocalNotification *ln = [[UILocalNotification alloc] init];
● 设置本地推送通知属性
● 推送通知的触发时间(何时发出推送通知)
@property(nonatomic,copy) NSDate *fireDate;
● 推送通知的具体内容
@property(nonatomic,copy) NSString *alertBody;
● 锁屏界面显示的小标题(完整小标题:“滑动来” + alertAction)
@property(nonatomic,copy) NSString *alertAction;
● 音效文件名
@property(nonatomic,copy) NSString *soundName;
● app图标数字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
● 获得被调度的所有本地推送通知(等待发出的通知)
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)
● 取消调度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;
● 立即发出本地推送通知(使用价值:app在后台运行的时候)
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;
本地推送通知的其他属性
@property(nonatomic) NSCalendarUnit repeatInterval;
● 点击推送通知打开app时显示的启动图片
@property(nonatomic,copy) NSString *alertLaunchImage;
● 附加的额外信息
@property(nonatomic,copy) NSDictionary *userInfo;
● 时区
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)
点击本地推送通知
● app并没有关闭,一直隐藏在后台
• 让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
- (void)application:(UIApplication *)application
didReceiveLocalNotification:(UILocalNotification *)notification;
● app已经被关闭(进程已死)
• 启动app,启动完毕会调用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
● launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey 取出本地推送通知对象
实例:
#import "HMAppDelegate.h" #import "HMViewController.h" @interface HMAppDelegate() @property (nonatomic, weak) UILabel *label; @end @implementation HMAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // NSLog(@"------didFinishLaunchingWithOptions---%@"); UILabel *label = [[UILabel alloc] init]; label.backgroundColor = [UIColor redColor]; label.frame = CGRectMake(0, 100, 200, 100); label.font = [UIFont systemFontOfSize:11]; label.numberOfLines = 0; [[[self.window.rootViewController.childViewControllers firstObject] view] addSubview:label]; UILocalNotification *note = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]; if (note) { label.text = @"点击本地通知启动的程序"; HMViewController *homeVc = [self.window.rootViewController.childViewControllers firstObject]; [homeVc performSegueWithIdentifier:@"home2detail" sender:note]; } else { label.text = @"直接点击app图标启动的程序"; } self.label = label; return YES; } /** * 当用户点击本地通知进入app的时候调用 、通知发出的时候(app当时并没有被关闭) */ - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { // self.label.text = [NSString stringWithFormat:@"点击通知再次回到前台---%d", application.applicationState]; // 程序正处在前台运行,直接返回 if (application.applicationState == UIApplicationStateActive) return; HMViewController *homeVc = [self.window.rootViewController.childViewControllers firstObject]; [homeVc performSegueWithIdentifier:@"home2detail" sender:notification]; } @end
#import "HMViewController.h" #import "HMDetailViewController.h" @interface HMViewController () - (IBAction)schedule; - (IBAction)cancel; @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)schedule2 { // 1.创建本地推送通知对象 UILocalNotification *ln = [[UILocalNotification alloc] init]; // 2.设置通知属性 // 音效文件名 ln.soundName = @"buyao.wav"; // 通知的具体内容 ln.alertBody = @"重大新闻:xxxx xxxx被调查了...."; // 锁屏界面显示的小标题("滑动来" + alertAction) ln.alertAction = @"查看新闻吧"; // 设置app图标数字 ln.applicationIconBadgeNumber = 10; [[UIApplication sharedApplication] presentLocalNotificationNow:ln]; } - (IBAction)schedule { // 1.创建本地推送通知对象 UILocalNotification *ln = [[UILocalNotification alloc] init]; // 2.设置通知属性 // 音效文件名 ln.soundName = @"buyao.wav"; // 通知的具体内容 ln.alertBody = @"重大新闻:xxxx xxxx被调查了...."; // 锁屏界面显示的小标题("滑动来" + alertAction) ln.alertAction = @"查看新闻吧"; // 通知第一次发出的时间(5秒后发出) ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:5]; // 设置时区(跟随手机的时区) ln.timeZone = [NSTimeZone defaultTimeZone]; // 设置app图标数字 ln.applicationIconBadgeNumber = 5; // 设置通知的额外信息 ln.userInfo = @{ @"icon" : @"test.png", @"title" : @"重大新闻", @"time" : @"2014-08-14 11:19", @"body" : @"重大新闻:答复后即可更换就肯定会尽快赶快回家的疯狂估计很快将发的" }; // 设置启动图片 ln.alertLaunchImage = @"Default"; // 设置重复发出通知的时间间隔 // ln.repeatInterval = NSCalendarUnitMinute; // 3.调度通知(启动任务) [[UIApplication sharedApplication] scheduleLocalNotification:ln]; } - (IBAction)cancel { NSArray *notes = [UIApplication sharedApplication].scheduledLocalNotifications; NSLog(@"%@", notes); // [[UIApplication sharedApplication] cancelAllLocalNotifications]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UILocalNotification *)note { HMDetailViewController *detailVc = segue.destinationViewController; detailVc.userInfo = note.userInfo; } @end