Referencias
La clase BhapticsKit proporciona funciones para controlar dispositivos hápticos de bHaptics desde Swift. Le permite conectar dispositivos hápticos, reproducir patrones hápticos, controlar directamente los motores del dispositivo y gestionar la reproducción háptica.
import BhapticsPlugin
let kit = BhapticsKit()
Las funciones que reproducen háptica devuelven un ID de solicitud. Puede usarlo para comprobar o detener la reproducción.
Ciclo de vida
init
init()
init(delegate: BhapticsKitDelegate?)
Crea la instancia del SDK. Cree una sola instancia y consérvela durante todo el ciclo de vida de su aplicación.
En iOS y visionOS, al crear la instancia se inicia Bluetooth y el sistema solicita al usuario el permiso de Bluetooth.
Parámetros
delegate(opcional): recibe los cambios de estado de Bluetooth y de los dispositivos. Consulte BhapticsKitDelegate.
initialize
func initialize(appId: String, apiKey: String, defaultSetting: String) async -> Bool
func initialize(appId: String, apiKey: String, defaultSetting: String)
Inicializa el entorno háptico. Esta función debe llamarse antes de usar las funciones relacionadas con eventos.
- En iOS y visionOS, descarga desde el servidor los eventos hápticos de su aplicación háptica.
- En macOS, se conecta a bHaptics Player. Si bHaptics Player está instalado pero no en ejecución, inicia bHaptics Player.
La versión no async ejecuta la misma inicialización en segundo plano y no devuelve el resultado.
Parámetros
appId: ID de la aplicación creado en bHaptics Developer Portal.apiKey: API Key creada en bHaptics Developer Portal.defaultSetting: pase una cadena vacía ("").
Valor de retorno
Estado de éxito de la inicialización.
Ejemplo
let result = await kit.initialize(appId: "your_app_id", apiKey: "your_api_key", defaultSetting: "")
print("Initialization result: \(result)")
delegate
var delegate: BhapticsKitDelegate?
Recibe los cambios de estado de Bluetooth y de los dispositivos. Consulte BhapticsKitDelegate.
Reproducción de háptica basada en eventos
Reproduce patrones hápticos vinculados a eventos específicos (diseñados en bHaptics Designer/Portal). Estas son las funciones recomendadas para la mayoría de las aplicaciones.
play
func play(eventId: String) -> Int
Reproduce el evento háptico predefinido.
Parámetros
eventId: nombre del evento háptico.
Valor de retorno
ID de solicitud. Puede usarlo para detener la reproducción.
Ejemplo
let requestId = kit.play(eventId: "heartbeat")
print("Playback request ID: \(requestId)")
playParam
func playParam(
eventId: String,
requestId: Int? = nil,
intensity: Float,
duration: Float,
angleX: Float,
offsetY: Float
) -> Int
Reproduce el evento háptico ajustando la intensidad, la Duration y la dirección de la háptica.
Parámetros
eventId: nombre del evento háptico.requestId(opcional): ID de solicitud que se usará para esta reproducción. Si se omite, se asigna un ID aleatorio.intensity: multiplicador de la Intensity háptica. Rango válido: [0.0-2.0] (Predeterminado:1.0)duration: multiplicador de la Duration. (Predeterminado:1.0)angleX: rota la háptica en sentido antihorario. Rango válido: [0.0-360.0] (Predeterminado:0.0)offsetY: mueve la háptica hacia arriba o hacia abajo. Rango válido: [-0.5-0.5] (Predeterminado:0.0)
Valor de retorno
ID de solicitud. Puede usarlo para detener la reproducción.
Ejemplo
let requestId = kit.playParam(eventId: "pistol_r", intensity: 1.0, duration: 1.0, angleX: 0.0, offsetY: 0.0)
playLoop
func playLoop(
eventId: String,
intensity: Float,
duration: Float,
angleX: Float,
offsetY: Float,
interval: Int,
maxCount: Int
) -> Int
Reproduce eventos hápticos en bucle.
Parámetros
eventId: nombre del evento háptico.intensity: multiplicador de la Intensity háptica. Rango válido: [0.0-2.0] (Predeterminado:1.0)duration: multiplicador de la Duration. (Predeterminado:1.0)angleX: rota la háptica en sentido antihorario. Rango válido: [0.0-360.0] (Predeterminado:0.0)offsetY: mueve la háptica hacia arriba o hacia abajo. Rango válido: [-0.5-0.5] (Predeterminado:0.0)interval: intervalo de tiempo entre bucles, en milisegundos.maxCount: número de bucles.
Valor de retorno
ID de solicitud. Puede usarlo para detener la reproducción.
Ejemplo
let requestId = kit.playLoop(eventId: "heartbeat", intensity: 0.8, duration: 1.0, angleX: 90, offsetY: 0, interval: 150, maxCount: 5)
playWithStartTime
func playWithStartTime(
eventId: String,
startMillis: Int,
intensity: Float,
duration: Float,
angleX: Float,
offsetY: Float
) -> Int
Reproduce el evento háptico desde un momento específico. Úselo para sincronizar la háptica con contenido multimedia que ya se está reproduciendo.
Parámetros
eventId: nombre del evento háptico.startMillis: tiempo de inicio de la reproducción, medido en milisegundos desde el comienzo del evento.intensity: multiplicador de la Intensity háptica. Rango válido: [0.0-2.0] (Predeterminado:1.0)duration: multiplicador de la Duration. (Predeterminado:1.0)angleX: rota la háptica en sentido antihorario. Rango válido: [0.0-360.0] (Predeterminado:0.0)offsetY: mueve la háptica hacia arriba o hacia abajo. Rango válido: [-0.5-0.5] (Predeterminado:0.0)
Valor de retorno
ID de solicitud. Puede usarlo para detener la reproducción.
Ejemplo
// Start from 1.5 seconds into the event.
let requestId = kit.playWithStartTime(eventId: "music_video", startMillis: 1500, intensity: 1.0, duration: 1.0, angleX: 0, offsetY: 0)
playWithoutResult
func playWithoutResult(eventId: String, intensity: Float, duration: Float, angleX: Float, offsetY: Float)
Reproduce eventos hápticos sin devolver un ID de solicitud (fire-and-forget).
Parámetros
eventId: nombre del evento háptico.intensity: multiplicador de la Intensity háptica. Rango válido: [0.0-2.0] (Predeterminado:1.0)duration: multiplicador de la Duration. (Predeterminado:1.0)angleX: rota la háptica en sentido antihorario. Rango válido: [0.0-360.0] (Predeterminado:0.0)offsetY: mueve la háptica hacia arriba o hacia abajo. Rango válido: [-0.5-0.5] (Predeterminado:0.0)
Ejemplo
kit.playWithoutResult(eventId: "heartbeat", intensity: 0.8, duration: 1.0, angleX: 90, offsetY: 0.25)
Reproducción directa de háptica
Si desea reproducir háptica sin eventos, use estas funciones.
position es un valor Int compartido con los demás SDK de bHaptics. Use BhapticsPosition.index para obtenerlo. Consulte BhapticsPosition.
playDot
@discardableResult
func playDot(position: Int, durationMillis: Int, arr: [Int]) -> Int
Reproduce retroalimentación háptica en el actuador háptico específico.
Parámetros
position: tipo de dispositivo háptico a reproducir. Para obtener más información, consulte aquí.Valor Dispositivo Número de motores 0TactSuit Pro 32 1TactSleeve(Left) 3 2TactSleeve(Right) 3 3TactVisor 4 4Tactosy for Hands(Left) 3 5Tactosy for Hands(Right) 3 6Tactosy for Feet(Left) 3 7Tactosy for Feet(Right) 3 8TactGlove(Left) 8 9TactGlove(Right) 8 durationMillis: la Duration de la háptica, medida en milisegundos. Se recomienda un valor mayor o igual a100.arr: asigne la longitud del array según el número de motores del dispositivo. Los valores del array representan la Intensity de los motores. El rango válido para cada valor del array es: [0-100]
Valor de retorno
ID de solicitud. Puede usarlo para detener la reproducción.
Ejemplo
// Sequentially activate 32 motors
let motorsCount = 32
for i in 0..<motorsCount {
var motors = [Int](repeating: 0, count: motorsCount)
motors[i] = 50
kit.playDot(position: BhapticsPosition.Vest.index, durationMillis: 500, arr: motors)
try await Task.sleep(nanoseconds: 500_000_000)
}
playPath
@discardableResult
func playPath(position: Int, durationMillis: Int, x: [Float], y: [Float], intensity: [Int]) -> Int
Reproduce háptica alrededor de coordenadas específicas. A diferencia de la función playDot, que especifica la Intensity háptica para cada actuador háptico de forma individual, este método especifica la Intensity háptica para coordenadas concretas.
Al especificar la posición de la háptica, playDot ofrece un control discreto, mientras que playPath es más continuo. playDot asigna la Intensity a actuadores individuales, mientras que playPath permite especificar la Intensity para coordenadas concretas (entre 0 y 1 tanto para el eje X como para el Y), haciendo que los actuadores cercanos vibren en consecuencia.
Puede colocar varias coordenadas con varias intensidades. Tenga en cuenta que todos los actuadores alrededor de estas coordenadas del array se activarán simultáneamente (al mismo tiempo), no de forma secuencial. Además, el tamaño de todos los arrays debe ser el mismo.
Al llamar continuamente a esta función mientras cambia los valores gradualmente, puede lograr el efecto de un punto háptico en movimiento.

