ios推送:本地通知UILocalNotification

Notification是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iOS下应用分为两种不同的Notification种类,本地和远程。本地的Notification由iOS下NotificationManager统一管理,只需要将封装好的本地Notification对象加入到系统Notification管理机制队列中,系统会在指定的时间激发将本地Notification,应用只需设计好处理Notification的方法就完成了整个Notification流程了。

本地Notification所使用的对象是UILocalNotificationUILocalNotification的属性涵盖了所有处理Notification需要的内容。UILocalNotification的属性有fireDate、timeZone、repeatInterval、repeatCalendar、alertBody、alertAction、hasAction、alertLaunchImage、applicationIconBadgeNumber、soundName和userInfo。


UILocalNotification的调度

其中fireDate、timeZone、repeatInterval和repeatCalendar是用于UILocalNotification的调度。fireDate是UILocalNotification的激发的确切时间。timeZone是UILocalNotification激发时间是否根据时区改变而改变,如果设置为nil的话,那么UILocalNotification将在一段时候后被激发,而不是某一个确切时间被激发。repeatInterval是UILocalNotification被重复激发之间的时间差,不过时间差是完全根据日历单位(NSCalendarUnit)的,例如每周激发的单位,NSWeekCalendarUnit,如果不设置的话,将不会重复激发。repeatCalendar是UILocalNotification重复激发所使用的日历单位需要参考的日历,如果不设置的话,系统默认的日历将被作为参考日历。

UILocalNotification的提醒内容

alertBody、alertAction、hasAction和alertLaunchImage是当应用不在运行时,系统处理

 

UILocalNotification提醒是需要的内容。alertBody是一串现实提醒内容的字符串(NSString),如果alertBody未设置的话,Notification被激发时将不现实提醒。alertAction也是一串字符(NSString),alertAction的内容将作为提醒中动作按钮上的文字,如果未设置的话,提醒信息中的动作按钮将显示为“View”相对文字形式。alertLaunchImage是在用户点击提醒框中动作按钮(“View”)时,等待应用加载时显示的图片,这个将替代应用原本设置的加载图片。hasAction是一个控制是否在提醒框中显示动作按钮的布尔值,默认值为YES。


 

UILocalNotification的其他部分

applicationIconBadgeNumber、soundName和userInfo将使UILocalNotification更完整。applicationIconBadgeNumber是显示在应用图标右上角的数字,这样让用户直接了解到应用需要处理的Notification。soundName是另一个UILocalNotification用来提醒用户的手段,在Notification被激发之后将播放这段声音来提醒用户有Notification需要处理,如果不设soundName的话,Notification被激发是将不会有声音播放,除去应用特制的声音以外,也可以将soundName设为UILocalNotificationDefaultSoundName来使用系统默认提醒声音。userInfo是Notification用来传递数据的NSDictionary。


登记UILocalNotification

在设置完UILocalNotification对象之后,应用需要在系统Notification处理队列中登记已设置完的UILocalNotification对象。登记UILocalNotification * localNotification的方式为:

   [[UIApplication sharedApplication]  scheduleLocalNotification:localNotification];

在有些时候,应用可能需要直接激发一个Notification而不是等一段时间在激发,应用可以以下的方式直接触发已设好的Notification:

   [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];

处理UILocalNotification

在提醒框动作按钮被点击后,应用开始运行时,可以在-(BOOL)application:didFinishLaunchingWithOptions:这个Application delegate方法中处理。可以通过以下方式来加载为最近未处理的Notification:

   UILocalNotification * localNotif=[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

如果应用正在运行时,可以通过覆盖在Application Delegate中的方法-(void)application:didReceiveLocalNotification:来处理Notification。作为方法的第二个参数为UILocalNotification对象,只需处理对象携带的userInfo来处理响应的动作。

取消UILocalNotification

可以使用以下两个方式来取消一个已经登记的Notification,第一个方式可以直接取消一个指定的Notification,第二个方式将会把该应用已登记的Notification一起取消

   [[UIApplication sharedApplication] cancelLocalNotification:localNotification];

   [[UIApplication sharedApplication] cancelAllLocalNotification];

总结

本地Notification的机制在应用开发中非常有效,可以很好的帮助开发者管理一些指定时间需要发生的事件,例如闹钟类的应用。而且因为系统统一对Notification的管理,让同样的任务可以非常简单得被处理,而无需让应用浪费资源去等待事件的触发。

      转自:http://hi.baidu.com/%CB%BC%C3%F4%D3%EA/blog/item/173ee25032b4d301367abe8a.html



以下为举例:




///

//发送通知

    UILocalNotification *notification=[[UILocalNotification alloc] init];   
     if (notification!=nil) { 
        NSDate *now=[NSDate  new]; 
        notification.fireDate=[now dateByAddingTimeInterval: 10]; // 10秒后通知
        notification.repeatInterval= 0; // 循环次数,kCFCalendarUnitWeekday一周一次
        notification.timeZone=[NSTimeZone defaultTimeZone];
        notification.applicationIconBadgeNumber= 1// 应用的红色数字 
        notification.soundName= UILocalNotificationDefaultSoundName; // 声音,可以换成alarm.soundName = @"myMusic.caf" 
        
// 去掉下面2行就不会弹出提示框
         notification.alertBody= @" 通知内容 "; // 提示信息 弹出提示框
         notification.alertAction =  @" 打开 ";   // 提示框按钮 
        
// notification.hasAction = NO;  // 是否显示额外的按钮,为no时alertAction消失

       
//  NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"];
        
// notification.userInfo = infoDict;  // 添加额外的信息
        
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];      
    }
    [notification release];
