美文网首页
iOS本地推送(通知)

iOS本地推送(通知)

作者: G_GUI | 来源:发表于2018-01-04 12:39 被阅读0次

前言

这个是很久之前在CSDN上发布过的文章了,现在整理放到新的个人博客上。本篇文章是讲如何操作本地推送,若使用过程中出现任何问题,可以加群提出或者在评论中提出。

兼容iOS版本

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

  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

说明在iOS8下没有注册,所以需要额外添加对IOS8的注册方法,API中有下面这个方法:

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

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

本地通知三步法

  • 第一步:注册本地通知
  • 第二步:处理通知回调
  • 第三步:取消某个推送或者全部推送

注册本地通知

// 设置本地通知  
+ (void)registerLocalNotification:(NSInteger)alertTime {  
  UILocalNotification *notification = [[UILocalNotification alloc] init];  
  // 设置触发通知的时间  
  NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];  
  NSLog(@"fireDate=%@",fireDate);  
    
  notification.fireDate = fireDate;  
  // 时区  
  notification.timeZone = [NSTimeZone defaultTimeZone];  
  // 设置重复的间隔  
  notification.repeatInterval = kCFCalendarUnitSecond;  
    
  // 通知内容  
  notification.alertBody =  @"该起床了...";  
  notification.applicationIconBadgeNumber = 1;  
  // 通知被触发时播放的声音  
  notification.soundName = UILocalNotificationDefaultSoundName;  
  // 通知参数  
  NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"开始学习iOS开发了" forKey:@"key"];  
  notification.userInfo = userDict;  
    
  // ios8后,需要添加这个注册,才能得到授权  
  if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {  
    UIUserNotificationType type =  UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;  
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type  
                                                                             categories:nil];  
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];  
    // 通知重复提示的单位,可以是天、周、月  
    notification.repeatInterval = NSCalendarUnitDay;  
  } else {  
    // 通知重复提示的单位,可以是天、周、月  
    notification.repeatInterval = NSDayCalendarUnit;  
  }  
    
  // 执行通知注册  
  [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
}  

处理通知回调

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

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

取消某个推送

// 取消某个本地推送通知  
+ (void)cancelLocalNotificationWithKey:(NSString *)key {  
  // 获取所有本地通知数组  
  NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;  
    
  for (UILocalNotification *notification in localNotifications) {  
    NSDictionary *userInfo = notification.userInfo;  
    if (userInfo) {  
      // 根据设置通知参数时指定的key来获取通知参数  
      NSString *info = userInfo[key];  
        
      // 如果找到需要取消的通知,则取消  
      if (info != nil) {  
        [[UIApplication sharedApplication] cancelLocalNotification:notification];  
        break;  
      }  
    }  
  }  
} 

相关文章

  • iOS 通知机制总结

    iOS中提供了2种推送通知 本地推送通知(Local Notification) 远程推送通知(Remote No...

  • iOS-消息推送

    iOS 消息推送包括远程推送通知(Remote Notification)和本地推送通知(Local Notifi...

  • iOS 推送通知及通知扩展

    级别: ★★☆☆☆标签:「iOS 本地推送」「iOS 远程推送」「iOS通知扩展」作者: dac_1033审校: ...

  • 26 - 推送

    iOS中提供了2种推送通知: 本地推送通知(Local Notification) 远程推送通知(Remote N...

  • iOS推送通知概览

    iOS推送通知概览 一、响应推送(本地通知 和 远程通知 都合适) iOS 10 以前 1. UIUserNoti...

  • iOS本地通知和远程推送

    iOS 本地通知和远程推送 推送通知的应用,可以推送最新的消息给用户,获得更多的关注。推送分为本地推送和远程推送两...

  • iOS 本地推送通知

    本地推送通知 对本地通知的数量限制,iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被iOS忽略。 a...

  • UILocalNotification

    iOS提供两种推送机制: 本地推送通知(Local Notification)与远程推送通知(Remote Not...

  • 技术贴:5.iOS中的推送(本地推送、极光推送)

    iOS中分为本地推送和远程推送两种; 本地推送: 1.创建一个本地通知(UILocalNotification)(...

  • iOS 关于远程推送的知识普及

    首先简单介绍一下iOS下推送通知吧!,推送通知分为有local本地推送,remote远程推送,而iOS7之后对远程...

网友评论

      本文标题:iOS本地推送(通知)

      本文链接:https://www.haomeiwen.com/subject/dzcrnxtx.html