- 可以让不在前台运行的APP, 告知用户APP内部发送了什么事情; 简单来说就是程序不在线或程序在后台想要接收消息, 那么就要用到推送通知来实现 ;
效果:
- 在屏幕顶部显示一块横幅(QQ)
- 在屏幕中间显示一个alertview(闹钟, 本地推送, 不需要网络)
- 锁屏时也照样呈现
- 呈现推送通知的同时, 还可以更新APP图标数字
- 用户接受的推送通知, 都会展示在通知中心
本地推送Local Notification
来自本地通知头文件:
In iOS 8.0 and later, your application must register for user notifications using -[UIApplication registerUserNotificationSettings:] before being able to schedule and present UILocalNotifications
在IOS8.0及以后, 你的应用在定制和展示通知之前必须注册用户通知.
由此: 本地通知分为4个步骤-创建, 注册, 定制, 展示
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//0.注册
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication]registerUserNotificationSettings:setting];
//1.创建一个通知
UILocalNotification *local = [[UILocalNotification alloc]init];
//初始化 5秒
local.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
// 提示主题
local.alertBody = @"女神:在吗?";
// 图标数字
local.applicationIconBadgeNumber = 11;
local.soundName = UILocalNotificationDefaultSoundName;
// 是否显示 滑动按钮
local.hasAction = YES;
// 滑动来解锁的按钮文字
local.alertAction = @"聊天";
// 携带参数
local.userInfo = @{@"name":@"女神" , @"info":@"在吗?" , @"qq": @"110"};
//2.定制 //3.展示
[[UIApplication sharedApplication]scheduleLocalNotification:local];
}
现在运行程序我们可以看到:
//1.定制 之后程序在前台 没显示横幅 图标文字 改了 直接接收通知
//2.程序在后台 显示横幅 有通知
//3.程序死了 显示横幅 有通知
//4.点击了横幅 程序启动
//5.不点横幅 不发生事情
那么接下来我们验证:
//1.程序活着 或者 程序 死了 是否能接收通知
//2.点击横幅 是否是接收通知(内容)
**处理程序在前台或在后台的跳转**
// 接收到通知会调用这个方法
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
// 程序死了, 不会在控制台打印, 想验证是否接收到了通知, 采用添加控件的调试方法
UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 44)];
lable.backgroundColor = [UIColor redColor];
[self.window.rootViewController.view addSubview:lable];
// 对于死了的程序这么验证不够严谨, 因为View可能不存在啦
// 因此我们考虑采用写入本地文件或者更改图标文字
[UIApplication sharedApplication].applicationIconBadgeNumber = 2;
// 数据通过userInfo携带过来
NSLog(@"%@",notification.userInfo);
//跳转聊天界面
[self jumpToChatWith:notification.userInfo];
}
总结:
//死了:
点击横幅没有来到这个方法
//活着
//1.前台: 默认直接接收(没有横幅) 来到这个方法
//2.后台: 点击恒幅就会接收 会来到这个方法
**处理程序从死到生: 点击图标/接收通知 的界面跳转**
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//更改图标文字
//[UIApplication sharedApplication].applicationIconBadgeNumber = 22;
//接收通知 还是 点击图标?
UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
lable.backgroundColor = [UIColor redColor];
lable.numberOfLines = 0;
//显示通知
[self.window.rootViewController.view addSubview:lable];
if (launchOptions == nil) { //点击图标
}else if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]){ //接收通知
//跳转界面
UILocalNotification *local = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
lable.text = [NSString stringWithFormat:@"%@",local.userInfo];
[self jumpToChatWith:local.userInfo];
}else{ //其他
}
return YES;
}
界面跳转
//接收到通知之后跳转界面
- (void)jumpToChatWith:(NSDictionary *)userInfo
{
CZChatViewController *chat = [[UIStoryboard storyboardWithName:@"chat" bundle:nil] instantiateInitialViewController];
NSLog(@"%@",self.window.rootViewController);
self.window.rootViewController = chat;
}