在做项目的时候遇到这样一个需求,写一个备忘录,可以设定闹钟提醒。
然后闹钟提醒怎样做,查了查查到的都是使用本地通知,然后就使用UILocalNotification实现的功能。
UILocalNotification使用的核心代码如下:
一:设定一个本地推送
//使用本地通知,实现闹钟提醒
UILocalNotification *notification = [[UILocalNotification alloc] init];
if (notification)
{
//在选中的时间发出提醒
notification.fireDate = _alertDate; //_alertDate是一个NSDate对象
//重复次数,kCFCalendarUnitWeekday表示一周一次
notification.repeatInterval = 0;
//设置默认时区:[NSTimeZone defaultTimeZone]
//另外也可以使用NSDateFormatter对象设置一个时区如:表示东八区
//[dateformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss +0800"];
notification.timeZone = [NSTimeZone defaultTimeZone];
//设置推送时的声音,默认系统声音
//可以换成alarm.soundName = @"sound.wav",可以换成一个30秒的音乐
notification.soundName = UILocalNotificationDefaultSoundName;
//以下两句代码一起使用,改变推送“确定”按钮的文字
notification.alertAction = @"这里时确定按钮";//改变提示框按钮文字
notification.hasAction = YES;//为no时按钮显示默认文字,为yes时,上一句代码起效
//显示在icon上的红色圈中的数字,右上角数字加1
notification.applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber + 1;
//去掉下面2行就不会弹出提示框
//推送框中的提醒文字
notification.alertBody = [NSString stringWithFormat:@"您有一个备忘提醒,请注意查看!"];
//将当前新建时间保存,作为标识本地通知的唯一码,_reminderMessage.strNewDateTime表示备忘录新建的时间(字符串)
NSDictionary *infoDict = @{@"ReminderCreateTime":_reminderMessage.strNewDateTime,@"name":@"ReminderNotification"};
//设置userinfo 方便在之后需要撤销的时候使用 也可以传递其他值,当通知触发时可以获取
notification.userInfo = infoDict;
//将这个notification添加到UIApplication中
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
二:删除(取消)本地推送
//取消本地通知:一种为全部取消,一种为取消特定一条
//取消全部本地通知
[[UIApplication sharedApplication] cancelAllLocalNotifications];
//取消特定一条本地通知,使用附带的userInfo来确定某一条
NSArray *arrLocalNotifis = [[UIApplication sharedApplication] scheduledLocalNotifications];//获取所有本地通知
for (UILocalNotification *localNoti in arrLocalNotifis)//遍历
{
NSDictionary *userInfo = localNoti.userInfo;//获取通知附带的信息
if (userInfo)
{
if ([(NSString *)userInfo[@"ReminderCreateTime"] isEqualToString:_reminderMessage.strNewDateTime])//前面保存在userInfo中的内容
{
[[UIApplication sharedApplication] cancelLocalNotification:localNoti];//这句代码会删除所有本地通知中的特定一条,并切不会再推送这一条
}
}
}
三:本地通知时间到了,推送出来之后的响应:
一般推送时间到了之后,会调用下面的方法(写在AppDelegate文件中)
//推送的内容
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification
{
//通过notification的useinfo,干一些你想做的事情了
if ([[notification.userInfo objectForKey:@"name"] isEqualToString:@"ReminderNotification"])//如果收到的是备忘录的本地推送,则弹出下面一样的一个alertView
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"备忘通知" message:@"您有一个备忘提醒,请注意查看!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil,nil];
[alert show];
}
//查看了一条推送,讲右上角的数字减一
application.applicationIconBadgeNumber -= 1
}
下面是借鉴其他博客,区分是谁触发了通知,然后好进行响应操作:
--借鉴:http://blog.sina.com.cn/s/blog_9564cb6e0102w77g.html
通知触发的情况有两种,一种是程序没有运行,另外一种是程序在运行。
程序再运行的情况又分为两种情况:一种是程序在后台运行的情况,另一
种是程序在前台运行的情况。
1,对于程序没有运行的情况:如果程序没有启动,本地通知触发了,这个
时候程序将执行AppDelegate中下面的方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
函数中我们可以获取本地通知的参数。判断
UIApplicationLaunchOptionsLocalNotificationKey是否存在,判断方法,
如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOption
{
//可以设定进入应用后,将右上角数字清零
application.applicationIconBadgeNumber = 0;
//获取本地通知
UILocalNotification *localNoti = [launchOptions objectForKey:@"UIApplicationLaunchOptionsLocalNotificationKey"];
if(localNoti!=nil)
{
//得到本地通知附带的参数,可以进行响应操作(alert一下什么什么的)
NSDictionary *dic=localNoti.userInfo
}
}
2,如果应用在后台运行,这个时候如果通知的时间到了,不会自动触发
didReceiveLocalNOtification
方法,用户点击确定,
应用进入前台之后,通知中心的通知会自动触发此函数,我们可以在里面
通过上面的方法得当其
中的参数,然后执行相应的操作。
//推送的内容
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification
{
//通过notification的useinfo,干一些你想做的事情了
if ([[notification.userInfo objectForKey:@"name"] isEqualToString:@"ReminderNotification"])//如果收到的是备忘录的本地推送,则弹出下面一样的一个alertView
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"备忘通知" message:@"您有一个备忘提醒,请注意查看!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil,nil];
[alert show];
}
//查看了一条推送,讲右上角的数字减一
application.applicationIconBadgeNumber -= 1
}
3,如程序在前台运行,这个时候就有一种情况,就是时间到了会触发
didReceiveLocalNotification,点击通知中心的通知也会触发此函
数。这个我们没有办法区分是谁触发了
didRecieveLocalNotification(如当我点击的时候我希望跳转到指
定的页面,而时间到了的触发不让跳转,这就没有办法区分了)。
我们在这儿使用一个小技巧来区分这两种情况。要求我们在通知的时候,
通过userInfo传递一下通知时间的格式,如代码如下:
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
if(notification!=nil)
{
NSDictionary *userInfo=notification.userInfo;
NSString *name=[userInfo objectForKey:@"name"];//获取name参数
NSString *firedateformat=[userInfo objectForKey:@"firedateformat"];//获取firedateformat参数
NSLog(@"名字:%@,触发日期格式:%@",name,firedateformat);
}
}
我们通知的时候传递了触发时间的格式,在触发了
didReceiveLoalNotification时,我们获取一下日期的格式,使用当
前时间与触发的时间比较,如果在某一个非常小的范围内我们就认为是时间
到了自动触发了,否则我们认为是点击通知中心的通知触发了,我们执行相
应的操作。代码如下:
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSDictionary *userInfo=notification.userInfo;
NSString *sfiredateformat=[NSMutableString stringWithString:[userInfo objectForKey:@"firedateformat"]];
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
[formatter setDateFormat:sfiredateformat];//设置格式
if([[formatter dateFromString:
[formatter stringFromDate:[NSDate date]]]
timeIntervalSinceDate:notification.fireDate] > 0.5)
{
//距离时间在半秒多了,意味着我们自己点击的
}else{
//否则就算是时间到底,自动触发的
}
}