iOS Rich Notification 最酷的效果

iOS 10 上的通知系统

iOS 10 上面 Apple 提出了 Rich Notification,简单说除了显示文字以外,你还能通过推送消息展示图片甚至更丰富的媒体内容。具体来说 iOS 10 提供了两种 Extension,一个可以用来提供界面,一个可以用来修改通知的内容。

如果这篇文章是教你如何编写上面两种 Extension 的话那未免太无聊了,那样的文章你在哪里都能看得到。这篇文章我要讲的是我最近开发出来的东西里面我觉得最有意思的一个:通知消息可以展示任何界面(而不仅限于写好的界面),甚至可以执行任务。

这种交互方式让我非常的爽,并且我在之前也没有见其他的开发者有这么做过。

这是一个例子:

这个例子展示了到达指定时间之后,收到一个通知,用 3D Touch 按压之后,我们直接看到了回家的公交信息。

实现原理

简单说,我们还是通过 UNCalendarNotificationTrigger, UNLocationNotificationTrigger, UNTimeIntervalNotificationTrigger 等 triggers 来设置一个 LocalNotification,但是我们在 UNMutableNotificationContent 的 userInfo 里面写下一些信息,例如:

content.userInfo = @{@"script": scriptName}

这个字典可以用于存储一些而外的信息,对用户是不可见的,比如上述例子我们存储了用户想要启动的脚本的名字。当然也需要为 Notification 设置合适的 Category,方便被我们的 Notification Extension 识别出来。

然后我们需要实现一个 UNNotificationContentExtension,这个 Extension 里面我们通过 UNNotificationExtensionCategory 指定上述的 category,代表当这种类型的推送被处理时,这个 Extension 可以出来。

同时我们可以通过 UNNotificationExtensionInitialContentSizeRatio 来指定 Extension 界面初始化的高度,用 preferredContentSize 来指定最终的高度。

让通知在前台也可见

很多人知道,iOS 的系统通知当应用在前台的时候是不会显示的提示给用户的,你会收到回调,但你可能需要自己实现代码提示给用户(比如 Alert 或是一个自定义的通知界面)。

那是以前。

从 iOS 10 开始,你只要实现了这个方法,通知就会在前台也显示,体验和放在后台完全一样:

```objc

  • (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    if (completionHandler) {
    completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
    }
    }
top Created with Sketch.