大多数浏览器和
Developer App 均支持流媒体播放。
-
遇见表盘共享
展示你的 watchOS app 的复杂功能 ,并创建值得共享的表盘。了解如何在 watchOS 和 iOS app 内共享表盘,或将表盘发布在网络上,以供其它人查找和下载。我们还将探讨使用表盘预览图像的最佳方法,并向你展示如何创建流畅的安装体验。
资源
相关视频
WWDC20
-
下载
(你好 WWDC 2020) 你好 欢迎来到 WWDC (遇见表盘共享) 你好 我叫 Jared McGann 我是 watchOS 的工程经理 今天 我们想谈谈 Apple Watch 表盘共享 是 watchOS 7 和 iOS 14 中的 一项新功能 表盘共享正是您所期望的 与任何人共享一个表盘的功能 按照你喜欢的方式进行配置 表盘可以直接从手表共享 通过长按你的表盘和轻点新的“共享”按钮 选择一个收件人 写一个消息 就这样 在信息中 你会在手表上看到内联预览 收件人也一样 他们只需轻点预览 系统就会提示他们将此表盘添加到手表上
你还可以从你的 iPhone 共享表盘 只需打开 iOS Watch app 然后选择一个表盘 然后点击在右上角熟悉的“共享”图标
你会看到一个共享键 你可以选择如何共享你的表盘 那么 作为一个开发者 如何利用表盘共享呢? 好吧 表盘可以直接从你的 app 共享 并托管在网站上 只需轻点几下 你所配置的表盘就可以安装在 客户的 Apple watch 上 如果你在表盘上添加了复杂的功能 用户在添加表盘时就会被提示 安装你的 app
如果你的 app 在收件人所在地区不可用 那么你的复杂功能就不会出现在表盘上 值得一提的是 一些新表盘在老款手表上是无法使用的 耐克和爱马仕的表盘 只能在各自的硬件上生成和添加 表盘文件包含所有表盘配置 包括颜色、风格、照片和复杂功能 你可以在手表上配置的任何东西 如果表盘有你的复杂功能 该文件将包括一个示例条目 以便它可以在收件人的设备上预览 即使你的 app 尚未安装 今年我们在 ClockKit 中推出了 令人兴奋的新的复杂功能 API 表盘现在支持 来自同一 app 的多种复杂功能 如果你的复杂功能利用了 用户信息代码字典或用户活动 这些使用偏好可以包括在 一个共享的表盘内 例如 如果一个共享表盘 包括了 Dawn Patrol 的复杂功能 用户信息代码字典可以用来指定 显示的是哪个城市的冲浪情况 要了解更多 请观看“为 Apple Watch 创造复杂功能”的演讲
所以今年 我们向 ClockKit 添加了新的 API 允许你提示客户在 app 中添加一个表盘 使用本地 URL 调用 addWatchFace 到你预先配置的表盘文件 并会提示客户 将表盘添加到他们的 Apple Watch 中 watchOS 和 iOS 的 ClockKit 中 都可以使用此 API 当你的复杂功能被添加到手表上后 你的 app 将运行并响应 ClockKit 的时间轴请求 此时 你的 app 可以引用 我前面提到的用户信息代码字典 现在我想把话题交给 Joe 他将告诉我们 如何把这个功能 添加到一个现有的 app 中 谢谢 Jared 你好 我叫 Joe Dio 我是 watchOS 的软件工程师 今天 我将向大家展示 如何在 iOS 和 watchOS app 中 轻松采用新的表盘共享 API 我有一个叫做“咖啡追踪器”的 app 这个 app 可让你追踪 每日咖啡因的摄入量 这是我的 app 的主要视图 在这里我可以查看我一天的咖啡因摄入量 如果我点击底部的咖啡杯按钮 它会打开饮料列表视图 在饮料清单视图 我可以看到含咖啡因的饮料清单 如果我轻点其中一种饮料 它就会加入到我一天的咖啡因摄入量中
我的 app 还有一个 带有复杂功能的手表 app 可以显示你当前的咖啡因摄入量 我认为我的 app 的复杂功能 是超级有用的 我想在我的 app 中 与我的客户分享这些功能 我认为在我的 iOS app 中实现表盘共享 是实现这一点的好方法 让我们看看如何实现这一点 这是我将如何在这个 app 内 实现表盘共享的概述 首先 我需要使用 app 的复杂功能 生成表盘 接下来 我需要将表盘和表盘预览 导入到我的 app bundle 中 然后我将创建用户界面 用于显示和添加表盘 最后 我将添加对旧手表的支持 因此 让我们看看如何做到这一点
我在使用电话 首先 我需要创建一个表盘分享 所以我将打开 Watch app
我将打开表盘库
现在 让我们来寻找一款 能填补我们 app 的表盘
我喜欢模块化紧凑表盘的经典模块外观 所以我会选择它 我的 Watch app 有一个奇妙的 矩形复杂图形 在此表盘的底部看起来很棒
所以我选择咖啡追踪器复杂功能 这看起来很棒 但是我想把这个表盘 变成我自己的 所以我要为它选择一种颜色 让这个表盘更像咖啡
核桃看起来就像一杯咖啡 现在我要选择一个好的中间级的复杂功能
我认为这种呼吸复杂功能 会帮助那些对咖啡因上瘾的人平静一点
看起来很棒 我现在对我们的咖啡追踪表盘很满意 我准备共享它 在我们共享它之前 请记住 你的 app 需要已经发布到 App Store 然后你才能在你的 app 中共享这个表盘 把它解决了 我已经准备好 共享我的表盘了 我只需要轻点右上角的“共享”按钮
在共享视图中 你可以看到“选项”按钮 在这里你可以排除任何复杂功能 或来自共享表盘的数据 我的复杂功能配置是 当使用用户信息代码字典轻击时 总是记录一杯意式浓缩咖啡 Jared 在之前有提到 但我不想让它成为我的客户的默认值 我与他们分享这个表盘时 所以我将选择“不包含数据” 作为我的复杂功能
其他一切看起来不错 所以我将其保留 当你通过电子邮件分享一个表盘 你会得到一个表盘文件 以及一个表盘的预览图像 预览图以后会很有帮助 我已经通过电子邮件将表盘发给自己 并提取内容 到我的下载文件中 让我们来看一下 在我的 Mac 上 我已经打开了“下载”文件夹 你可以看到我有表盘文件 以及来自电子邮件的相关的预览 我要添加这个表盘到我的 Xcode 项目
在 app 中共享表盘的另一个重要方面是 显示表盘的预览 在文件夹中 你可以看到其中有一个预览图像 我将在创建用户界面时使用这个预览图像 我将把这个图像拖动到 Xcode 资产文件夹中 现在我们有了图像 我们终于准备好进行编码了 我将从打开 DeviceModel 类开始
我创建这个类是为了检测手表 是否与手机配对 我将在我的视图中使用它 来仅向拥有手表的用户 显示我的表盘 我还导入了 WatchConnectivity 框架 它允许我在这个类中 实现 WCSessionDelegate 协议 通过实现这个协议 我可以使用 WCSession 来确定客户 是否有配对的手表 我将在这个类中创建 一个 isPaired 计算变量 使用 WCSession 来指示手表是否配对
现在我有了 isPaired 变量 让我们转到 DrinkListView
在此饮料清单的底部 我想要一个导航链接到一个视图 有人可以添加表盘 然而 我只想把这个导航链接 显示给一个 有配对 Apple Watch 的人 所以我将使用我的 DeviceModel 类 创建一个常数 等于 DeviceModel 的 isPaired 变量 现在我将使用我新创建的常量 来确定这个视图是否应该显示一个 到“创建表盘”视图的导航链接 我现在要把账单和用户界面加进去
这是我们新创建的导航链接 但现在 AddFaceView 里面没有任何内容 所以让我们来看一下 AddFaceView
在 AddFaceView 中 我需要显示表盘的预览 和用于添加表盘的按钮 我将为此添加用户界面
这显示了我导入的表盘的预览 并创建了一个添加表盘的按钮 当按钮执行它的动作块时 它还显示一个活动指示器
我使用来自 Apple Design Resources 网站的一个资源创建了这个按钮 现在 这个按钮没有任何功能 所以我将通过使用新的 addWatchFace 功能来修复它 首先 我将导入 ClockKit
现在我将创建一个用于 调用 addWatchFace 的包装器函数
让我们看看这个代码 看看如何使用新的 addFace 函数
首先 我创建了一个 URL 指向我的 app bundle 中的表盘文件
接下来 我使用新的 addFace 函数 我通过创建一个实例来使用它 CLKWatchFaceLibrary 的功能 然后我调用 addWatchFace 函数 使用我展开的 watchFaceURL
在完成块中 我们需要考虑添加表盘时 可能发生的任何错误 现在 我只把错误打印出来 现在让我们在按钮的动作块中 调用这个方法
在这里 你可以看到我使用 刚刚创建并导入到项目中的表盘 来调用 addFace 现在 让我们看看 Add Watch Face API 在实际操作中运行此 app
我将打开饮料视图
在这里我们可以看到 我的导航链接按钮位于底部 我将轻点它来打开“添加表盘”视图 这里我们可以看到“添加表盘”视图 预览我们的表盘 这个表盘看起来很有帮助 因此我将轻点“添加表盘”按钮
现在我们进入了 Watch app 我将点击“添加到我的表盘”
现在 表盘被加到了我的手表上 这是很棒的 我认为顾客会发现这个表盘非常有用
然而 这种模块化紧凑型表盘 是不兼容的系列 3 手表 为了支持较旧的设备 我们可以提供一个备用表盘 以防客户使用较旧的设备 让我们回到 Xcode 看看我们如何做到这一点
现在 addWatchFaceWrapper 无法处理可能遇到的错误 让我们通过在第一个表盘不兼容时 尝试添加一个后备表盘来更改它
现在 让我们用一个系列 3 兼容的后备表盘 调用我的 addWatchFaceWrapper 函数
我使用模块化的表盘作为我的后备 我是根据 Human Interface Guidelines 中列出的 一个与系列 3 手表兼容的表盘列表 选择了这个表盘 我已经把这个文件放到了 我的 Xcode 项目中 所以现在任何拥有 Apple Watch 的人 都可以使用我们的 app 的表盘 在继续之前 让我们回顾一下 该演示中的一些最佳做法 首先 当你共享表盘时 记住用户数据 是可以包含在内的 这对于指定在复杂功能中 显示什么内容很有价值 但要注意不要无意中包含私有数据
同样重要的是 要确保你的复杂功能 包括样本数据 这样表盘预览就不会是空白的
如果你使用 WatchConnectivity API 来检测客户是否有配对的手表 然后通过 iOS app 提供表盘 这也很有帮助 同时请记住 获得表盘预览图像的最佳方式 是通过电子邮件发送 请记住 如果你的表盘 与系列 3 手表不兼容 你也应该为这些客户提供表盘 最重要的是 不要忘记 你的 app 必须在发布后 才能包含在共享的表盘中 这是因为 App Store Connect ID 需要包含在 表盘文件中 现在j将话题交回给 Jared 谢谢 Joe 表盘也可以在网站上共享 当客户在 iOS 中下载表盘时 Safari 浏览器会提示客户 将表盘添加到他们的 Apple Watch 中 Safari 浏览器最有可能将你的文件 识别为表盘 如果你使用这里显示的 表盘 MIME 类型文件
这里我们看一个 在网络站点上共享的表盘的示例 表盘预览应该显示在官方 “添加 Apple watch 表盘”按钮的上方 预览图像可以通过电子邮件 在 iOS 手表 app 中分享一个表盘 就像我们刚才看到的 Joe 所做的那样 此按钮可以在 Apple Design Resources Web 网站上找到 还有一个可以在 watchOS 上 使用的精简版本 如果你喜欢在照相硬件中显示你的预览 如这里所示 也可以在设计资源中 找到这些图像
如果共享表盘与 Apple Watch 系列 3 不兼容 那么提供一个备用表盘就很重要 当你共享两个表盘时 网页上应该包括单独的预览和按钮 更多细节 包括表盘兼容性 可以在 watchOS Human Interface Guidelines 中找到 QR 码和 NFC 标签提供了更多 共享表盘的机会 只需嵌入一个包含表盘文件的网页链接 就可以轻松地将你的复杂功能和 app 安装到客户的 Apple watch 上 (下一步) 我们希望你能配置你自己的表盘 并在你的 app 内 或你网站上的托管表盘中 采用表盘共享 API 这是一个很好的方式 让你的 app 和复杂功能 作用在客户的 Apple Watch 上 谢谢你的参与
-
-
7:20 - Detect Paired Watch
var isPaired: Bool { if (WCSession.isSupported()) { let session = WCSession.default session.delegate = self session.activate() return session.isPaired } else { return false } }
-
9:01 - Add Face Wrapper
private func addFaceWrapper(withName: String) { if let watchfaceURL = Bundle.main.url(forResource: withName, withExtension: "watchface") { CLKWatchFaceLibrary().addWatchFace(at: watchfaceURL, completionHandler: { (error: Error?) in if let nsError = error as NSError?, nsError.code == CLKWatchFaceLibrary.ErrorCode.faceNotAvailable.rawValue { print(nsError) } isLoading = false }) } }
-
11:04 - Add Face Wrapper with Fallback Face
private func addFaceWrapper(withName: String, fallbackName: String?) { if let watchfaceURL = Bundle.main.url(forResource: withName, withExtension: "watchface") { CLKWatchFaceLibrary().addWatchFace(at: watchfaceURL, completionHandler: { (error: Error?) in if let nsError = error as NSError?, nsError.code == CLKWatchFaceLibrary.ErrorCode.faceNotAvailable.rawValue { if let name = fallbackName { // We failed, trying with fallbackName. addFaceWrapper(withName: name, fallbackName: nil) } } isLoading = false }) } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。