玩转 iOS 10 推送 —— UserNotifications Framework(下)

《上》我们聊了一些:json

  • iOS 10 before 推送的流程
  • iOS 10 beta 推送的基本使用方法
  • 以及跟 iOS 10 before 推送的区别

《中》向你们详细介绍了:ide

  • Notification Actions:3d-touch 轻触推送横幅操做
  • Dismiss Actions:锁屏推送侧滑操做 | 通知中心推送侧滑操做 | 非 3d-touch 横幅下拉操做
  • Response handling:点击横幅或操做的后续处理
  • Service Extension:更新推送横幅(alert 变为 title subtitle content)

《下》篇中将为你们介绍更加进阶的内容:动画

  • Notifications User Interface:iOS 10 推送 UI
  • Media Attachments:在推送横幅里增长图片、gif、音频、视频
  • Customization:彻底自定义推送横幅的 UI,并在点击操做之后当即更新推送横幅 UI

Notifications User Interface

咱们先来看一下 iOS 10 默认的推送 UI。
包括「横幅、锁屏、通知中心 」三处,看起来差很少的样子。
ui

Media Attachments

推送内容中增图片、gif、audio、video。
在以上的三个界面均可以经过 3d-touch 触发。
先一块儿来看看效果。url

添加方法

  1. 打开 iOS Xcode Project - File - New - Target - iOS - Notification Service Extension - Next - Product Name 填写 yourPushNotificationService - Finish
    具体图示方法,在《中》里有详细的介绍。spa

  2. 添加文件。把大家定制的各类 media 文件拖拽至上一步系统自动生成的 yourPushNotificationService 文件夹下,勾上 copy to items,add to targets 必定要选择这个 Notification Service 做为 target,以下所示。
    设计

  3. 添加代码。在 2 中生成的 NotificationService.m 里添加代码:3d

    -(void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    
     self.contentHandler     = contentHandler;
    
     // 1.把推送内容转为可变类型
     self.bestAttemptContent = [request.content mutableCopy];
    
     // 2.获取 1 中自定义的字段 value
     NSString *urlStr = [request.content.userInfo valueForKey:@"your-attachment"];
    
     // 3.将文件夹名和后缀分割
     NSArray *urls    = [urlStr componentsSeparatedByString:@"."];
    
     // 4.获取该文件在本地存储的 url
     NSURL *urlNative = [[NSBundle mainBundle] URLForResource:urls[0] withExtension:urls[1]];
    
     // 5.依据 url 建立 attachment
     UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:urlStr URL:urlNative options:nil error:nil];
    
     // 6.赋值 @[attachment] 给可变内容
     self.bestAttemptContent.attachments = @[attachment];
    
     // 7.处理该内容
     self.contentHandler(self.bestAttemptContent);
    }复制代码
  4. 先运行你的项目 target 使之在手机上安装,再运行 Notification Service 的 target,并选择在你的项目上运行该 Extension。此时可进行 Notification Service 代码的调试,即在 NotificationService.m 中打断点能够调试,可是在你的项目中的断点没法调试。调试

  5. 发送 payload 需依照下述格式:code

    {  
       aps : { 
           alert : {...}, 
           mutable-content : 1 //必须
       }
       your-attachment : aPicture.png //必须
    }复制代码

    其中:

    • mutable-content : 1 说明该推送在接收后可被修改,这个字段决定了系统是否会调用 Notification Service 中的方法。
    • your-attachment:是自定义的字段,key 能够自定义(你本身要记住),value 须要是一个完整的文件名(或 url,后续会详细解释),即你想要展现的文件。
  6. 手机接收后,在任一个能看到推送条目的界面对推送条目进行 3d-touch 强按均可以触发。(须要 iPhone 6s 及之后设备 & iOS 10)

  7. 提示:各类 media 文件大小有必定限制,图片、视频等过大都不会被展现,Apple 的意思是:对于图片,最大宽度也就和屏幕等宽,过大的图片没有意义;对于音频、视频等,彻底能够提供一个短期预览部分,更多的内容仍是须要用户点击推送进入 App 以后对完整的内容进行查看。但愿开发者听从这样的逻辑进行开发。

Notification Content

