iOS本地推送通知UILocalNotification(可以用做类似闹钟提醒)

在做项目的时候遇到这样一个需求,写一个备忘录,可以设定闹钟提醒。
然后闹钟提醒怎样做,查了查查到的都是使用本地通知,然后就使用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{
           //否则就算是时间到底,自动触发的
      }
  }

你可能感兴趣的:(iOS开发随记)