废话不多说, 这东西老容易忘,记下来供以后查询,并附上详细的解释 首先我们设置一个按钮, 点击这个按钮发送本地通知:
// 发出本地通知
- (IBAction)fireLocalMessage:(id)sender {
/*
ios8以上版本需要在appdelegate中注册申请权限 本地通知在软件杀死状态也可以接收到消息
*/
// 1.创建本地通知
UILocalNotification *localNote = [[UILocalNotification alloc] init];
// 2.设置本地通知(发送的时间和内容是必须设置的)
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
localNote.alertBody = @"吃饭了么?";
/**
其他属性: timeZone 时区
repeatInterval 多长时间重复一次:一年,一个世纪,一天..
region 区域 : 传入中心点和半径就可以设置一个区域 (如果进入这个区域或者出来这个区域就发出一个通知)
regionTriggersOnce BOOL 默认为YES, 如果进入这个区域或者出来这个区域 只会发出 一次 通知,以后就不发送了
alertAction: 设置锁屏状态下本地通知下面的 滑动来 ...字样 默认为滑动来查看
hasAction: alertAction的属性是否生效
alertLaunchImage: 点击通知进入app的过程中显示图片,随便写,如果设置了(不管设置的是什么),都会加载app默认的启动图
alertTitle: 以前项目名称所在的位置的文字: 不设置显示项目名称, 在通知内容上方
soundName: 有通知时的音效 UILocalNotificationDefaultSoundName默认声音
可以更改这个声音: 只要将音效导入到工程中,localNote.soundName = @"nihao.waw"
*/
localNote.alertAction = @"快点啊"; // 锁屏状态下显示: 滑动来快点啊
// localNote.alertLaunchImage = @"123";
localNote.alertTitle = @"东方_未明";
localNote.soundName = UILocalNotificationDefaultSoundName;
localNote.soundName = @"nihao.waw";
/* 这里接到本地通知,badge变为5, 如果打开app,消除掉badge, 则在appdelegate中实现
[application setApplicationIconBadgeNumber:0];
*/
localNote.applicationIconBadgeNumber = 5;
// 设置额外信息,appdelegate中收到通知,可以根据不同的通知的额外信息确定跳转到不同的界面
localNote.userInfo = @{@"type":@1};
// 3.调用通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}
现在基本都视频iOS8以上版本,所以我们要在appdelegate中注册获取权限
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//打开app时候,消除掉badge
[application setApplicationIconBadgeNumber:0];
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
// iOS8以后 本地通知必须注册(获取权限)
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:settings];
}
}
如果接收到通知了, 我们想要页面跳转怎么办呢?
首先分为三种情况:
1.我们应用程序本来在前台状态,我们就不要一下子跳转了,给个提示,然后再跳转
2.应用程序在后台,点击通知,进入前台的时候,直接跳转到指定界面
3.程序在杀死退出状态,接收到通知,点击通知进入到应用,也应跳转到指定界面
首先我们看前两种情况
/**
app在前台收到本地通知调用或者在home情况下点击通知进入前台调用
*/
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSLog(@"收到本地通知");
// 可以让用户跳转到指定界面 app在前台接收到通知直接跳转界面不太好,所以要判断一下,是从后台进入前台还是本身就在前台
if (application.applicationState == UIApplicationStateInactive) {// 进入前台时候
NSLog(@"跳转到指定界面");
// 如果接收到不同的通知,跳转到不同的界面:
NSLog(@"%@", notification.userInfo); //通知的额外信息,根据设置的通知的额外信息确定
}
}
如果是第三种情况: 程序在杀死退出状态,接收到通知,点击通知进入到应用,也应跳转到指定界面
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//打开app时候,消除掉badge
[application setApplicationIconBadgeNumber:0];
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
// iOS8以后 本地通知必须注册(获取权限)
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:settings];
}
// 页面跳转(针对应用程序被杀死的页面跳转)
/* launchOptions: 1.点击图标打开是空的
2.应用间跳转是有值的
3.杀死的应用接收到本地通知,也是有值的
虽然说launchOptions有值,但是他们不同的key有值
*/
if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) { // 如果这个key有值,代表是杀死的程序接收到本地通知跳转
// 根据这种方式查看launchOptions的内容
UILabel *infoLabel = [[UILabel alloc] init];
infoLabel.frame = CGRectMake(0, 0, 300, 300);
infoLabel.backgroundColor = [UIColor yellowColor];
infoLabel.numberOfLines = 0;
infoLabel.font = [UIFont systemFontOfSize:10];
infoLabel.text = [NSString stringWithFormat:@"%@",launchOptions];
[self.window.rootViewController.view addSubview:infoLabel];
NSLog(@"跳转到指定页面");
}
return YES;
}
如何查看launchOptions中不同的key值
查看的key值
运行程序我们可以看到:
上面显示的内容为
我们照样可以拿到type,来进行指定页面的跳转