大多数浏览器和
Developer App 均支持流媒体播放。
-
将蓝牙设备连接到 Apple Watch
了解如何将来自蓝牙配件的数据集成到 Apple Watch app 和复杂功能中。蓝牙设备可以向 Apple Watch 提供医疗数据、运动统计数据等,并帮助人们在此过程中充分利用您的软件。我们将展示如何在后台 app 刷新期间接入这些设备,以在您的 Apple Watch 复杂功能中显示最新信息,在 watchOS 上提供 Core Bluetooth 的概览,并探索蓝牙配件设计的最佳实践。
资源
- Background execution
- Core Bluetooth
- Interacting with Bluetooth peripherals during background app refresh
相关视频
WWDC22
WWDC21
-
下载
嗨 我是杨 我想向你说明 把蓝牙装置连接到 Apple Watch的新方法 首先 我会复习 Core Bluetooth在 watchOS 7的运作方式 接着我会谈到watchOS 8 一个令人兴奋的新功能 我会讨论到 设计 Apple Watch的配件 和app最好的方式 先从Core Bluetooth 目前的运作方式开始 只能当app在前台 或后台有在活动的期间 你才能连接蓝牙装置 如果有人想要使用你的app 从配件得到信息 这样是很棒的 但是如果你希望能有一个从配件 得到信息的复杂功能呢? 目前 除非使用者开启你的app 否则复杂功能无法进行更新 现在的watchOS 8 你可以在后台应用刷新期间 连接蓝牙配件 这就让你可以使用配件的信息 更新复杂功能 或在低电量时传送本地通知 拿我的温度感测计为例 现在我可以在复杂功能中更新温度 这样随时看一眼手表 就能看见温度 我们虽然是用 温度感测计为例子 但只要是任何希望 一瞥就得到信息的配件 其实都可以
要开始在后台应用刷新期间使用蓝牙 只要在Info.plist里 把bluetooth-central 加到UIBackgroundModes 这也有可能显示为 Required background modes 及App communicates using CoreBluetooth 这张表比较了不同平台的差异 这些是 目前支持的 低功耗蓝牙配置 我们现在就来看看你的配件如何 跟Apple Watch通信 假设使用者已经跟配件配对 接着开启你的Watch app 你的app试图连上配件 只要检查到蓝牙广播 就会建立低功耗蓝牙的连接 使用者一离开watchOS app 蓝牙连接就会中断 待下次watchOS app运作前 蓝牙都无法进行连接 我们来分析看看下次 watchOS 8后台应用刷新期间 会发生什么事 你的app主动连上 一个已知的周边装置 下次收到广播时 Apple Watch就会连接你的配件 一完成数据撷取 你就可以中断蓝牙连接 处理数据 后台应用刷新随时都有可能发生 所以你的配件应该尽可能频繁的广播 如果你有重要的更新要显示 在Apple Watch上
现在 假设你的配件 为了省电而很少广播 后台应用 刷新期间就有可能 不会收到任何广播 也就不会进行连接 后台应用刷新无法保证 会在特定时间发生 因此你的配件只要有重要更新 就一定要频繁广播 其中一个可能的策略 就是在配件上缓冲感测数据 接近缓冲限制时 就增加广播频率 以增加重新连接Apple Watch的机率 基本准则是 在理想的RF条件下 至少应该 每两秒钟广告一次 如果你默认装置会在 比较不理想的RF条件下运作 配件就应该更频繁广播 以增加重新连接的机率 我们现在来看看你的app如何 跟Core Bluetooth互动 以及watchOS怎么跟蓝牙配件互动 这是一个时间图流程 时间由上往下推展 先来看看 app在前台时会发生什么事 配件正在广播 你可以扫描新装置 侦测蓝牙配件 装置被找到后 你就可以进行连接 Apple Watch一收到广播 就会连接 蓝牙连接完成后 你可以要求 cancelPeripheralConnection 中断蓝牙装置连接 之后 Apple Watch的屏幕暗掉时 你的watchOS app就会暂停运作 现在 我们来看看下次 后台应用刷新会发生什么事 注意 时间并没有按比例流逝 假如你的app需要重新连接蓝牙配件 就可以主动进行连接 这里可以看到 连接成立了 前面提过 我们强烈建议连接配件 只连接你所需要的时间长度 在后台应用刷新期间 你获取需要的数据后 就应该要求中断连线 在这个例子中 数据传送完成 app取消了周边装置的连接
我们来看看另一个可能的用户流程 在这里 蓝牙配件没有在Apple Watch附近 或在后台应用刷新期间广告 在后台应用刷新期间 你应该这样处理这种情况: 首先 你连上一个周边装置 但是没有出现广告 过期处理器被呼叫后 你应该要求取消连接 这样你就可以从头来过 在下一次后台 应用刷新期间之初要求重新连接 另外 在过期处理器被呼叫前 取消连接是个很好的做法 可以省电 若下次后台应用刷新你需要重新连接 你可以再发一次connectPeripheral Apple Watch一看到广告 就会连上你的配件 这时 你可以获取、下载 所有你需要的数据 接着 连接 要做的事完成了 你就可以中断连线 我们来看看最后一个流程 也就是在后台应用 刷新期间没有中断连线会发生什么事 主动连线 Apple Watch一看到广播 就会建立连接 现在 假设你的app在后台应用刷新 过期之前没有时间获取所有数据 这样的情况下 Core Bluetooth会在 下次后台应用刷新尾声自动中断连线
到了下次后台应用刷新 你的app会得到 didDisconnectPeripheral这个事件 此时 如果你的app需要 就可以主动建立蓝牙连接 或者也可等到下次后台应用刷新 我们强烈建议连接配件 只连接它所需要的时间长度 你的app应该在后台应用刷新期间 要求中断连线
我们仔细来看看执行这件事的程序代码 当有人在前台开启你的app 它会发现周边装置 并加以连接 广播被侦测到时 就会呼叫didDiscoverPeripheral代理 假如你用过 CoreBluetooth 应该很熟
现在来看看在后台应用 刷新期间会发生什么事
handleBackgroundTasks 代理方法被呼叫 你可以开始任何后台作业 在这个例子中 我们想要连接蓝牙周边装置 在后台应用刷新期间 即将中断前 你会得到通知 告知后台应用刷新即将结束 这是watchOS 8新的API 你可以用这个取消任何现有的工作 准备让app进入暂停模式 接着 把任务设定为完成 此外 在后台运作时 你必须决定蓝牙装置 中断连线后会有什么行为 记住 didDisconnectPeripheral这个回调 可能发生在前台 或后台应用刷新期间 而且所有平台都会发生 在这里 有了 didDisconnectPeripheral 我们呼叫存在于WatchKit Extension 委派里的函数 didCompleteDisconnection 这样一来 此函数的行为就只针对watchOS 函数didCompleteDisconnection做的 就是证实我们是否在后台刷新期间 如果是 就表示任务完成 这会中止后台应用刷新
我们来谈在Apple Watch 运用Core Bluetooth最好的做法 第一次设定装置时 你的app务必在前台运作 也就是使用者必须 正在使用你的Watch app 这时候 扫描新的周边装置 你的app一旦找到周边装置 就可以设定初始的蓝牙连接 若有需要 也可以跟装置配对 你的app一旦退出前台 就不能扫描新的周边装置 反之 它应该要求连接 先前找到的周边装置 连接后 获取所需的数据 数据获取完成后 你的app应中断与周边装置的连接 以节省电力 如果你的app没有在 后台应用刷新结束前中断连线 Core Bluetooth会自动 中断与配件的连接 你只能在app可以运作时重新连接 如果你对Core Bluetooth 有任何疑问 我鼓励你参加本周的实验室 谢谢 [音乐]
-
-
7:35 - didDiscoverPeripheral
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber ) { // Add to an array of discovered peripherals, // then connect to the peripheral. central.connect(peripheral, options: nil) }
-
7:55 - handleBackgroundTasks
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) { for task in backgroundTasks { if let refreshTask = task as? WKApplicationRefreshBackgroundTask { // Insert your code to start background work here. central.connect(peripheral, options: nil) refreshTask.expirationHandler = { // Insert your code to cancel existing work here. if let peripheral = self.bluetoothReceiver.connectedPeripheral { self.central.cancelPeripheralConnection(peripheral) } refreshTask.setTaskCompletedWithSnapshot(false) } } } }
-
8:51 - didDisconnectPeripheral
// If the app gets woken up to handle a background refresh task, this method will be called // if a peripheral was disconnected when the app had previously transitioned to the // background. func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { connectedPeripheral = nil delegate?.didCompleteDisconnection(from: peripheral) }
-
9:08 - didCompleteDisconnection
// In your WatchKit Extension delegate: func didCompleteDisconnection(from peripheral: CBPeripheral) { if let refreshTask = currentRefreshTask { task.setTaskCompletedWithSnapshot(false) currentRefreshTask = nil } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。