复制代码

取消通知

复制代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    
     //  Override point for customization after application launch.
    application.applicationIconBadgeNumber =  0;
     //  Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

     return YES;
}
- ( void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
     // 点击提示框的打开
    application.applicationIconBadgeNumber =  0;
}
- ( void)applicationDidBecomeActive:(UIApplication *)application {
     // 当程序还在后天运行
    application.applicationIconBadgeNumber =  0;
}





///

  1. 第一步:创建本地推送  
  2. // 创建一个本地推送  
  3. UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease];  
  4. //设置10秒之后  
  5. NSDate *pushDate = [NSDate dateWithTimeIntervalSinceNow:10];  
  6. if (notification != nil) {  
  7.     // 设置推送时间  
  8.     notification.fireDate = pushDate;  
  9.     // 设置时区  
  10.     notification.timeZone = [NSTimeZone defaultTimeZone];  
  11.     // 设置重复间隔  
  12.     notification.repeatInterval = kCFCalendarUnitDay;  
  13.     // 推送声音  
  14.     notification.soundName = UILocalNotificationDefaultSoundName;  
  15.     // 推送内容  
  16.     notification.alertBody = @"推送内容";  
  17.     //显示在icon上的红色圈中的数子  
  18.     notification.applicationIconBadgeNumber = 1;  
  19.     //设置userinfo 方便在之后需要撤销的时候使用  
  20.     NSDictionary *info = [NSDictionary dictionaryWithObject:@"name"forKey:@"key"];  
  21.     notification.userInfo = info;  
  22.     //添加推送到UIApplication         
  23.     UIApplication *app = [UIApplication sharedApplication];  
  24.     [app scheduleLocalNotification:notification];   
  25.      
  26. }  
  27.   
  28. 第二步:接收本地推送  
  29. - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification{  
  30.     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"iWeibo" message:notification.alertBody delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];  
  31.     [alert show];  
  32.     // 图标上的数字减1  
  33.     application.applicationIconBadgeNumber -= 1;  
  34. }  
  35.   
  36. 第三步:解除本地推送  
  37. // 获得 UIApplication  
  38. UIApplication *app = [UIApplication sharedApplication];  
  39. //获取本地推送数组  
  40. NSArray *localArray = [app scheduledLocalNotifications];  
  41. //声明本地通知对象  
  42. UILocalNotification *localNotification;  
  43. if (localArray) {  
  44.     for (UILocalNotification *noti in localArray) {  
  45.         NSDictionary *dict = noti.userInfo;  
  46.         if (dict) {  
  47.             NSString *inKey = [dict objectForKey:@"key"];  
  48.             if ([inKey isEqualToString:@"对应的key值"]) {  
  49.                 if (localNotification){  
  50.                     [localNotification release];  
  51.                     localNotification = nil;  
  52.                 }  
  53.                 localNotification = [noti retain];  
  54.                 break;  
  55.             }  
  56.         }  
  57.     }  
  58.      
  59.     //判断是否找到已经存在的相同key的推送  
  60.     if (!localNotification) {  
  61.         //不存在初始化  
  62.         localNotification = [[UILocalNotification alloc] init];  
  63.     }  
  64.      
  65.     if (localNotification) {  
  66.         //不推送 取消推送  
  67.         [app cancelLocalNotification:localNotification];  
  68.         [localNotification release];  
  69.         return;  
  70.     }  
  71. }  



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值