【第22期】观点:IT 行业加班,到底有没有价值?

iOS本地推送(本地通知)

转载 2015年11月20日 20:53:03

在iOS8之后,以前的本地推送写法可能会出错,接收不到推送的信息,

如果出现以下信息:

<span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">1 Attempting to schedule a local notification
2 with an alert but haven't received permission from the user to display alerts
3 with a sound but haven't received permission from the user to play sounds</span>
说明在IOS8下没有注册,所以需要额外添加对IOS8的注册方法,API中有下面这个方法:

  1. // Registering UIUserNotificationSettings more than once results in previous settings being overwritten.  
  2. - (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0);  

这个方法是8.0之后才能使用的,所以需要判断一下系统的版本。

第一步:注册本地通知:

  1. // 设置本地通知  
  2. + (void)registerLocalNotification:(NSInteger)alertTime {  
  3.   UILocalNotification *notification = [[UILocalNotification alloc] init];  
  4.   // 设置触发通知的时间  
  5.   NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];  
  6.   NSLog(@"fireDate=%@",fireDate);  
  7.     
  8.   notification.fireDate = fireDate;  
  9.   // 时区  
  10.   notification.timeZone = [NSTimeZone defaultTimeZone];  
  11.   // 设置重复的间隔  
  12.   notification.repeatInterval = kCFCalendarUnitSecond;  
  13.     
  14.   // 通知内容  
  15.   notification.alertBody =  @"该起床了...";  
  16.   notification.applicationIconBadgeNumber = 1;  
  17.   // 通知被触发时播放的声音  
  18.   notification.soundName = UILocalNotificationDefaultSoundName;  
  19.   // 通知参数  
  20.   NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"开始学习iOS开发了" forKey:@"key"];  
  21.   notification.userInfo = userDict;  
  22.     
  23.   // ios8后,需要添加这个注册,才能得到授权  
  24.   if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {  
  25.     UIUserNotificationType type =  UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;  
  26.     UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type  
  27.                                                                              categories:nil];  
  28.     [[UIApplication sharedApplication] registerUserNotificationSettings:settings];  
  29.     // 通知重复提示的单位,可以是天、周、月  
  30.     notification.repeatInterval = NSCalendarUnitDay;  
  31.   } else {  
  32.     // 通知重复提示的单位,可以是天、周、月  
  33.     notification.repeatInterval = NSDayCalendarUnit;  
  34.   }  
  35.     
  36.   // 执行通知注册  
  37.   [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
  38. }  

第二步:处理通知,这个是在appdelegate中的代理 方法回调

  1. // 本地通知回调函数,当应用程序在前台时调用  
  2. - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {  
  3.   NSLog(@"noti:%@",notification);  
  4.     
  5.   // 这里真实需要处理交互的地方  
  6.   // 获取通知所带的数据  
  7.   NSString *notMess = [notification.userInfo objectForKey:@"key"];  
  8.   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前台)"  
  9.                                                   message:notMess  
  10.                                                  delegate:nil  
  11.                                         cancelButtonTitle:@"OK"  
  12.                                         otherButtonTitles:nil];  
  13.   [alert show];  
  14.     
  15.   // 更新显示的徽章个数  
  16.   NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;  
  17.   badge--;  
  18.   badge = badge >= 0 ? badge : 0;  
  19.   [UIApplication sharedApplication].applicationIconBadgeNumber = badge;  
  20.     
  21.   // 在不需要再推送时,可以取消推送  
  22.   [HomeViewController cancelLocalNotificationWithKey:@"key"];  
  23. }  

第三步:在需要的时候取消某个推送

  1. // 取消某个本地推送通知  
  2. + (void)cancelLocalNotificationWithKey:(NSString *)key {  
  3.   // 获取所有本地通知数组  
  4.   NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;  
  5.     
  6.   for (UILocalNotification *notification in localNotifications) {  
  7.     NSDictionary *userInfo = notification.userInfo;  
  8.     if (userInfo) {  
  9.       // 根据设置通知参数时指定的key来获取通知参数  
  10.       NSString *info = userInfo[key];  
  11.         
  12.       // 如果找到需要取消的通知,则取消  
  13.       if (info != nil) {  
  14.         [[UIApplication sharedApplication] cancelLocalNotification:notification];  
  15.         break;  
  16.       }  
  17.     }  
  18.   }  
  19. }  


下载demo:https://github.com/632840804/LocalPush

举报

相关文章推荐

iOS推送:本地通知UILocalNotification

Notification是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iOS下应用分为两种不同的Notificati...

推送通知iOS客户端编写实现及推送服务器端编写

1、iOS客户端编程 推送通知技术在Mac OS X和iOS系统上都可以运行,我们本章主要介绍iOS客户端编程,推送通知的编程比较简单,编程的关键是获得令牌,这是从APNS返回的,然后还有把提交给内容提供商。下面我们看看开发之前的一

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

iOS10 推送通知整理

iOS 10使用独立的 UserNotifications.framework 来集中管理和使用 iOS 系统中通知的功能。在此基础上,Apple 还增加了撤回单条通知,更新已展示通知,中途修改通知内...

ios 推送通知(转载)

//这篇文章写的不错。 http://www.iwebmobile.com/ios%E5%BC%80%E5%8F%91%EF%BC%9A%E6%8E%A8%E9%80%81%E9%80%9A%E7%9F%A5%E7%AE%80%E8%BF%B0%E5%8F%8A%E5%BC%80%E5%

iOS本地推送(本地通知)

http://blog.csdn.net/woaifen3344/article/details/44302635 在iOS8之后,以前的本地推送写法可能会出错,接收不到推送的信息, ...

“iOS 推送通知”详解:从创建到设置到运行

这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解。本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义。 介绍一点点背景资料 众所周知,使用推送通知是一个很棒的、给应用添加实时消息通知的方式。这样做的结局是,开发...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)