iOS 10 新增的另外一项 Extension,用于彻底自定义推送展现的 UI 界面,响应 Actions 的同时刷新该 UI。简单的说就是你能够把须要推送的内容(好比一条完整的新闻快讯,包括多条文字+图片的组合)所有放到一条推送里,用户点击了一个 Action(如赞、踩、关注、甚至评论等),在推送里马上刷新 UI(如展现加星动画、评论内容等)。

特色

  • 须要添加 Notification content extension
  • 彻底自定义 UI
  • 推送 UI 不能响应触摸、点击、滑动等任何手势
  • 能够响应 notification actions

下图中日程表的 UI 彻底由开发者自定义,而且在点击了 Accept 以后,UI 当即发生了变化:

添加方法

打开 iOS Xcode Project - File - New - Target - iOS - Notification Content - Next - Product Name 填写 yourPushNotificationContent - Finish

系统会在 Xcode 工程目录中 自动生成 yourPushNotificationContent 文件夹,而且包含四个文件:NotificationViewController.hNotificationViewController.mMainInterface.storyboardInfo.plist

NotificationViewController.h/m
  • 继承自 UIViewController,并实现了 UNNotificationContentExtension 协议。
  • 你能够在 viewDidLoad 里各类代码写你的 UI,或者使用 storyboard 拖拖拽拽就 ok。
  • 在 didReceiveNotification 方法里接收推送内容,而后各类处理逻辑、传值、展现 UI 等等。当点击了 actions,也会走到这里,而且包含一个 action 的字段,判断点击了哪一个 action 进而相应的更新你的 UI。
MainInterface.storyboard

拖拖拽拽一个 UI 就出来了 ^。^

Info.plist
  • 须要在这里让系统知道,哪一个 id 字段会触发你这个 extension。


    高亮部分字段的值,须要跟 Notification Actions 的 category id 值同样,这样收到推送时,就会同时触发 Notification content + Notification actions。

  • 同时这里也能够添加多个值,用于收到不一样的推送,展现相似的 UI。
    好比接受聚会邀请和提醒聚会邀请,UI 相近,操做却不一样。

调试

当你各类 UI 展现后,会发现存在 2 个问题。

其一

是系统会自动展现一遍收到的推送内容,这部分极可能跟你的内容是重复的。

解决方法

在 Info.plist 中添加以下字段,而且把值设为 YES 便可隐藏系统默认的展现。

其二

是展现内容比较少的时候,系统仍然会以最大的界面展现出来,会露出不少空白部分。

解决方法
方法一:在 viewDidLoad 中调整 self 的 size 以达到一个合适的尺寸。以下获取了 size,并修改至一半的高度。
- (void)viewDidLoad {
    [super viewDidLoad];
    CGSize size = self.view.bounds.size;
    self.preferredContentSize = CGSizeMake(size.width, size.height/2);
}复制代码

效果以下所示,仔细看你会发现存在小 bug,先展现了完整的高度,而后瞬间变成一半的高度,看起来有个高度适应的动画的样子。致使这种结果的缘由是系统准备展现推送的时候,尚未执行到你的代码(展现从系统层级到 App 层级的过程),这是苹果内部的机制所致。

方法二:仍是在 Info.plist 文件添加新的字段,设置缩放比例。

这样系统层级会预先读取该数据,用于展现。固然有时候展现的内容不一样,须要的高度不一样,而这里只能设置成惟一的固定值。不过这也是现阶段苹果所能给你提供的可行方法了。

而后最终的展现效果以下,没有上面那个不舒服的高度调整动画了。

小结

感受 Notification Content 的功能极其强大,有了它以后连 App 都不须要再启动了的样子(只要能合理的设计展现内容和操做),省去了用户每次为了一项简单操做都要进行「启动 App - 操做 - 切换到多任务界面 - 退出 App」这样的繁琐过程。本来用户看到推送可能不太有意愿去查看详细内容,如今他只须要很简单的操做就能快速的查看,推送的点开率应该会所以而大幅增长吧。
究其如此便捷的缘由,Notification Service Extension 和 Notification Content 都是独立于项目的 target,收到推送后,系统会单独运行这两个 target,彻底不会在此时去启动 App 并执行 App 中大量的代码,童鞋们在调试的时候也能够注意这一点。

以上 《玩转 iOS 10 推送》上中下三篇就所有结束了,更多分享内容将会在以后奉上^。^

相关文章
相关标签/搜索