iOS 本地推送

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 本地推送相关的知识,希望对你有一定的参考价值。

在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情。 ios中通知机制又叫消息机制,其包括两类:一类是本地通知;另一类是推送通知,也叫远程通知。两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒 两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同。今天就和大家一块去看一下如何在iOS中实现这两种机制,并且在文章后面会 补充通知中心的内容避免初学者对两种概念的混淆。

简单些了一个关于本地推送通知的demo,可以根据这个进行参考,这个方法是8.0之后才能使用的,所以需要判断一下系统的版本。

1.注册本地通知方法

+ (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];
}

取消本地通知的例子:

// 取消某个本地推送通知
+ (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;
      }
    }
  }
}

通知回调的方法:

// 本地通知回调函数,当应用程序在前台时调用
- (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"];
}

 

以上是关于iOS 本地推送的主要内容,如果未能解决你的问题,请参考以下文章

ios开发之-本地推送通知

iOS apns推送

Meteor iOS 热代码推送在 testflight 和生产中被破坏,但在本地 xcode 构建中工作

unity IOS本地推送

IOS 推送通知在本地有效,但在 bluehost 上无效

iOS推送之本地推送