大多数浏览器和
Developer App 均支持流媒体播放。
-
在 watchOS 上获取来自蓝牙设备的适时提醒
了解蓝牙设备可以如何向 Apple Watch 发送及时且相关的提醒。我们将介绍如何利用复杂功能中的周期性数据,探索后台外围设备扫描功能,并帮助您学习如何运用 watchOS 中的特征监控。我们还将分享有关打造出色蓝牙配件的最佳实践和设计指南。
资源
相关视频
WWDC21
-
下载
Yann Ly-Gagnon: 大家好 我是 Yann 我是一名核心蓝牙工程师 今天 我想和大家谈一谈 Apple Watch 上的 蓝牙设备的适时提醒
首先 我们回顾一下 当 watchOS App 在后台运行时 如何更新复杂功能
然后我们将深入研究如何收听 您的 watchOS App 发出的适时提醒
我们还会看一看有什么新的方法能 帮助我们在 watchOS 9 上 发现新的外围设备
最后 我们会提供最佳实践和建议 来帮助您设计您的蓝牙配件
让我们进入我们的第一个主题 如何在 watchOS App 的后台 更新复杂功能 去年 在 watchOS 8 中 我们介绍了一种 在后台 App 刷新期间 使用您的蓝牙配件 更新复杂功能的方法
这对数据非常有用 可以定期更新 就像在这个例子中向我展示 当前气温
我们快速回顾一下 去年的 watchOS 允许您更新您的复杂功能 并在在后台定期运行期间 使用后台 App 刷新 每当后台 App 刷新时 它都会允许您的 App 重新连接到您的蓝牙外围设备 检索数据 然后断开与外围设备的连接 有关此内容的更多详细信息 请查看视频 “Connect Bluetooth devices to Apple Watch”
但是如果用户想对 恰巧发生在您的蓝牙外围设备上的 限时事件有所了解该怎么办呢
在 watchOS 9 中 我们将介绍一种 从后台的蓝牙附件中收听警报的方法
这是它的工作原理 当您的 App 运行时 连接您的设备 开始监控一个特性
当您的 App 停止运行时 核心蓝牙会 继续保持与您的设备相连接 收听您的特性的改变
当您的设备改变了该特性的值时 您的 App 会运行起来 处理该事件 例如 您可以发布本地通知 或发送网络请求 这旨在为用户提供他们所关心的 限时事件的信息
假设我有一个食物温度计 我可以设置所需的烹饪温度 当我从烤箱拿走我的食物的时候 它就会发出警报
随着温度接近所需的温度 温度计会改变特性的值 该 App 会发出 食物快好了的本地通知
食物完成烹饪后 我就会收到所需的通知
如果温度还在不断上升 我会收到一个最后的通知
首先 让我们回顾一下如何 配置后台模式
将 Bluetooth-central 添加到您的 Watch App Info.plist 中的 UIBackgroundModes 中
在 Xcode 中 它被称为 Required background modes 您应该使用 CoreBluetooth 添加 App communicates using CoreBluetooth
如果您想以后台执行为中心 请注意 那些 Info.plist 条目与您的 iOS App 相同
您需要手动编辑 您的 watchApp info.plist 而不是依赖 iOS 的 Signing capabilities
让我们看一下代码 假设您已经连接 您找到了 GATT 服务 并且刚刚发现了一个 GATT 特性 您会得到 didDiscoverCharacteristicFor 回调
在回调内部 您可以在每次值变化时 决定接收通知
这与 watchOS 8 中的 API 相同 不同的是 当您的 App 在后台时 它也可以工作
然后用授权的方法 处理 didUpdateValueFor 特性值的变化
一旦特性发生变化 您可以在此处发布本地通知 发送网络请求 或任何对您的 App 有意义的东西 此方法将同时在前台和背景中调用 所以要确保您在两种情况下 执行正确的行动
现在让我们谈一谈 一些您需要考虑的情况
首先是蓝牙重新连接 如果您的设备超出范围 蓝牙连接将在 超时后断开
如果发生这种情况 您的 App 将短暂进入后台运行 这种情况叫做 connectPeripheral 为的是尝试重新连接 这与 iOS 上发生的情况相同 一旦设备再次进入范围内 核心蓝牙将重新连接
现在 让我们谈谈一些限制 这些限制对于 Apple Watch 用户 保持最佳电池寿命来说 十分重要
如果您的设备位于蓝牙范围的边缘 并在后台 BLE 连接中反复断开 重新连接范围将被缩小 这意味着只有在设备靠近 Apple Watch 时才会重新连接
这些限制在 24 小时的滚动窗口中有效 当用户与您的 App 互动时 就会重置
另一个限制是后台运行时 发出警报的次数
当某些对客户来说 非常重要的事情发生时 监控特性才会改变 如果您需要定期从您的设备中 获取数据 就必须进行后台 App 刷新
当您的 App 即将超过限制时 通知 LeGattNearBackgroundNotificationLimit 就会被发布 监视该错误并认识到用户 未与 watchOS App 交互 对您的 App 来说 是一个很好的做法
如果这个警报很重要 那么现在就是 寻找另一种与您的用户 相互沟通的最佳时间 比如通过网络请求 或 UI 在您的蓝牙外围设备上 作出更改
超出限制后 通知 LeGattExceededBackgroundNotificationLimit 将被发布
此时 您的 App 将不再接收后台运行 并将恢复到没有后台连接的 watchOS 8 行为 并且只有后台 App 刷新
您可以在 GATT Notification Updat 的 错误字段检索这两个通知 对于后台 BLE 连接 我们建议利用这个错误 来代替用倒计时的方法 了解何时到达限制
对于 watchOS 9 后台运行时限制设置为 5 每当用户与您的 App 交互时 这两个限制就会被重置 它们也会在达到限制的 24 小时后重置 以防没有用户与您的 App 交互 注意 这些限制仅适用于 蓝牙后台 LE 连接 如果复杂功能位于活跃的表盘上 后台的 App 将忽略这些限制 继续刷新
您得到的处理每个事件的时间非常短 时间可能不够做极其复杂的处理 但足以提醒用户 一些重要的事情正在发生 最后 收听后台的适时提醒 需要 Apple Watch Series 6 或更高版本 收取提醒并不是您可以在后台做的 唯一的事情 在 watchOS 9 中 当您的 App 在后台运行时 您可以发现外围设备
比方说 我有蓝牙医疗设备 和一个可以检测任何适时提醒的 watchOS App 为了省电 外围设备在检测到严重情况之前 不会显示
因此 这个设备和 Apple Watch 之间 没有任何联系 在这里 watchOS App 将从医疗设备 扫描唯一的 Service UUID
现在 当医疗设备检测到 情况严重时 它就开始公布 Apple Watch 发现了这个外围设备 并在后台启动 App
然后 App 就会提示用户检测的条件
这就是它的工作原理 Watch App 会启动对外围设备的扫描 核心蓝牙将继续在后台扫描
一旦外围设备被检测到 App 就会在后台运行 并发起连接
我们深入研究一下 实现这一目标的代码 API 没有从 watchOS 8 开始改变 但是这种扫描方法将得到推崇 甚至 App 在后台也是如此
使用您想关注的 UUID 服务 调用 scanForPeripherals 当您的 App 位于前台时 您可以在您的 App 中执行此操作 并且当 App 转到后台运行时 还将继续 请注意 如果您要求选择 allowDuplicatesKey 它只适用于App 在前台的时候 现在 我们来谈谈一些限制
您的 App 在 App 启动之间 获得的后台运行次数是有限制的 这种限制在 GATT 特性发生变化时 与我们之前看到的后台运行 结合在了一起 此外 在后台扫描外围设备 需要 Apple Watch Series 6 或更高版本
总之 Watch 在后台扫描的时候 我们只能扫描到有限数量的 Bluetooth service UUID
现在我们谈谈如何 充分利用这些新功能 来设计您的配件
在设置您的蓝牙遥控配件时 您需要考虑电量平衡的问题
如果电量损耗受到了影响 您应该选择拓扑 让您的设备进入深度睡眠 并且只有在收到相关信息时 才会发出提醒信号 平衡就是在每次发出适时提醒时 您的蓝牙发现时间会延长 但您能节省更多的电量
这个是在医疗设备中提供拓扑的案例
另一方面 如果您需要减少 适时提醒的延迟时间 而电量尚且充足的话 您可以考虑使用 后台 LE 连接 根据 GATT 的指示 发送您的提醒 注意 每个 App 的两个蓝牙连接 是有限制的
这是我们在示例中看到的 用于温度传感器的拓扑
为了让您的用户拥有 适时提醒的最佳体验 考虑在您的外围设备上 尽可能多的添加配置和智能 通过对时间不是很敏感的通讯系统 过滤掉对时间敏感的数据
回到我们的温度示例 您只可以发送相关的事件 或什么时候温度会产生变化的消息 而不是传送输每一个温度数据 这种方法的好处是 如果您合理地 将对时间敏感的数据 从周期性数据分离出来 您的外围设备和 Apple Watch 用户 将节省电量 从而获得整体更好的体验
当您的设备断开连接时 我们推荐发布 重新建立连接的通知 通知间隔取决于 您的外围蓝牙设备的请求 例如重新连接需要多快 电池寿命等 在附件指南中 我们提供了几个 您可以使用的不同的值 例如 如果您的设备电池受限 您可以使用一个 1022.5 毫秒的值
另一个例子 如果您以 20 毫秒的速率发送通知 它就允许在理想的条件下 在 1 秒内完成检测
您只有在关键事件发生时 才能使用这么快的通知速率
现在让我们谈谈连接间隔 如果您选择 您的设备在后台保持连接的拓 我们强烈建议使用较长的连接间隔 例如 至少 150 毫秒 这会让您的外围设备节省电量 在 Apple Watch 上 提供最佳的用户体验
蓝牙 5.3 即将根据连接等级 登陆 Apple Watch 这在蓝牙外围设备空闲时 允许增加连接间隔 并在您需要较短的延迟时 迅速转换到更小的连接间隔
这是一个显示平台之间差异的表格 这些是目前支持低功耗蓝牙的配置 去年我们把watchOS 后台 App 刷新 作为一种新的 后台执行模式进行了介绍 今年 如果您拥有 Series 6 及更高版本 我们就会如我们今天描述的那样 利用即时警报改进后台的执行
感谢收看
-
-
3:41 - Listen for alerts
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { peripheral.setNotifyValue(true, for: characteristic) } func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { if let newData = characteristic.value { // Post a local notification. } }
-
9:15 - Discover peripherals
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { central.scanForPeripherals(withServices: [myCustomUUID]) }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。