vibracion vibra muy fuerte cambiar ios vibrate iphone-vibrate

muy - ¿Hay API para vibraciones personalizadas en iOS?



mi iphone vibra muy fuerte (2)

A partir de iOS 5, los usuarios pueden crear patrones de vibración personalizados para alertas y anillos. La siguiente captura de pantalla muestra la interfaz de usuario para crear una (aplicación Contactos en iOS 6):

He estado buscando, incluida la documentación, y no puedo encontrar ninguna API pública que exponga la creación o reproducción de vibraciones personalizadas. Lo más parecido es usar el marco AudioToolbox para reproducir una vibración corta y constante:

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

¿Alguien sabe si hay API para vibraciones personalizadas? No necesariamente tiene que ser API pública. Tengo curiosidad por saber qué usa la aplicación Contactos. ¿Alguien sabe?

PS Otros han sugerido _CTServerConnectionCreate en CoreTelephony ( example ). Lo intenté, pero no pude obtener ninguna vibración por alguna razón.

Actualización de octubre de 2015:

Hay nuevas API privadas en iOS 9 para interactuar con Taptic Engine en dispositivos compatibles. Ver Taptic en iOS 9 para más.


Después de la excavación de horas de servicio en la aplicación de contacto, he descubierto cómo funciona.

ABNewPersonViewControlle invoca una clase en el marco ToneLibrary para hacer esto.

La pila de llamadas se ve así:

0 CoreFoundation 0x3359a1d4 CFGetTypeID + 0 1 CoreFoundation 0x33596396 __CFPropertyListIsValidAux + 46 2 CoreFoundation 0x33517090 CFPropertyListCreateData + 124 3 AudioToolbox 0x38ac255a AudioServicesPlaySystemSoundWithVibration + 158 5 ToneLibrary 0x35a7811a -[TLVibrationRecorderView vibrationComponentDidStartForVibrationRecorderTouchSurface:] + 38 6 ToneLibrary 0x35a772b2 -[TLVibrationRecorderTouchSurface touchesBegan:withEvent:] + 342 7 UIKit 0x3610f526 -[UIWindow _sendTouchesForEvent:] + 314 8 UIKit 0x360fc804 -[UIApplication sendEvent:] + 376

Después de la búsqueda "AudioServicesPlaySystemSoundWithVibration" en la web, no encontré nada.

Entonces decido investigarlo yo mismo. Es una función privada en el marco de AudioToolbox.

la declaración de la función es como

void AudioServicesPlaySystemSoundWithVibration(SystemSoundID inSystemSoundID,id arg,NSDictionary* vibratePattern)

"inSystemSoundID" es SystemSoundID. al igual que "AudioServicesPlaySystemSound", pase "kSystemSoundID_Vibrate".

"arg" no es importante, pasarle nada, todo funcionará bien.

"vibratePattern" es un puntero de "NSDictionary", la aplicación de contacto pasa a {Intensity = 1; OffDuration = 1; OnDuration = 10; } para grabar la entrada del usuario.

Pero solo llamar a esta función hará que la vibración nunca se detenga. Así que tengo que encontrar alguna función para detenerlo.

La respuesta es "AudioServicesStopSystemSound". También es una función privada en el marco de AudioToolbox.

la declaración de la función es como

void AudioServicesStopSystemSound(SystemSoundID inSystemSoundID)

Supongo que la aplicación de contacto utiliza AudioServicesPlaySystemSoundWithVibration en el método touchesBegan, y AudioServicesStopSystemSound en el método touchEnd para alcanzar este efecto.

TLVibrationController administrará un objeto de patrón de vibración para registrar el proceso que ingresa.

Por fin genera un diccionario para pasar a AudioServicesPlaySystemSoundWithVibration para reproducir todo el proceso como se muestra a continuación:

NSMutableDictionary* dict = [NSMutableDictionary dictionary]; NSMutableArray* arr = [NSMutableArray array ]; [arr addObject:[NSNumber numberWithBool:YES]]; //vibrate for 2000ms [arr addObject:[NSNumber numberWithInt:2000]]; [arr addObject:[NSNumber numberWithBool:NO]]; //stop for 1000ms [arr addObject:[NSNumber numberWithInt:1000]]; [arr addObject:[NSNumber numberWithBool:YES]]; //vibrate for 1000ms [arr addObject:[NSNumber numberWithInt:1000]]; [arr addObject:[NSNumber numberWithBool:NO]]; //stop for 500ms [arr addObject:[NSNumber numberWithInt:500]]; [dict setObject:arr forKey:@"VibePattern"]; [dict setObject:[NSNumber numberWithInt:1] forKey:@"Intensity"]; AudioServicesPlaySystemSoundWithVibration(4095,nil,dict);

Entonces, si quieres vibraciones personalizadas en iOS. Use AudioServicesPlaySystemSoundWithVibration y AudioServicesStopSystemSound.


Hay un proyecto llamado HapticKeyboard que hace esto. Ver: http://code.google.com/p/zataangstuff/source/browse/trunk/HapticKeyboard/Classes/HapticKeyboard.m?r=93

Específicamente, mira el último conjunto de funciones

_CTServerConnectionSetVibratorState(&x, connection, 0, 0, 0, 0, 0);

Hay dos problemas:

  1. Dudo que permitas que tu aplicación entre en la tienda de aplicaciones. Apple verá esto como una pérdida de batería para los usuarios y son bastante estrictos con respecto a la experiencia del usuario
  2. Esto puede requerir jailbreaking. Ha habido varias versiones nuevas de iOS desde la última vez que jugué con esto, así que es difícil de decir