大多数浏览器和
Developer App 均支持流媒体播放。
-
让您的小组件更加智能
了解如何让智能堆叠中的小组件更加智能。我们将向您展示如何将全新的小组件建议 API 与“智能轮换”结合使用,随时为人们带来更有价值的小组件体验。无论您是向系统提供及时的新信息,还是调教系统学习常见模式,采用这些 API 都可以帮助人们发现您的小组件,让您能够影响系统从 app 显示系统空间相关内容的方式。
资源
相关视频
WWDC21
-
下载
♪重低音音乐声♪ ♪ 丹尼尔李:欢迎收看 《添加智能到你的小组件》专题讲座 我是丹尼尔 我是Apple 主动智能团队的工程师 这场专题讲座中 我会示范 你的小组件可以如何和系统合作 为你的用户提供智能体验 让你的小组件可以在 用户需要的时刻出现 小组件存在很多地方 从iOS上的主屏幕 到macOS上的通知中心 小组件提供用户 能够快速一瞥的信息 在iPadOS 15推出后 小组件也来到了iPad主屏幕上 现在有比之前更多 你的小组件能出现的地方 我会先谈 系统中有智能的小组件是什么意思 然后我会示范可以如何 为你的小组件启用智能 方式是用可用API 捐赠相关信息 我们先来谈小组件智能 在iPhone和iPad上 可以把多个小组件放在智能叠放中 可以滚动查看不同小组件 在同一个地方提供各种信息 当用户编辑叠放 除了能够 添加 移除或重新排序小组件 用户也能查看并管理 叠放的智能行为 iOS 14推出了智能轮换 智能轮换让系统能在对的时间 自动滚动到 已经在叠放里的小组件 为了知道要在什么时候 轮换到某个小组件 系统用小组件提供的相关性信号 还有时间线条目进行判断 它也可以通过学习用户行为的模式 轮换到某个小组件 这是通过每当用户查看 和小组件相对应的信息时 接收来自应用程序的捐赠 有了智能轮换 如果我把天气小组件 提醒事项小组件和日历小组件 放在叠放中 天气小组件可能会叫系统 在我早上醒来时提示它 让我能查看一整天的天气 早上9点30分 日历小组件 可能会告诉系统 我10点有个会议 所以我的叠放可能会轮换到日历 到了下午 我其中一项提醒的截止时间 是下午3点 所以小组件可能会叫叠放 轮换到提醒事项 傍晚时 天气小组件 可能会叫系统再次显示天气 因为刚开始下雨 所以我如果要出去吃晚餐的话 我知道要带伞 iOS 15推出了新功能 叫做小组件建议 这是能让用户发现你的小组件 并收到主动相关信息的 全新方式 对于启用小组件建议的智能叠放 系统可以将新的小组件插入到 原本没有该小组件的叠放 只要你的应用程序明确做出捐赠 系统就可以做到这件事 和智能轮换相同 系统也可以通过 学习用户在应用程序中的行为模式 做出小组件建议 有了小组件建议 如果我只放了天气小组件 和提醒事项小组件在我的叠放中 我在一天中还是会看到这些小组件的 智能轮换 但因为我10点有场会议 而我的叠放中没有日历小组件 日历应用程序可能会叫系统 在9点30分主动将这个小组件 插入我的叠放 让我不会忘记开会 不再需要这个小组件后 系统会从我的叠放移除它 我傍晚健身完后 系统可能会显示健身小组件 让我可以快速概览我今天 圆满画圈的进度如何 之后 叠放会再次回到 原始状态 既然应用程序会在小组件有用时 叫系统暂时插入小组件 这也能帮助用户发现 他们原本可能不知道存在的小组件 现在来看如何采用智能旋转 和小组件建议 方式是用可用API 捐赠相关的信号到系统 捐赠时 你应该考虑 你的小组件可以显示的所有可能信息 并判断哪些类型相较之下比较适合 作为建议 选择如何对系统进行捐赠 最终目标是提供 时机恰当 一瞥即知 且对用户有明显价值的信息 所以你应该考虑强调 用户可能会比较有兴趣的情况 例如天气小组件 可能判断即将来临的大雨 是较适合作为建议的情况 相较之下 若某个时点只有温度变化 且变化幅度不大 那就不适合 为你的小组件 采用智能旋转和小组件建议 共有三种方式可用 一 你的应用程序可以捐赠 一个INRelevantShortcut 告诉系统它应该在何时 为你的其中一个小组件 创建小组件建议 二 你的小组件可以 通过TimelineEntryRelevance 提供相关性分数 在小组件在叠放中时启用智能旋转 三 如果你的小组件可配置 当你的应用程序用INInteraction 捐赠配置意图 系统可以学习用户的行为模式 以通过智能轮换和小组件建议 推广你的小组件 这些API 个个都能以强大的方式 增强你的小组件的存在 但它们的运作方式有些微不同 所以让我们进一步讲解 我们先谈为小组件建议 捐赠INRelevantShortcut 无论你是否用意图配置你的小组件 当你的应用程序得知 有个可以向用户显示小组件的 高度相关的情况 捐赠一个INRelevantShortcut 让系统能主动将你的小组件 插入到用户的叠放 如果他们的主屏幕还没有你的小组件 一个相关快捷方式可以 指定它相关的期间 或是让系统基于用户的行为模式 判断何时插入小组件 INRelevantShortcut支持静态 和用意图配置的小组件 但两种配置类型的捐赠 看起来会有些不同 我们来看看如何采用这两种类型 如果你的小组件支持 StaticConfiguration 你只需要创建一个新的 INRelevantShortcut 没有意图 并将widgetKind属性 设置为小组件的种类字符串 这会告诉系统要建议 你的应用程序的哪个小组件 然后可选择将 relevanceProviders属性 设置为INRelevanceProviders数组 这会告诉系统在什么时候 建议你的小组件 我等一下会深入解释 如果你的小组件支持 IntentConfiguration 用必要的参数 创建用来配置的意图的实现 然后通过将意图作为INShortcut 传递进去 创建INRelevantShortcut 当然 widgetKind和 relevanceProviders属性的设置 就跟静态小组件一样 要捐赠一个相关快捷方式 把它包含在相关快捷方式的数组中 以设置在默认的 INRelevantShortcuttore中 要更新捐赠快捷方式 你可以将存储中的相关快捷方式数组 取代成新的数组 这代表你可以 使先前捐赠的相关快捷方式失效 方式是在新的数组中省略它 捐赠一个包含意图的相关快捷方式 也可以让意图在Siri表盘上浮现 要告诉系统何时可以插入你的小组件 设置一个INRelevanceProviders数组 在你的相关快捷方式上 这里有两个选项 首先 你可以用 INDateRelevanceProvider 为固定已知的相关期间 提供开始和结束日期 例如即将来临的事件或头条新闻 你甚至可以用多个提供程序 指定不只一个相关期间 第二 你也可以选择提供 一个空的相关性提供程序数组 以告诉系统 你的小组件有新的东西可以显示 系统会基于用户 通常使用你的应用程序的时间 选择一个时间提示小组件 所有其他相关性提供程序皆支持 Siri表盘的INRelevantShortcut 但小组件建议并不支持 现在我会用一个范例应用程序 讲解采用可能会是什么样子 我们打造了一个叫做卡片的应用程序 让你查看所有信用卡的 交易和余额 它包含一个显示最近消费的小组件 我们看看可以如何为最近消费小组件 启用小组件建议 方式是在我们的应用程序中 捐赠INRelevantShortcut 我们想在用其中一张卡片消费后 提示小组件 因为小组件是用意图配置 为了让小组件建议可用 我们要先确定我们的意图 在意图定义文件中支持捐赠 这是ViewRecentPurchases意图的 意图编辑器 它会告诉我们的小组件 要显示哪张信用卡 还有用哪个商户类别筛选消费 我们想确定 “意图符合Siri建议的资格”已勾选 如果我们选择捐赠它们 这能为我们的小组件 启用主屏幕上的建议 还有在iOS其他地方的建议 但我们晚点谈INInteractions时 会再提到 然后我们需要创建一个参数组合 里面包含形成意图的必要参数 因为需要信用卡 以及商户类别才能配置我们的小组件 我们要用卡片和类别的参数 创建一个支持组合 现在我们可以在代码中创建意图 在代码中 我们的应用程序刚被通知 用户刚刚消费了 要进行捐赠 我们先创建INRelevantShortcut的 空数组 以免我们想要捐赠多个快捷方式 我们将用来配置最近消费小组件的 意图初始化 并设定任何我们可能需要的参数 这里 我们想要将意图上的卡片参数 设置为用来进行最近消费的卡片的 那个卡片对象 并将类别设置为“所有” 让小组件显示那张卡片的所有消费 然后我们用意图创建INShortcut 并用它创建一个INRelevantShortcut 我们将shortcutRole设置为 信息shortcutRole 因为用户会在小组件中查看信息 并设置widgetKind 我们提供一个 INDateRelevanceProvider 从现在开始 并在30分钟后 或者说1800秒后结束 让系统可以在 消费30分钟后移除它 然后我们将这个快捷方式添加到 relevantShortcut的数组 最后 我们捐赠该快捷方式 方式是在默认 INRelevantShortcutStore中 设置relevantShortcut数组 并在完成事件处理器中 处理任何错误 现在每次用户进行消费后 系统可以提出小组件建议 主动将小组件插入到智能叠放 现在我们来谈 TimelineEntryRelevance 当你的小组件提供时间线 给WidgetKit 你可以指定你的小组件的相关性 通过在每个时间线条目中 提供TimelineEntryRelevance 为条目下相关性的注解可表明 小组件多值得在条目的时点 进入智能旋转 此旋转价值 和小组件提供的时间线中的 所有其他条目的价值是相对的 所以你应该判断哪些条目 可能对用户比较相关 TimelineEntryRelevance 是TimelineEntry上的可选结构属性 条目的日期也是 相关性结构包含一个分数和持续时间 结构的浮动分数代表 这个条目和其他条目相比 相关性多高 分数越高 系统就越有可能 旋转到那个小组件 判断要返回哪些分数时 记得正数分数表示 有资格进入智能旋转的时间线条目 若分数为零 系统知道 不应该旋转到那个小组件 例如当小组件没有任何可显示的信息 如果旋转到该小组件 对用户来说不会是正面的体验 记住 任何所提供分数的显著性 都是相对于小组件时间线的其他分数 无论你决定相关性分数用哪种标准 记得确定分数标准在 返回的各时间线上都一致 我们待会就会讲解一个例子 相关性结构中的持续时间 会指定相关性分数有效多久 系统会用这个分数以及条目的日期 判断将叠放轮换到小组件的 有效时间范围 在那段持续时间过去后 系统会将分数当作零 直到未来别的条目再次提供相关性 你可以指定持续时间为零 让分数持续有效 直到下一个提供相关性的条目出现 我们来看这个代码是什么样子 这里是我们的 CardRecentPurchasesEntry结构 它符合TimelineEntry协议 因为协议要求一个可选相关性属性 我们可以在结构中声明相关性属性 现在当我们创建时间线条目 我们可以在创建时间线时 附加TimelineEntryRelevance实例 到我们的条目 现在让我们深入了解 最近消费小组件的时间线 可能长什么样子 并且看 可以为时间线相关性提供的分数范例 这是一个范例时间线 是最近消费小组件 可能在一天中返回的时间线 我们可能认为也许用户较关心 金额较高的消费 我们可以将消费的分数 和花费金额成线性比例 我们先将相关性持续时间保持为0 在8点15分 既然没有消费可以显示 我们会返回0的分数 在9点41分 52美元60美分的消费 代表分数会是52.6 以此类推 绘制成图表后 我们能看到比起其他分数 这次疯狂购物的分数相对很高 所以比起其他条目 这个条目更可能让系统 优先轮换到我们的小组件 其他条目还是有正的分数 所以系统还是可能在那些时候 轮换到小组件 只不过排序没那么高 因为我们将持续时间设置为0 相关性分数会维持有效 直到出现下一个有相关性更新的 时间线条目 我们也可以选择 另一个打分机制 假设我们在消费金额高于50美元时 返回的分数是50 而低于50美元的消费分数是1 跟之前一样 如果没有消费我们就返回0 对于我们的生鲜杂货消费 我们返回50 而对于在浓汤小馆 和电影院的消费 我们返回1 有了分数图表 我们可以看到分数在9点41分 上升到50 并维持在那 直到6点52分 因为50是我们的时间线的 最高可能分数 系统最有可能在这段期间 显示我们的小组件 因为我们的小组件显示最近消费 我们不想让系统 旋转到我们的小组件时 是显示很久以前的消费 所以我们只让系统在消费后30分钟内 旋转到我们的小组件 为了做到这点 我们可以用相关性结构上的 持续时间属性 我们为每个条目设置一个30分钟 或1800秒的 相关性持续时间 通过将相关性持续时间设置为半小时 我们叫系统在那半小时内 将条目标示为 有旋转的资格 然后在那之后 将它们标示为没有轮换的资格 在这些例子中 我们根据消费金额打分数 但实际上 时间线相关性分数可以是任何东西 我们也可以用消费的信用卡打分 或消费的地点 消费时间 或是完全不同的东西 没有所谓正确的方式 现在来谈捐赠INInteraction 在你的应用程序中 你可以创建并捐赠 用来配置你的小组件的意图 通过INInteraction启用智能轮换 和小组件建议 应用程序捐赠INInteraction的时刻 是每次用户查看 和小组件显示的信息相对应的 应用程序中的信息 每笔捐赠都是一个数据点 供系统的行为模型使用 模型会学习用户通常是何时 查看应用程序中的信息 每当模型预测用户 可能会再次执行交互时 系统会为意图创建一个建议 只要捐赠的意图 和用来配置小组件的意图是同一个 系统会自动从预测产出智能轮换 以及小组件建议 还有系统其他地方的建议 为了开始在卡片项目中 捐赠INInteraction 就像捐赠INRelevantShortcut 我们要确认我们的意图 符合建议的资格 并用配置小组件的必要参数 创建一个支持组合 这里 也要记得最终要设计建议UI 用于当捐赠出现在 系统的其他地方时 在卡片应用程序中 每当我们的用户 查看某张卡片的所有最近消费 我们可以捐赠小组件的意图 让系统知道 用户目前对 我们的小组件显示的信息有兴趣 首先 我们将意图初始化 我们将卡片参数设置为 用户正在查看的卡片 并将类别设置为"所有" 因为用户正在查看 这张卡片的所有交易 然后我们会用一个INInteraction 包住意图 并调用捐赠方法 现在系统会知道用户 刚在我们的应用程序中 查看过这张卡片的最近消费 一阵子后 系统可以学习 用户通常何时会这样做 并在最恰当的时机建议匹配的小组件 你捐赠的INInteraction不只能 启用智能轮换和小组件建议 它们也让系统将你的意图 以Siri建议形式显示在锁定屏幕 聚焦 和在Siri快捷方式建议小组件中 就算你的小组件不采用意图也一样 要了解更多关于 捐赠INInteraction 可以为你的应用程序做什么 并进一步利用设备内置智能 一定要观看 《Donate intents and expand your app's presence》 所以 INRelevantShortcut TimelineEntryRelevance 和INInteraction这三种方式 可以让你的小组件支持 智能轮换和小组件建议 由于系统中有其他捐赠 还有表现考量 捐赠并不保证 你的小组件会出现 但是通过条理清楚地采用这些API 你可以和系统合作 尽可能提升 你的小组件显示的可能性 开发时 有一点可能也会有帮助 那就是通过 开启WidgetKit开发者模式 跳过系统关于浮现小组件的限制 该模式就在 设置应用程序中的开发者设置 总结来说 小组件建议 是一种全新的方式 让你的小组件 能在你的用户需要它时主动出现 即使用户原本可能 根本不知道它的存在 而对于已经添加到叠放中的小组件 智能轮换让它们成为 用户的一天中可靠又可依赖的一部分 通过和系统合作 和利用设备内置智能 这些功能让你的小组件更容易被发现 也更主动 并协助营造智能主屏幕体验 我们非常期待看到 你会如何将智能添加到你的小组件 谢谢收看 祝你有美好的WWDC ♪
-
-
9:14 - Donate INRelevantShortcuts for Widget Suggestions
// Donate INRelevantShortcut for Widget Suggestions in app // User has just made a purchase var relevantShortcuts: [INRelevantShortcut] = [] let intent = ViewRecentPurchasesIntent() intent.card = Card(identifier: card.identifier) intent.category = .all if let shortcut = INShortcut(intent: intent) { let relevantShortcut = INRelevantShortcut(shortcut: shortcut) relevantShortcut.shortcutRole = .information relevantShortcut.widgetKind = “CardRecentPurchasesWidget” let dateProvider = INDateRelevanceProvider(start: Date(), end: Date(timeIntervalSinceNow: 1800)) relevantShortcut.relevanceProviders = [dateProvider] relevantShortcuts.append(relevantShortcut) } INRelevantShortcutStore.default.setRelevantShortcuts(relevantShortcuts) { (error) in if let error = error { print("Failed to set relevant shortcuts. \(error))") } else { print("Relevant shortcuts set.") } }
-
12:35 - Adopting TimelineEntryRelevance for Smart Rotate
// Appending TimelineEntryRelevance to a TimelineEntry in widget extension for Smart Rotate struct CardRecentPurchasesEntry: TimelineEntry { let date: Date let relevance: TimelineEntryRelevance? let card: IntentCard? let category: PurchaseCategory } let relevance = TimelineEntryRelevance(score: 16.29, duration: 1800) let entry = CardRecentPurchasesEntry(date: Date(), relevance: relevance, card: card, category: category)
-
17:01 - Donate INIntents through INInteraction for Widget Suggestions and Smart Rotations
// Donate INIntent in a card's purchases list in the app .onAppear { let intent = ViewRecentPurchasesIntent() intent.card = Card(identifier: card.id.uuidString, displayString: card.name) intent.category = .all let interaction = INInteraction(intent: intent, response: nil) interaction.donate { error in if let error = error { print(error.localizedDescription) } } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。