iOS 10 添加本地推送(Local Notification)

ConcepcionJ 8年前
   <h2>前言</h2>    <p>iOS 10 中废弃了 UILocalNotification ( UIKit Framework ) 这个类,采用了全新的 UserNotifications Framework 来推送通知,从此推送通知也有了自己的标签 UN (这待遇真是没别人了),以及对推送功能的一系列增强改进(两个 extension 和 界面的体验优化),简直是苹果的亲儿子,因此推送这部分功能也成为开发中的重点。</p>    <p>本文主要查看了 iOS 10 的相关文档,整理出了在 iOS 10 下的本地推送通知,由于都是代码,就不多做讲解,直接看代码及注释,有问题留言讨论哦。</p>    <h2>新的推送注册机制</h2>    <p>注册通知( Appdelegate.m ):</p>    <pre>  <code class="language-swift">#import <UserNotifications/UserNotifications.h>  #import "AppDelegate.h"  @interface AppDelegate ()<UNUserNotificationCenterDelegate>    @end    @implementation AppDelegate    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {      // 使用 UNUserNotificationCenter 来管理通知      UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];      //监听回调事件      center.delegate = self;            //iOS 10 使用以下方法注册,才能得到授权      [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound)                            completionHandler:^(BOOL granted, NSError * _Nullable error) {                                // Enable or disable features based on authorization.                            }];            //获取当前的通知设置,UNNotificationSettings 是只读对象,不能直接修改,只能通过以下方法获取      [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {                }];      return YES;  }    #pragma mark - UNUserNotificationCenterDelegate  //在展示通知前进行处理,即有机会在展示通知前再修改通知内容。  -(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{      //1. 处理通知            //2. 处理完成后条用 completionHandler ,用于指示在前台显示通知的形式      completionHandler(UNNotificationPresentationOptionAlert);  }  @end  </code></pre>    <h2>推送本地通知</h2>    <pre>  <code class="language-swift">//使用 UNNotification 本地通知  +(void)registerNotification:(NSInteger )alerTime{            // 使用 UNUserNotificationCenter 来管理通知      UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];            //需创建一个包含待通知内容的 UNMutableNotificationContent 对象,注意不是 UNNotificationContent ,此对象为不可变对象。      UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];      content.title = [NSString localizedUserNotificationStringForKey:@"Hello!" arguments:nil];      content.body = [NSString localizedUserNotificationStringForKey:@"Hello_message_body"   arguments:nil];      content.sound = [UNNotificationSound defaultSound];            // 在 alertTime 后推送本地推送      UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger   triggerWithTimeInterval:alerTime repeats:NO];        UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"   content:content trigger:trigger];            //添加推送成功后的处理!      [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {          UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"本地通知" message:@"成功添加推送" preferredStyle:UIAlertControllerStyleAlert];          UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];          [alert addAction:cancelAction];          [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];      }];  }  </code></pre>    <p>iOS 10 以前本地推送通知:</p>    <pre>  <code class="language-swift">+ (void)registerLocalNotificationInOldWay:(NSInteger)alertTime {      // ios8后,需要添加这个注册,才能得到授权      // if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {      // UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;      // UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type      // categories:nil];      // [[UIApplication sharedApplication] registerUserNotificationSettings:settings];      // // 通知重复提示的单位,可以是天、周、月      // }            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];  }  </code></pre>    <p> </p>    <p>来自:http://www.daizi.me/2016/07/01/iOS 10 添加本地推送(Local Notification)/</p>    <p> </p>