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):
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.
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.
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:
- 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
- może to wymagać Ucieczka z więzienia. Istnieje kilka nowych wersji iOS od kiedy ostatnio grałem z tym, więc trudno powiedzieć
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