Loading...
Loading...
Compare original and translation side by side
Beta-sensitive. AudioAccessoryKit is new in iOS 26.4 and may change before GM. Re-check current Apple documentation before relying on specific API details.
AccessoryControlDevice测试版敏感提示 AudioAccessoryKit是iOS 26.4新增框架,在GM版发布前可能发生变更。在依赖特定API细节前,请重新查阅苹果官方当前文档。
AccessoryControlDeviceASAccessoryimport AccessorySetupKit
import AudioAccessoryKitASAccessoryimport AccessorySetupKit
import AudioAccessoryKit| Platform | Minimum Version |
|---|---|
| iOS | 26.4+ |
| iPadOS | 26.4+ |
| 平台 | 最低版本 |
|---|---|
| iOS | 26.4+ |
| iPadOS | 26.4+ |
AccessoryControlDevicelet accessory: ASAccessory // Obtained from AccessorySetupKit pairing
let capabilities: AccessoryControlDevice.Capabilities = [.audioSwitching, .placement]
try await AccessoryControlDevice.register(accessory, capabilities)AccessoryControlDevicelet accessory: ASAccessory // 从AccessorySetupKit配对流程中获取
let capabilities: AccessoryControlDevice.Capabilities = [.audioSwitching, .placement]
try await AccessoryControlDevice.register(accessory, capabilities)current(for:)let device = try AccessoryControlDevice.current(for: accessory)
let currentConfig = device.configurationAccessoryControlDeviceASAccessoryaccessoryconfigurationcurrent(for:)let device = try AccessoryControlDevice.current(for: accessory)
let currentConfig = device.configurationASAccessoryAccessoryControlDeviceaccessoryconfigurationupdate(_:)let device = try AccessoryControlDevice.current(for: accessory)
var config = device.configuration
config.devicePlacement = .onHead
try await device.update(config)AccessoryControlDevice.Errorupdate(_:)let device = try AccessoryControlDevice.current(for: accessory)
var config = device.configuration
config.devicePlacement = .onHead
try await device.update(config)AccessoryControlDevice.Error.audioSwitchinglet capabilities: AccessoryControlDevice.Capabilities = [.audioSwitching]
try await AccessoryControlDevice.register(accessory, capabilities)let capabilities: AccessoryControlDevice.Capabilities = [.audioSwitching, .placement]
try await AccessoryControlDevice.register(accessory, capabilities).audioSwitchinglet capabilities: AccessoryControlDevice.Capabilities = [.audioSwitching]
try await AccessoryControlDevice.register(accessory, capabilities)let capabilities: AccessoryControlDevice.Capabilities = [.audioSwitching, .placement]
try await AccessoryControlDevice.register(accessory, capabilities)AccessoryControlDevice.Capabilities| Capability | Purpose |
|---|---|
| Device supports automatic audio switching |
| Device can report its physical placement |
AccessoryControlDevice.Capabilities| 能力 | 用途 |
|---|---|
| 设备支持自动音频切换 |
| 设备可以上报自身物理佩戴位置 |
AccessoryControlDevice.Placement| Placement | Meaning |
|---|---|
| Accessory is seated in the ear (e.g., earbuds) |
| Accessory is on the head (e.g., headband headphones) |
| Accessory is over the ear (e.g., over-ear headphones) |
| Accessory is not being worn |
AccessoryControlDevice.Placement| 位置 | 含义 |
|---|---|
| 配件佩戴在耳内(例如入耳式耳机) |
| 配件佩戴在头上(例如头戴式压耳耳机) |
| 配件包裹耳朵(例如头戴式包耳耳机) |
| 配件未被佩戴 |
let device = try AccessoryControlDevice.current(for: accessory)
var config = device.configuration
config.devicePlacement = .inEar
try await device.update(config).offHead.onHead.inEar.onHead.inEar.offHeadlet device = try AccessoryControlDevice.current(for: accessory)
var config = device.configuration
config.devicePlacement = .inEar
try await device.update(config).offHead.onHead.inEar.onHead.inEar.offHeadDatalet device = try AccessoryControlDevice.current(for: accessory)
var config = device.configuration
let primaryBTAddress = Data([0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC])
config.primaryAudioSourceDeviceIdentifier = primaryBTAddress
let secondaryBTAddress = Data([0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45])
config.secondaryAudioSourceDeviceIdentifier = secondaryBTAddress
try await device.update(config)Datalet device = try AccessoryControlDevice.current(for: accessory)
var config = device.configuration
let primaryBTAddress = Data([0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC])
config.primaryAudioSourceDeviceIdentifier = primaryBTAddress
let secondaryBTAddress = Data([0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45])
config.secondaryAudioSourceDeviceIdentifier = secondaryBTAddress
try await device.update(config)AccessoryControlDevice.Configuration| Property | Type | Purpose |
|---|---|---|
| | Declared device capabilities |
| | Current physical placement |
| | Primary connected Bluetooth device address |
| | Secondary connected Bluetooth device address |
AccessoryControlDevice.Configuration| 属性 | 类型 | 用途 |
|---|---|---|
| | 声明的设备能力 |
| | 当前物理佩戴位置 |
| | 已连接主蓝牙设备地址 |
| | 已连接次蓝牙设备地址 |
let device = try AccessoryControlDevice.current(for: accessory)
let caps = device.configuration.deviceCapabilities
if caps.contains(.audioSwitching) {
// Device supports automatic audio switching
}
if caps.contains(.placement) {
// Device reports physical placement
}let device = try AccessoryControlDevice.current(for: accessory)
let caps = device.configuration.deviceCapabilities
if caps.contains(.audioSwitching) {
// 设备支持自动音频切换
}
if caps.contains(.placement) {
// 设备支持上报物理佩戴位置
}let device = try AccessoryControlDevice.current(for: accessory)
if let placement = device.configuration.devicePlacement {
switch placement {
case .inEar, .onHead, .overTheEar:
// Accessory is being worn
break
case .offHead:
// Accessory is not being worn
break
@unknown default:
break
}
}let device = try AccessoryControlDevice.current(for: accessory)
if let placement = device.configuration.devicePlacement {
switch placement {
case .inEar, .onHead, .overTheEar:
// 配件正被佩戴
break
case .offHead:
// 配件未被佩戴
break
@unknown default:
break
}
}AccessoryControlDevice.Error| Error | Cause |
|---|---|
| Accessory does not support the requested capability |
| Request parameters are invalid |
| Device registration has been invalidated |
| An unspecified error occurred |
do {
try await AccessoryControlDevice.register(accessory, capabilities)
} catch let error as AccessoryControlDevice.Error {
switch error {
case .accessoryNotCapable:
// Accessory hardware does not support requested capabilities
break
case .invalidRequest:
// Check registration parameters
break
case .invalidated:
// Re-register the device
break
case .unknown:
// Log and retry
break
@unknown default:
break
}
}AccessoryControlDevice.Error| 错误 | 原因 |
|---|---|
| 配件不支持请求的能力 |
| 请求参数无效 |
| 设备注册已失效 |
| 发生未定义错误 |
do {
try await AccessoryControlDevice.register(accessory, capabilities)
} catch let error as AccessoryControlDevice.Error {
switch error {
case .accessoryNotCapable:
// 配件硬件不支持请求的能力
break
case .invalidRequest:
// 检查注册参数
break
case .invalidated:
// 重新注册设备
break
case .unknown:
// 记录日志并重试
break
@unknown default:
break
}
}// WRONG -- accessory not yet paired
let rawAccessory = ASAccessory()
try await AccessoryControlDevice.register(rawAccessory, [.audioSwitching])
// CORRECT -- use the ASAccessory from a completed pairing session
session.activate(on: .main) { event in
if event.eventType == .accessoryAdded, let accessory = event.accessory {
Task {
try await AccessoryControlDevice.register(accessory, [.audioSwitching])
}
}
}// 错误 -- 配件尚未完成配对
let rawAccessory = ASAccessory()
try await AccessoryControlDevice.register(rawAccessory, [.audioSwitching])
// 正确 -- 使用完成配对流程返回的ASAccessory
session.activate(on: .main) { event in
if event.eventType == .accessoryAdded, let accessory = event.accessory {
Task {
try await AccessoryControlDevice.register(accessory, [.audioSwitching])
}
}
}// WRONG -- registers placement but never updates it
try await AccessoryControlDevice.register(accessory, [.audioSwitching, .placement])
// System never receives placement data, reducing switching accuracy
// CORRECT -- update placement promptly after registration
try await AccessoryControlDevice.register(accessory, [.audioSwitching, .placement])
let device = try AccessoryControlDevice.current(for: accessory)
var config = device.configuration
config.devicePlacement = .offHead
try await device.update(config)// 错误 -- 注册了佩戴位置能力但从未更新
try await AccessoryControlDevice.register(accessory, [.audioSwitching, .placement])
// 系统从未收到佩戴位置数据,会降低切换准确性
// 正确 -- 注册后及时更新佩戴位置
try await AccessoryControlDevice.register(accessory, [.audioSwitching, .placement])
let device = try AccessoryControlDevice.current(for: accessory)
var config = device.configuration
config.devicePlacement = .offHead
try await device.update(config)// WRONG -- set audio source identifiers once and never update
config.primaryAudioSourceDeviceIdentifier = someAddress
try await device.update(config)
// Device disconnects, but system still thinks it's the primary source
// CORRECT -- update identifiers when connections change
func onDeviceDisconnected() {
var config = device.configuration
config.primaryAudioSourceDeviceIdentifier = nil
Task { try await device.update(config) }
}// 错误 -- 仅设置一次音频源标识符从不更新
config.primaryAudioSourceDeviceIdentifier = someAddress
try await device.update(config)
// 设备断开连接,但系统仍然认为它是主音频源
// 正确 -- 连接状态变化时更新标识符
func onDeviceDisconnected() {
var config = device.configuration
config.primaryAudioSourceDeviceIdentifier = nil
Task { try await device.update(config) }
}// WRONG -- ignores invalidation, keeps using stale device reference
try await device.update(config) // Throws .invalidated, unhandled
// CORRECT -- catch invalidation and re-register
do {
try await device.update(config)
} catch AccessoryControlDevice.Error.invalidated {
try await AccessoryControlDevice.register(accessory, capabilities)
}// 错误 -- 忽略失效错误,继续使用过期的设备引用
try await device.update(config) // 抛出.invalidated错误,未处理
// 正确 -- 捕获失效错误并重新注册
do {
try await device.update(config)
} catch AccessoryControlDevice.Error.invalidated {
try await AccessoryControlDevice.register(accessory, capabilities)
}AccessorySetupKitAudioAccessoryKit.placementAccessoryControlDevice.Error@unknown defaultupdate(_:)try awaitAccessorySetupKitAudioAccessoryKit.placementAccessoryControlDevice.Error@unknown defaultupdate(_:)try await