Czy są interfejsy API dla niestandardowych wibracji w systemie iOS?

Począwszy od iOS 5, użytkownicy mogą tworzyć niestandardowe wzorce wibracji dla alertów i pierścieni. Poniższy zrzut ekranu pokazuje interfejs użytkownika do tworzenia (aplikacja Kontakty w systemie iOS 6):

Zrzut ekranu interfejsu użytkownika do tworzenia niestandardowych wibracji w systemie iOS 6

Szukałem wokół, w tym dokumentacji, i nie mogę znaleźć żadnych publicznych API, które ujawniają tworzenie lub odtwarzanie niestandardowych wibracji. Najbliższą rzeczą jest użycie frameworka AudioToolbox do odegrania krótkiej, stałej wibracji:

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

Czy ktoś wiesz, czy istnieją interfejsy API dla niestandardowych wibracji? niekoniecznie muszą to być publiczne API. Jestem ciekaw, czego używa aplikacja Kontakty. Czy ktoś wie?

P. S. inni zasugerowali _CTServerConnectionCreate w CoreTelephony (przykład ). Próbowałem, ale nie mogłem uzyskać żadnych wibracji z jakiegoś powodu.

Październik 2015 Aktualizacja:

[[4]} w iOS 9 pojawiły się nowe prywatne API do interakcji z silnikiem Taptic w kompatybilnych urządzeniach. Zobacz Taptic w iOS 9 więcej.
Author: Community, 2012-10-19

2 answers

Po godzinnym kopaniu w aplikacji kontaktowej, odkryłem, jak to działa.

ABNewPersonViewControlle wywołuje jakąś klasę w ramce ToneLibrary, aby to zrobić.

Stos wywołań wygląda tak:

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

Po przeszukaniu "Audioservicesplaysystemsoundwibration" w sieci nic nie znalazłem.

Więc postanowiłem się temu przyjrzeć. Jest to prywatna funkcja w frameworku AudioToolbox.

Deklaracja funkcji jest jak

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

"insystemsound" to Systemsound .podobnie jak "AudioServicesPlaySystemSound", podaj "kSystemSoundID_Vibrate".

"arg" nie jest ważne, podaj zero do niego, wszystko nadal będzie działać dobrze.

"vibratePattern" jest wskaźnikiem "NSDictionary", aplikacja kontaktowa przechodzi do { Intensywność = 1; Offduction = 1; OnDuration = 10; } do nagrywania wejść użytkownika.

Ale tylko wywołanie tej funkcji sprawi, że wibracja nigdy się nie zatrzyma. Więc muszę znaleźć jakieś funkcja, aby go zatrzymać.

Odpowiedź brzmi "AudioServicesStopSystemSound". Jest to również prywatna funkcja w frameworku AudioToolbox.

Deklaracja funkcji jest jak

void AudioServicesStopSystemSound(SystemSoundID inSystemSoundID)

Domyślam się, że aplikacja kontaktowa używa AudioServicesPlaySystemSoundWithvibration in touchesBegan method I AudioServicesStopSystemSound in touchend method, aby osiągnąć ten efekt.

TLVibrationController będzie zarządzał obiektem wzorca wibracji, aby zarejestrować proces, który wprowadzasz.

At last generuje Słownik, aby przejść do AudioServicesPlaySystemSoundWithvibration, aby odtworzyć cały proces, jak poniżej: {]}

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);

Więc jeśli chcesz niestandardowe Wibracje w iOS. Użyj AudioServicesPlaySystemSoundWithvibration i AudioServicesStopSystemSound.

 105
Author: Kevin Cao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-05 05:54:32

Istnieje projekt o nazwie HapticKeyboard that. Zobacz: http://code.google.com/p/zataangstuff/source/browse/trunk/HapticKeyboard/Classes/HapticKeyboard.m?r=93

W szczególności, spójrz na ostatni zbiór funkcji

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

Są dwa problemy:

  1. wątpię, żeby Twoja aplikacja trafiła do app store. Apple będzie postrzegać to jako rozładowanie baterii dla użytkowników i są dość rygorystyczne pod względem doświadczenia użytkownika
  2. może to wymagać Ucieczka z więzienia. Istnieje kilka nowych wersji iOS od kiedy ostatnio grałem z tym, więc trudno powiedzieć
 4
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-23 14:25:40