You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SiriKit实现BLE数据读取:蓝牙提示与会话保持技术问询

嘿,关于Siri集成BLE数据读取的这几个问题,我刚好踩过坑,给你详细说说:

一、不中断Siri会话提示开启蓝牙的正确姿势

绝对不能自己跳转到设置!那样百分百会中断Siri会话,得靠SiriKit自带的机制在会话内完成蓝牙开启提示。

核心思路是:在你的Intent处理类里,检测到蓝牙未开启/未授权时,返回特定的响应码,让系统在Siri界面内弹出原生提示,用户可以直接在会话内操作开启蓝牙,全程不离开Siri。

举个Swift代码示例(假设你的Intent叫ReadBLEDataIntent):

import Intents
import CoreBluetooth

class ReadBLEDataIntentHandler: NSObject, ReadBLEDataIntentHandling {
    func handle(intent: ReadBLEDataIntent, completion: @escaping (ReadBLEDataIntentResponse) -> Void) {
        let cbManager = CBManager()
        
        // 先检查蓝牙权限
        let authStatus = CBManager.authorizationStatus()
        guard authStatus == .allowedAlways || authStatus == .allowedWhenInUse else {
            let response = ReadBLEDataIntentResponse(code: .failureRequiringAppLaunch, userActivity: nil)
            response.reason = "需要先授予蓝牙权限才能读取设备数据"
            completion(response)
            return
        }
        
        // 再检查蓝牙是否开启
        guard cbManager.isPoweredOn else {
            // 返回这个响应码,系统会自动在Siri会话内弹出开启蓝牙的提示
            let response = ReadBLEDataIntentResponse(code: .failureRequiringUserConfirmation, userActivity: nil)
            response.reason = "请开启蓝牙以继续读取数据"
            completion(response)
            return
        }
        
        // 蓝牙正常,开始读取数据
        let measurementData = fetchBLEMeasurementData() // 你的BLE数据读取逻辑
        let response = ReadBLEDataIntentResponse(code: .success, userActivity: nil)
        response.measurementResult = measurementData
        completion(response)
    }
    
    private func fetchBLEMeasurementData() -> String {
        // 这里写你的BLE扫描、连接、读取数据的逻辑,尽量优化速度
        return "心率:72次/分,血氧:98%"
    }
}

注意:一定要在Info.plist里添加蓝牙权限描述(NSBluetoothAlwaysUsageDescription或NSBluetoothWhenInUseUsageDescription),否则系统的权限提示会失效。

二、Siri会话的时长与回复次数限制

会话时长

  • 单次Intent处理的最大执行时间是30秒,但系统实际会更严格,一般超过10秒就可能被终止,所以你的BLE扫描和数据读取逻辑一定要尽量轻量化,最好控制在10秒内完成。
  • 如果是多轮交互会话(比如Siri问用户“要读取哪个设备的数据?”,用户回答后继续),整个会话的总时长大概在1-2分钟左右,但还是要尽量简洁,避免用户等待太久。

回复次数

  • 单次Intent处理只能返回一个响应,但通过多轮交互可以实现多次回复:比如返回需要用户确认的响应(.failureRequiringUserConfirmation或.confirmationRequired),Siri会继续向用户提问,用户回答后会再次触发你的Intent handler,这样就形成了多轮对话。
  • 多轮交互的次数没有严格的硬上限,但系统会根据会话的自然性进行限制,一般最多3-5轮,超过后Siri会自动结束会话,所以尽量把流程设计得简洁,减少不必要的交互。

内容的提问来源于stack exchange,提问作者Saranjith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:26:30