ios本地通知UILocalNotification以及区分谁触发了通知

1、在ios中有两类消息推送方式一类使远程推送,一类使本地推送,今天简要记录一下本地推送,代码如下:

UILocalNotification *notification=[[[UILocalNotification alloc] init] autorelease];
    NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"HH:mm:ss"];//还有其他格式,如mm:ss,ss,hh:mm:ss,yyyy-MM-dd HH:mm:ss,HH大写表示24小时计算,小写表示12小时计算,
    
    NSDate *now=[formatter dateFromString:@"12:00:00"];//设置每天的十二点通知
    notification.fireDate=now;//设置触发时间
    notification.timeZone=[NSTimeZone defaultTimeZone];//设置默认时区,另外也可以写一个时区如:[dateformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss +0800"];//表示东八区
    //如果repeatInterval为零,则表示不重复
    notification.repeatInterval=NSDayCalendarUnit;//设置重复的时间间隔,NSSecondCalendarUnit每秒重复,NSHourCalendarUnit每小时重复,NSDayCalendarUnit每天重复,NSMonthCalendarUnit每月重复
    
    notification.alertBody=@"到中午了,你该吃中午饭了";//设置提示内容
    notification.soundName=UILocalNotificationDefaultSoundName;//设置默认的提示声音
    
    [formatter release];
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
以上代码实现了一个这样的功能,每天中午的12点提示用户,到中午了,你应该吃中午饭了,另外也可以根据上面注释的说明,设置每小时,每月,每年给用户发消息提醒。

另外如果想要在通知中传递参数可以通过userInfo传递,代码如下:

NSDictionary *dictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"张三",@"name",@"HH:mm:ss",@"firedateformat", nil];//定义了两个key与value
    notification.userInfo=dictionary;
如果想要取消通知的话,有两张方法,一中是取消全部通知,另一中是取消指定的通知,代码如下:

[[UIApplication sharedApplication] cancelAllLocalNotifications];//取消所有的通知
    [[UIApplication sharedApplication] cancelLocalNotification:notification];//取消指定的通知
另外我们还可以获取当前系统中的所有通知,并且可以通过遍历得到所有的值,代码如下:

 NSArray *array=[[UIApplication sharedApplication] scheduledLocalNotifications];
    for (UILocalNotification *notification in array) {
        //在可以我们可以获取本地通知的值,如notification.userInfo等
        
    }
如果软件正在前天运行,我们可以通过appdelegate中的回调方法获取并且处理参数,

-(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);
   } 
   
}

下面我们说明一下通知触发的情况,通知触发的情况有两种,一种是程序没有运行,另外一种是程序已经在运行,这种情况有分为两种情况,一种情况是在后天运行时触发,另一种情况是在前天运行时触发,我们先来说在程序没有启动,如果程序没有启动,本地通知触发了,这个时候程序将执行:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

我们可以在此函数中获取本地通知的参数。我们判断UIApplicationLaunchOptionsLocalNotificationKey是否存在,判断方法如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
    application.applicationIconBadgeNumber=0;
    UILocalNotification *uinfo=[launchOptions objectForKey:@"UIApplicationLaunchOptionsLocalNotificationKey"];
    if(uinfo!=nil){
        NSDictionary *dic=uinfo.userInfo//就使本地通知中传递过的NSDictionary,我们可以获取其中的参数。
}
}
另外一种是程序已经在运行,这个时候有前天运行与后台运行,如果在后台运行,这个时候如果通知的时间到了,不会自动触发didReceiveLocalNOtification,用户点击了,通知中心的通知使用触发此函数,我们可以在里面通过上面的方法得当其中的参数,然后执行相应的操作。如程序在前天运行,这个时候就有一种情况,就是时间到了会触发didReceiveLocalNotification,点击通知中心的通知也会触发此函数,这个我们没有办法区分是谁触发了didRecieveLocalNotification,(如当我点击的时候我希望跳转到指定的页面,而时间到了的触发不让跳转,这就没有办法区分了),我们在这儿使用一个小技巧来区分这两种情况。要求我们在通知的时候,通过userInfo传递一下通知时间的格式,如上面的代码,我们通知的时候传递了触发时间的格式,但触发了didReceiveLoalNotification时,我们获取一下日期的格式,使用当前时间与触发的时间比较,如果在某一个非常小的范围内我们就认为是时间到了触发了,而不去触发,否则我们认为是点击触发了,我们执行相应的操作。代码如下:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
     NSDictionary *userInfo=notification.userInfo;

    NSString *sfiredateformat=[NSMutableString stringWithString:[userInfo objectForKey:@"firedateformat"]];
   
         NSDateFormatter *formatter=[[[NSDateFormatter alloc] init] autorelease];
          [formatter setDateFormat:sfiredateformat];
          if([[formatter dateFromString:[formatter stringFromDate:[NSDate date]]] timeIntervalSinceDate:notification.fireDate]>0.5){
                    //用户点击了,
                }else{
               //时间到了触发的
        }
    }
这样我们就区分开了两种情况。

以上是我介绍UILocalNotification情况,欢迎大家指正与补充。谢谢。












  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值