大多数浏览器和
Developer App 均支持流媒体播放。
-
采用快速备忘录
了解如何将您的 app 链接到快速备忘录,并帮助人们快速地将您的内容和他们的备忘录之间进行链接。了解快速备忘录如何通过 NSUserActivity 识别并链接到 app 内容,并了解如何在您的 app 中采用此 API。我们将带您了解为快速备忘录提供支持有哪些要求、优势和功能。我们还将为 NSUserActivity 提供指导和最佳实践,让您的 app 充分利用这些功能。
资源
相关视频
WWDC18
-
下载
你好 我是妮姬布劳尔 我是Pencil and Paper团队的工程师 今天 我会示范如何使用快速笔记
快速笔记是一种全新 全系统的笔记体验 不仅简化在iOS和macOS上 键入笔记的功能 而且可以在一个地方 连结多个App和网站的内容
你可以利用这项功能 随时随地查看笔记 它最大的优点是使用现有的API NSUserActivity 你可能有听过 因为这也应用于其他功能 例如接力
今天 我会向你示范快速笔记直播 和实际操作 我会介绍如何在系统上操作 以及如何应用NSUserActivity 最后 我会介绍一些很好的实作例子 以便你创建最佳体验
为了让你认识快速笔记的崭新功能 我会逐步示范 拟定行动计划 使用Apple Fitness+ 进行体能训练 现在我尚未登入 因为我想先拟订行动计划 我不需要切换到备忘录App 现在先用Apple铅笔 从屏幕右下角向上轻扫 利用快速笔记创建一个全新的笔记 以便开始体能训练时可以查看 在Apple网站上 我可以找到一切所需信息
此外 快速笔记顶部 有一个添加链接的菜单 我可以在上面添加网站链接 以便之后查看笔记
类似画中画功能 快速笔记的窗口 可以在设备屏幕上任意移动 也可以通过双指捏合或张开 将窗口缩到最小 或放到最大
完成笔记后 可以按下左上角的“完成” 但我还需要新增内容 我可以将界面向右轻扫至显示屏边缘 以隐藏视频 当然 除了网站 它也适用于App 利用“地图” 我找到了进行 高强度间歇训练的极佳地点 我可以拉出隐藏的笔记 在上面新增这个地点 如需更多绘图空间 可轻点工具栏上的“笔记”图像 便可以在快速笔记App中打开笔记
以下 我会示范如何 在图像和链接上添加笔记
我在这里新增的链接 并不是一般的链接 当然 轻点这些链接 可以打开相关的Safari或地图 不仅如此 我还可以浏览之前所做的笔记 通过这些附有快速笔记建议的App 当我浏览有关Apple Fitness+的网站 快速笔记建议的界面会显示在右下角 轻点这里可以查看之前的笔记 我会添加一项笔记 提示我的目标是 每周进行四至五次的高强度间歇训练
我在iPad上创建了一个笔记 它也适用于Mac等不同平台
当我浏览有关Apple Fitness+的链接 快速笔记建议界面 也会出现在我的Mac上 点按它便会连到快速笔记App的笔记 初步认识快速笔记后 我们来谈谈它的操作方法 我们可以利用NSUserActivity对象 捕获App的使用状态留待之后使用 用户活动对象的创建 是关于你当前进行的活动 例如是查看网页或App内容 系统会暂存每个App当前的活动
然后 系统会将这些活动 发送到其他功能 例如是接力
快速笔记会在这个系统上 连结背负的内容
除了连接到接力 Spotlight和提醒事项之外 活动记录也会发送到快速笔记 这是添加链接菜单会显示链接的原因 快速笔记建议也是由此而产生
NSUserActivity已有三个属性 作为持久的标示符 链接App内容与快速笔记 要成为这个生态系统的一部分 你必须设置一个或多个 以下属性: 目标内容标识符 持久标识符 以及网页链接 你可以按自己想支持的功能 选择相应属性
目标内容标识符也适用状态恢复期间 此属性让你在iPad使用App时 享受多任务处理的畅快体验
持久标识符可以在 系统的Spotlight索引 识别App内容 网页链接也适用于 接力期间的后备网页 为了使快速笔记链接起作用 以下一些属性 是标识符必须具备的 这些标识符既具有独特性 因应个别内容而异 亦具有通用性 以便在不同装置上使用 最后是具有稳定性 以便用户可以长远使用这些内容 每项活动均具有独特性 通用性和稳定性 以产生快速笔记建议 当我回到有关Apple Fitness+的网站 我会看见快速笔记建议的界面 这是由于链接中的标识符 不管是在一小时或六个月前创建 仍然对应于网站上的标识符
使用NSUserActivity有三个主要步骤 在App的Info.plist中 宣告你要支持的活动 创建和暂存用户活动 描述不同时间的屏幕内容 并处理传入请求以继续活动
这可能来自快速笔记的链接 或其他装置 宣告你的App所支持的活动类型 在Info.plist文件中 NSUserActivityTypes键下面
系统使用该键的信息来决定 你的App能否处理 既定的用户活动对象 要创建一个NSUserActivity对象 你可用plist暂存活动的类型字符串 并设定标题 设定前面提到的标识符 可设定一个或多个 这些标识符中的任何一个 都适用于快速笔记 在这个示例中 假设你使用的是iPad App 这也适用于支持状态恢复 设定目标内容标识符 设定用户数据属性 以配合任何App特定的 所需状态信息以继续活动
然后 将其附加到响应者
现在你不需要暂存活动 通过手动管理当前App的活动 而可以让系统为你处理 通过在响应者上设定活动 该对象会由UIKit和AppKit管理
因为NSUserActivity可跨平台使用 此代码适用于iOS和macOS 最后一步是处理接收传入的活动 并在你的App恢复状态 点击链接时 快速笔记会启动你的App 并调用场景(willContinueUserActivity WithType)方法 这属于界面窗口场景委托 你可以在此处提供 App正在接收活动的反馈
之后 快速笔记会将活动 提供给你的App 在场景(continue userActivity:) 你可以在此处设定任何 视图控制器、视图 并使用用户数据字典 以恢复并继续活动 以接力为例 如果装置无法连接 系统调用场景(didFailToContinue UserActivityWithType) 你可以显示错误消息 这个方法并不适用于快速笔记 但适合于全面应用 NSUserActivity的建置
至于macOS App 建置相同的 应用程序 应用程序(继续用户活动) 和应用程序(didFailToContinueUser ActivityWithType) 在App的委托 如果你想知道更多 有关NSUserActivity的信息 你可以浏览WWDC 2014影片 标题为“在iOS 8和OS X上使用接力”
NSUserActivity是一个重要的网关 因为它是许多其他功能的基础
通过在快速笔记上的应用 你可以处理很多事情 接力为默认开启 其他功能则由用户选择 你的App具有强大功能 因为其他人可以在你App上的文件 创建提醒事项 或者关注你App上的博客文章 甚至改善多窗口处理
你可以查看最新的文档 和相关的WWDC视频 以获得更多信息 最后 重要的是 让我们看一些 在快速笔记应用NSUserActivity的 最佳实作例子 我将讨论四种行为 讨论每种行为的时候 我也会谈及为何 及如何在你的App中建置它们
标题属性是一个 人类可读的活动字符串
这是显示在添加链接菜单中的字符串 也就是说 标题应该提供一个很好的 内容的描述性表示法 一般来说 最好直接使用文档或项目的标题
标识符应具有独特性、通用性 和稳定性 这里有些小提示
避免使用只适用于特定装置的数据 如果这张照片的标识符是 其本地文件路径 该链接只能确保 在创建它的装置上使用 避免任何临时信息 例如session ID 或特定的查看属性 照片的标题可能隐含独特性 但如果可以修改 无法保证在尝试导航回此内容时 它仍然存在
从长远来看 比如使用App保存的 UUID 来存取照片 将允许你的App恢复快速笔记链接 即使内容已被更动 尽管链接可以是App内容的 唯一标识符 它们通常包含瞬态信息 有别于前述的标识符指引 在快速笔记 目标内容标识符 或持久标识符常用于网页链接 网页链接非常好用 只要遵循指引 若你的应用程序使用NSUserActivity 进行状态恢复和Spotlight 使用的值等同目标内容标识符 和持久标识符 如果有一个网站称赞你的App 添加一个链接作为第二个后备标识符 这样 如果App未安装 打开链接会重定向到你的网站
另一个重要的做法是确保App的 当前NSUserActivity是最新版本 这表示跟上当前发生的活动
最好确保标题和标识符属性准确 当检测到任何活动变化时 比如选取和查看另一张照片
不建议重用活动实例 当有新内容 例如新照片 你需要创建一个新活动
让UIKit和AppKit处理当前的App活动 通过将活动附加到响应者 如视图控制器或视图 就像我在示例代码所示范的那样 如果附加到响应者 不适用于你的App 可以手动管理当前的App活动 你可以适当调用“becomeCurrent()” 和“resignCurrent()” 例如 当完成查看照片 该App会在当前活动上调用 “resignCurrent()” 当你选取一张新照片 App会在新活动上调用 “becomeCurrent()”
为了提升性能 好好利用活动的“需要储存”属性 活动可能需要特定的视图属性 才能正确还原 App的活动 例如 查看地图时的位置和缩放 这些属性可以与活动一起传递 但是在每次手势后更新时 都会产生额外开销 除了更新活动之外 我们也可以将“需要储存” 设定为“是” 当系统需要将活动发送到 快速笔记链接或接力 便会调用委托回调 “userActivityWillSave” 以便App按需要更新所有属性
这种回调是用户数据字典 可以更新的地方 当中包括 任何有助恢复活动的属性
这里有几个兼容性问题要处理 如果应用程序已更新 那怎么办? 利用来自App的两个链接 来键入笔记 这些链接可能来自旧版或新版的App 而非装置目前的版本 这绝对没有问题 但链接必须是可用的 为了解决兼容性的问题 确保App的之前版本 能够支持处理接收活动 并预期接收来自较新版本的活动时 可能会出现错误 这可以通过对你的活动 进行版本控制来支持 或使用键入字典 并容许有些键入指令可能会失效 或者有些你不明白的地方 如果内容不再存在怎么办?
活动链接到的内容 可能已被删除或移动 当导航回到App时 如果内容被删除 便会显示错误消息 如果内容被移动 便会重定向 通过使用快速笔记 你可以将App置入新的笔记系统 这个系统旨在更好地连系人与人 以及用户、内容和App之间的关系 确保你已使用NSUserActivity 现在是重新审视和完善 任何现有代码的绝佳机会
确保标识符具有独特性 通用性和稳定性 并在响应者上设定你的活动 以便系统管理App目前的 NSUserActivity 谢谢观看 希望你享受在App上 使用快速笔记及其他功能 [打击乐]
-
-
16:57 - How to adopt NSUserActivity to support Quick Note
// Create the NSUserActivity and describe the content or user activity let activity = NSUserActivity(activityType: "com.myapp.MyActivityType") activity.title = document.title // Set one or more of: // .targetContentIdentifier // .persistentIdentifier // .webpageURL activity.targetContentIdentifier = "uniqueGlobalStableIdentifier" // Set userInfo to save app-specific state information activity.userInfo = ["myKey": …] // Attach it to a view controller, window, or other responder; let the system make it current when needed viewController.userActivity = activity
-
17:02 - Handle NSUserActivity continuation in your window scene delegate or app delegate - iOS
class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, willContinueUserActivityWithType userActivityType: String) { // show user feedback while waiting for the NSUserActivity to arrive } func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { // set up view controllers and views to continue the activity } func scene(_ scene: UIScene, didFailToContinueUserActivityWithType userActivityType: String, error: Error) { // show error about failing to continue an activity } … }
-
17:06 - Handle NSUserActivity continuation in your window scene delegate or app delegate - macOS
class AppDelegate: NSObject, NSApplicationDelegate { func application(_ application: NSApplication, willContinueUserActivityWithType userActivityType: String) -> Bool { // show user feedback while waiting for the NSUserActivity to arrive return true } func application(_ application: NSApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([NSUserActivityRestoring]) -> Void) -> Bool { // set up view controllers or documents to continue the activity return true } func application(_ application: NSApplication, didFailToContinueUserActivityWithType userActivityType: String, error: Error) { // show error about failing to continue an activity, if appropriate } … }
-
17:26 - Improve performance with needsSave
activity.needsSave = true … func userActivityWillSave(_ userActivity: NSUserActivity) { userActivity.userInfo = [ "center" : visibleFrame.middle "zoomScale" : scrollView.zoomScale ] }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。