文章目录
1. 本地通知 iOS8.0 #
1.1. 本地通知发送 ##
***iOS8.0之后才能用
//本地通知
UILocalNotification *locationNo = [[UILocalNotification alloc] init];
//触发时间
locationNo.fireDate = [NSDate dateWithTimeIntervalSinceNow:10];
//通知内容
locationNo.alertBody = @"这是本地通知";
//iOS8.2之后可见,一般不用
if (@available(iOS 8.2,*)) {
locationNo.alertTitle = @"哈哈,本地推送";
}
//锁屏(黑屏状态下,"滑动来"后面的字)--iOS10.0之后,没有滑动解锁功能了,这个属性也就不存在了
locationNo.alertAction = @"查看这个本地推送";
locationNo.hasAction = YES;
//通知过来时的声音
locationNo.soundName = UILocalNotificationDefaultSoundName;
//应用图标提示--默认是0,没有改变,设置为负数,通知到达时图标提示就会消失
locationNo.applicationIconBadgeNumber = -1;
//直接设置应用图标提示为0,代表隐藏,和上面效果一致
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
//MARK: 额外信息--对于用户不重要,对于开发者很重要,用于接收通知时处理相应逻辑
locationNo.userInfo = @{@"name":@"周玉",@"job":@"iOS开发工程师"};
//加入到调度池---有可能有多个通知---取决于触发时间
[[UIApplication sharedApplication] scheduleLocalNotification:locationNo];
1.2. 本地通知接收 ##
//#import "AppDelegate.h" 注册通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/*
UIUserNotificationTypeNone = 0,
UIUserNotificationTypeBadge 徽章标记
UIUserNotificationTypeSound 声音
UIUserNotificationTypeAlert 弹出效果
*/
//注册通知
//本地通知设置
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
//当程序被杀死的情况下,接收到通知并执行事情--
UILocalNotification *notification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
if (notification) {
NSLog(@"localNo = %@",notification.userInfo);//NSLog不会再打印
//用测测试是否接收到通知
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
label.backgroundColor = [UIColor redColor];
[self.window.rootViewController.view addSubview:label];
return YES;
}
// 程序没有被杀死时,接收到本地通知时调用--点击通知时会执行这个方法,如果程序被杀死时,这个方法不再走,在application: didFinishLaunchingWithOptions:方法中获取
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
NSLog(@"notification.userInfo = %@",notification.userInfo);
//锁屏(黑屏状态下,"滑动来"后面的字)–iOS10.0之后,没有滑动解锁功能了,这个属性也就不存在了
locationNo.alertAction = @“查看这个本地推送”;
locationNo.hasAction = YES;
2. 本地通知逻辑处理 iOS8.0#
2.1. 发送推送通知 ##
// 发送通知
// ViewController.m
// 本地推送
//
// Created by zhouyu on 2017/12/27.
// Copyright © 2017年 zhouyu. All rights reserved.
//
#import "ViewController.h"
#import "RedController.h"
#import "BlueController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"本地推送";
[self setUpUI];
}
- (void)setUpUI{
UIButton *btn1 = [[UIButton alloc] initWithFrame:CGRectMake(100, 300, 150, 60)];
[btn1 setTitle:@"跳转红色控制器" forState:UIControlStateNormal];
[btn1 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(red) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn1];
UIButton *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(100, 400, 150, 60)];
[btn2 setTitle:@"跳转蓝色控制器" forState:UIControlStateNormal];
[btn2 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[btn2 addTarget:self action:@selector(blue) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn2];
}
- (void)red{
[self pushLocationNotificationWithAlertBody:@"跳转红色控制器" userInfo:@{@"key":@"red"}];
}
- (void)blue{
[self pushLocationNotificationWithAlertBody:@"跳转蓝色控制器" userInfo:@{@"key":@"blue"}];
}
- (void)pushLocationNotificationWithAlertBody:(NSString *)body userInfo:(NSDictionary *)userInfo{
//本地通知
UILocalNotification *locationNo = [[UILocalNotification alloc] init];
//触发时间
locationNo.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
//通知内容
locationNo.alertBody = body;
//通知过来时的声音
locationNo.soundName = UILocalNotificationDefaultSoundName;
//应用图标提示--默认是0,没有改变,设置为负数,通知到达时图标提示就会消失
locationNo.applicationIconBadgeNumber = -1;
//直接设置应用图标提示为0,代表隐藏,和上面效果一致
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
//MARK: 额外信息--对于用户不重要,对于开发者很重要
locationNo.userInfo = userInfo;
//加入到调度池---有可能有多个通知---取决于触发时间
[[UIApplication sharedApplication] scheduleLocalNotification:locationNo];
}
@end
2.2. AppDelegate接收推送通知进行逻辑处理 ##
// 接收通知并进行逻辑处理
// AppDelegate.m
// 本地推送
//
// Created by zhouyu on 2017/12/27.
// Copyright © 2017年 zhouyu. All rights reserved.
//
#import "AppDelegate.h"
#import "ViewController.h"
#import "RedController.h"
#import "BlueController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];
[self.window makeKeyAndVisible];
self.window.backgroundColor = [UIColor whiteColor];
/*
UIUserNotificationTypeNone = 0,
UIUserNotificationTypeBadge 徽章标记
UIUserNotificationTypeSound 声音
UIUserNotificationTypeAlert 弹出效果
*/
//注册通知
//本地通知设置
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
//当程序被杀死的情况下,如何接收到通知并执行事情--ios10.0之后废弃,需要用10.0之前版本测试
UILocalNotification *notification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
if (notification) {
NSLog(@"localNo = %@",notification.userInfo);//NSLog不会再打印
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
label.backgroundColor = [UIColor redColor];
[self.window.rootViewController.view addSubview:label];
[self jumpToControllerWithLocationNotification:notification];
}
return YES;
}
// 程序没有被杀死时,接收到本地通知时调用--点击通知时会执行这个方法,如果程序被杀死时,这个方法不再走,在application: didFinishLaunchingWithOptions:方法中获取
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
NSLog(@"notification.userInfo = %@",notification.userInfo);
[self jumpToControllerWithLocationNotification:notification];
}
- (void)jumpToControllerWithLocationNotification:(UILocalNotification *)localNo{
//如果APP在前台,就不用走通知的方法了
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
return;
}
//获取userInfo
NSDictionary *userInfo = localNo.userInfo;
UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
//判断跳转
if ([userInfo[@"key"] isEqualToString:@"red"]) {
[nav pushViewController:[[RedController alloc] init] animated:YES];
} else if([userInfo[@"key"] isEqualToString:@"blue"]) {
[nav pushViewController:[[BlueController alloc] init] animated:YES];
}
}
@end
//如果APP在前台,就不用走通知的方法了
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
return;
}