本地推送通知
推送通知的作用:
可以让不在前台运行的app 告知用户app内部发生了什么事情
推送通知的呈现效果:
- 1.在屏幕顶部显示一条横幅
- 2.在屏幕中间弹出一个UIAlertView
- 3.锁屏状态下也可以呈现
4.呈现推送通知的同时还可以更新app图标的数字
5.播放音效
用户接收的通知 都会展示在通知中心 如何打开通知中心:从屏幕顶部往下滑 就可以打开通知中心
推送通知的呈现效果设置:
1.显示横幅还是UIAlerView 取决于用户的设置
2.用户也可以决定是否要开启以下4个功能:
- 是否显示app图标数字
- 播放音效
- 锁屏显示
- 是否显示在通知中心
推送通知的使用细节:
- 发送推送通知时 如果程序正运行在前台 那么推送通知就不会被呈现出来
- 点击推送通知后 默认会自动打开发出推送通知的app
- 不管app打开还是关闭 推送通知照样能正常发出
本地推送通知
本地推送通知: 不需要联网就能发出的推送通知 不需要服务器的支持
本地推送通知的使用场景: 常用来提醒用户完成一些任务 (如:买衣服,玩游戏 app软件的提醒用户)
如何发出本地通知代码如下:
以下代码适用于IOS7:
//1.创建本地通知对象 UILocalNotification *notification = [[UILocalNotification alloc] init]; // NSDate *currentDate = [NSDate date]; // notification.timeZone = [NSTimeZone defaultTimeZone]; // 使用本地时区 // notification.fireDate = [currentDate dateByAddingTimeInterval:5.0]; //2.设置通知属性 // local.soundName = @"1.wav"; //播放音效 这个只有在真机上面才会有效 notification.alertBody = @"客官,你好久没来了,进来看看,可好?"; //中间显示的内容 //3.通知第一次发出的时间 notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5]; //4.启动通知 [[UIApplication sharedApplication] scheduleLocalNotification:notification];
在IOS8中请在AppDelegate的:-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入如下代码即可:
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){ [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]]; } else { [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge]; }
如何判断用户是点击app图标启动程序 还是点击本地通知 启动程序
点击本地推送通知,会自动打开app这里有2种情况:
- app并没有被关闭 一直隐藏在后台
- 让app进入前台会调用AppDelegate的下面的方法(并非重新启动)
/** * 当用户点击本地通知进入App的时候调用(注意这个时候app并没有被关闭) */ - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
2.app已经被关闭 (进程已经死了)
- 启动app,启动完毕会调用AppDelegate下面的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
代码如下:
appDelegate里面的代码: #import "ViewController.h" #import "AppDelegate.h" @interface AppDelegate () /**label**/ @property(nonatomic,weak)UILabel *label; @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){ [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]]; } else { [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge]; } //创建label UILabel *label = [[UILabel alloc] init]; label.backgroundColor = [UIColor redColor]; label.frame = CGRectMake(0, 100, 100, 100); label.font = [UIFont systemFontOfSize:11]; label.numberOfLines = 0; //拿到当前主窗口的view [[[self.window.rootViewController.childViewControllers firstObject] view] addSubview:label]; //添加到窗口的跟控制器上面 // [self.window.rootViewController.view addSubview:label]; //判断用户是点击本地通知启动的程序 还是直接点击app图标启动的程序 UILocalNotification *note = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]; if (note) { //如果这个key有值 说明用户是点击本地通知启动的程序 label.text =@"点击本地通知启动的程序"; //拿到目标控制器 ViewController *vc = [self.window.rootViewController.childViewControllers firstObject]; //跳转到目标控制器 [vc performSegueWithIdentifier:@"home2detail" sender:note]; }else{ //用户直接点击app图标启动的程序 label.text = @"点击app图标启动的程序"; } self.label = label; return YES; } /** * 当用户点击本地通知进入App的时候调用以及通知发出的时候也会调用这个方法(注意这个时候app并没有被关闭) */ - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { self.label.text = @"点击通知再次回到前台"; //判断应用程序的状态 如果是前台 直接退出 不跳转 if (application.applicationState == UIApplicationStateActive) return; // 如果应用程序在后台的时候才需要跳转 //拿到目标控制器 ViewController *vc = [self.window.rootViewController.childViewControllers firstObject]; //跳转到目标控制器 [vc performSegueWithIdentifier:@"home2detail" sender:notification]; } @end
模拟发送通知界面的代码 #import "ViewController.h" #import "DetailViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)send { //1.创建本地通知对象 UILocalNotification *notification = [[UILocalNotification alloc] init]; //2.设置通知属性 //local.soundName = @"1.wav"; //播放音效 这个只有在真机上面才会有效 notification.alertBody = @"客官,你好久没来了,进来看看,可好?"; //中间显示的内容 notification.applicationIconBadgeNumber = 15; //设置app图标数字 notification.alertAction =@"查看一下吧!"; //设置锁屏界面 最底部的小文字 (滑动来+ alertAction) //设置通知的额外信息 notification.userInfo = @{ @"title" : @"重大新闻", @"time": @"2014-08-31", @"content":@"这里真的很好 你可以多玩玩啊" }; //设置启动图片 notification.alertLaunchImage = @"Default"; //试着重复发出通知的时间间隔 // notification.repeatInterval = NSCalendarUnitMinute; //设置时区 为当前手机设置的时区 notification.timeZone = [NSTimeZone defaultTimeZone]; //3.通知第一次发出的时间 notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5]; //4.启动通知 在规定的时间发出调度通知 [[UIApplication sharedApplication] scheduleLocalNotification:notification]; //直接发出通知 // [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; } - (IBAction)cancle { //获得所有等待被发出(启动)的通知 NSArray *notes = [UIApplication sharedApplication].scheduledLocalNotifications; NSLog(@"%@",notes); //取消所有通知 [[UIApplication sharedApplication] cancelAllLocalNotifications]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UILocalNotification*)sender { //拿到目标控制器 DetailViewController *desVc = segue.destinationViewController; desVc.content = sender.userInfo; } @end
通知内容详情页代码: .h文件代码: #import <UIKit/UIKit.h> @interface DetailViewController : UIViewController /**通知内容**/ @property(nonatomic,strong)NSDictionary *content; @end .m文件代码 #import "DetailViewController.h" @interface DetailViewController () @property (weak, nonatomic) IBOutlet UILabel *detailLabel; @end @implementation DetailViewController - (void)viewDidLoad { [super viewDidLoad]; self.detailLabel.text = self.content[@"content"]; } @end