Parámetros
position: tipo de dispositivo háptico a reproducir. Consulte la tabla enplayDot.durationMillis: la Duration de la háptica, medida en milisegundos. Se recomienda un valor mayor o igual a100.x: array de coordenadas X para el efecto háptico. Cada valor debe estar en el rango: [0.0-1.0]y: array de coordenadas Y para el efecto háptico. Cada valor debe estar en el rango: [0.0-1.0]intensity: array de valores de Intensity para cada coordenada. La longitud debe coincidir con el número de coordenadas. Cada valor debe estar en el rango: [0-100]
Valor de retorno
ID de solicitud. Puede usarlo para detener la reproducción.
Ejemplo
// Path of point #1
let x1: [Float] = [0.738, 0.723, 0.709, 0.696, 0.682, 0.667, 0.653]
let y1: [Float] = [0.680, 0.715, 0.749, 0.782, 0.816, 0.852, 0.885]
// Path of point #2
let x2: [Float] = [0.061, 0.072, 0.102, 0.184, 0.254, 0.310, 0.363]
let y2: [Float] = [0.632, 0.587, 0.542, 0.498, 0.411, 0.366, 0.301]
for i in 0..<x1.count {
// Point #1 and #2 will vibrate at the same time.
kit.playPath(position: BhapticsPosition.Vest.index, durationMillis: 250, x: [x1[i], x2[i]], y: [y1[i], y2[i]], intensity: [20, 60])
try await Task.sleep(nanoseconds: 250_000_000)
}
playGlove
@discardableResult
func playGlove(position: Int, points: [GlovePoint], frequency: Int, repeatCount: Int) -> Int
Solo TactGlove. Reproduce háptica en TactGlove. A diferencia del uso de playDot, puede ajustar con precisión la Duration de la háptica y los cambios de Intensity de la vibración. Esto permite una expresión aún más detallada de la retroalimentación háptica.
Pase un GlovePoint por cada motor que desee accionar. Se requiere al menos un punto para que funcione.
struct GlovePoint {
var index: Int
var intensity: Int
var shape: Int
var playTime: Int
init(index: Int, intensity: Int, shape: Int = 0, playTime: Int = 0)
}
Parámetros
-
position: tipo de dispositivo háptico a reproducir. Use solo8o9.Valor Dispositivo 8TactGlove(Left) 9TactGlove(Right) -
points: array deGlovePoint.-
index: índice del motor.Índice El motor está ubicado en… 0Punta del pulgar 1Punta del dedo índice 2Punta del dedo medio 3Punta del dedo anular 4Punta del dedo meñique 5En la muñeca 6En la palma (lado del pulgar) 7En la palma (lado del dedo meñique) -
intensity: Intensity del motor. Rango válido: [0-100] -
playTime: intervalo de tiempo de accionamiento.Valor Playtimes 15ms 210ms 420ms 630ms 840ms -
shape: forma del cambio de Intensity háptica a lo largo del tiempo.Valor Forma de onda 0Intensity constante durante la Duration 1Comienza con la Intensity especificada y disminuye a la mitad 2Comienza con la mitad de la Intensity especificada y aumenta hasta la especificada.
-
-
frequency: frecuencia de vibración del motor de la muñeca, en Hz. Solo se aplica a TactGlove DK3. Pase0para usar el valor predeterminado (80). -
repeatCount: número de repeticiones.
Valor de retorno
ID de solicitud. Puede usarlo para detener la reproducción.
Ejemplo
let points = (0..<8).map { GlovePoint(index: $0, intensity: 100, shape: 2, playTime: 8) }
// Left hand
kit.playGlove(position: BhapticsPosition.GloveL.index, points: points, frequency: 0, repeatCount: 1)
// Right hand
kit.playGlove(position: BhapticsPosition.GloveR.index, points: points, frequency: 0, repeatCount: 1)
Control de la reproducción
stopByRequestId
func stopByRequestId(_ requestId: Int)
Detiene la reproducción háptica por ID de solicitud.
Parámetros
requestId: ID de solicitud devuelto por la función de reproducción háptica.
Ejemplo
let requestId = kit.play(eventId: "shoot")
try await Task.sleep(nanoseconds: 2_000_000_000)
kit.stopByRequestId(requestId)
stopByEventId
func stopByEventId(_ eventId: String)
Detiene toda la reproducción háptica de un nombre de evento específico.
Parámetros
eventId: nombre del evento háptico que desea detener.
stopAll
func stopAll()
Detiene toda la háptica que se está reproduciendo actualmente.
pause
func pause(_ eventId: String)
Pausa la reproducción de un evento específico.
Parámetros
eventId: nombre del evento háptico que desea pausar.
resume
func resume(_ eventId: String)
Reanuda la reproducción pausada de un evento específico.
Parámetros
eventId: nombre del evento háptico que desea reanudar.
turnOffMotors
func turnOffMotors()
Apaga inmediatamente los motores de todos los dispositivos conectados.
Comprobación de estado
isPlaying
func isPlaying() -> Bool
Comprueba el estado general de la reproducción háptica. Funciona tanto en la reproducción basada en eventos como en la reproducción directa.
isPlayingByRequestId
func isPlayingByRequestId(_ requestId: Int) -> Bool
Comprueba el estado de reproducción de un ID de solicitud específico. Funciona tanto en la reproducción basada en eventos como en la reproducción directa.
isPlayingByEventId
func isPlayingByEventId(_ eventId: String) -> Bool
Comprueba el estado de reproducción de un evento específico.
getEventList
func getEventList() -> [String]
Devuelve los nombres de los eventos hápticos de su aplicación háptica. La lista está disponible después de que initialize finalice.
Gestión de dispositivos
En iOS y visionOS, el SDK escanea y conecta los dispositivos hápticos mediante Bluetooth LE. En macOS, los dispositivos los gestiona bHaptics Player: las funciones de escaneo y emparejamiento no tienen efecto, mientras que getDevices y ping funcionan con los dispositivos conectados a bHaptics Player.
scan
func scan()
Inicia el escaneo de dispositivos bHaptics cercanos. Los dispositivos encontrados se entregan a deviceStateUpdated. Los dispositivos emparejados se vuelven a conectar automáticamente cuando se encuentran.
El escaneo solo se inicia cuando Bluetooth está listo. Llame a esta función después de que bleStateChange informe true.
stopScan
func stopScan()
Detiene el escaneo. Los dispositivos que no están emparejados ni conectados se eliminan de la lista de dispositivos.
isScanning
func isScanning() -> Bool
Comprueba si el SDK está escaneando.
toggleScanning
func toggleScanning() -> Bool
Detiene el escaneo si el SDK está escaneando y, en caso contrario, lo inicia.
Valor de retorno
Si el SDK está escaneando después de la llamada.
pair
func pair(device: BhapticsDevice)
Empareja y conecta el dispositivo. El SDK recuerda los dispositivos emparejados entre inicios de la aplicación.
Parámetros
device: dispositivo que se va a emparejar. Obténgalo degetDevicesodeviceStateUpdated.
unpair
func unpair(device: BhapticsDevice)
Desempareja y desconecta el dispositivo.
Parámetros
device: dispositivo que se va a desemparejar.
getDevices
func getDevices() -> [BhapticsDevice]
Devuelve los dispositivos encontrados y emparejados. Consulte BhapticsDevice.
ping
@discardableResult
func ping(device: String) -> Bool
Envía un ping a un dispositivo específico. El dispositivo vibra brevemente para que el usuario pueda identificarlo.
Parámetros
device: eluuiddel BhapticsDevice.
Valor de retorno
Si se envió el ping.
Ejemplo
if let device = kit.getDevices().first {
kit.ping(device: device.uuid)
}
pingAll
@discardableResult
func pingAll() -> Bool
Envía un ping a todos los dispositivos conectados.
Valor de retorno
Si se envió el ping.
getBluetoothState
func getBluetoothState() -> Int
Devuelve el estado de Bluetooth. Úselo para saber por qué no se encuentran dispositivos.
| Valor | Estado |
|---|---|
0 | Desconocido |
1 | Restableciendo |
2 | No compatible |
3 | No autorizado (se denegó el permiso de Bluetooth) |
4 | Apagado |
5 | Encendido |
Solo macOS
isPlayerConnected
func isPlayerConnected() -> Bool
Comprueba el estado de conexión con bHaptics Player. Siempre devuelve false en iOS y visionOS.
onPlayerConnectionChanged
var onPlayerConnectionChanged: ((Bool) -> Void)?
Se llama en el hilo principal cuando cambia el estado de conexión con bHaptics Player. Disponible solo en macOS.
Ejemplo
#if os(macOS)
kit.onPlayerConnectionChanged = { connected in
print("bHaptics Player connected: \(connected)")
}
#endif
Tipos
BhapticsKitDelegate
protocol BhapticsKitDelegate {
func bHapticsKit(_ kit: BhapticsKit, bleStateChange state: Bool)
func bHapticsKit(_ kit: BhapticsKit, deviceStateUpdated devices: [BhapticsDevice])
func bHapticsKit(_ kit: BhapticsKit, didConnect device: BhapticsDevice)
func bHapticsKit(_ kit: BhapticsKit, didDisconnect device: BhapticsDevice)
}
Recibe los cambios de estado de Bluetooth y de los dispositivos en iOS y visionOS.
bleStateChange: Bluetooth pasó a estar listo (true) o no disponible (false).deviceStateUpdated: la lista de dispositivos cambió. Se llama cuando un dispositivo se encuentra, se empareja, se desempareja, se conecta o se desconecta.didConnect: se conectó un dispositivo.didDisconnect: se desconectó un dispositivo que no está emparejado.
BhapticsDevice
Dispositivo háptico encontrado por el SDK.
| Propiedad | Tipo | Descripción |
|---|---|---|
name | String | Nombre del dispositivo. |
uuid | String | Identificador único del dispositivo. También disponible como id. |
position | PositionType | Parte del cuerpo en la que se coloca el dispositivo. |
battery | Int | Nivel de batería en porcentaje. -1 si se desconoce. |
connected | Bool | Si el dispositivo está conectado. |
paired | Bool | Si el dispositivo está emparejado. |
BhapticsPosition
Tipo de dispositivo háptico. Use index para pasarlo a funciones como playDot, playPath y playGlove.
| Caso | index | Dispositivo |
|---|---|---|
.Vest | 0 | TactSuit |
.ForearmL | 1 | TactSleeve(Left) |
.ForearmR | 2 | TactSleeve(Right) |
.Head | 3 | TactVisor |
.HandL | 4 | Tactosy for Hands(Left) |
.HandR | 5 | Tactosy for Hands(Right) |
.FootL | 6 | Tactosy for Feet(Left) |
.FootR | 7 | Tactosy for Feet(Right) |
.GloveL | 8 | TactGlove(Left) |
.GloveR | 9 | TactGlove(Right) |
let position = BhapticsPosition.GloveL.index // 8