Nach mehreren Stunden in der Kontakt-App habe ich herausgefunden, wie es funktioniert.
ABNewPersonViewControlle ruft dazu eine Klasse im ToneLibrary-Framework auf.
Der Aufrufstapel sieht folgendermaßen aus:
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
Nach der Suche nach "AudioServicesPlaySystemSoundWithVibration" im Web habe ich nichts gefunden.
Also entscheide ich mich, es selbst zu untersuchen. Es ist eine private Funktion im AudioToolbox-Framework.
Die Deklaration der Funktion ist wie
void AudioServicesPlaySystemSoundWithVibration(SystemSoundID inSystemSoundID,id arg,NSDictionary* vibratePattern)
"inSystemSoundID" ist SystemSoundID. Übergeben Sie genau wie "AudioServicesPlaySystemSound" "kSystemSoundID_Vibrate".
"arg" ist nicht wichtig, gib nichts an, alles wird noch gut funktionieren.
"vibratePattern" ist ein Zeiger auf "NSDictionary", die Contact App geht in {Intensity = 1; OffDuration = 1; OnDuration = 10; } zum Aufzeichnen von Benutzereingaben.
Wenn Sie diese Funktion nur aufrufen, hört eine Vibration niemals auf. Also muss ich eine Funktion finden, um es zu stoppen.
Die Antwort lautet "AudioServicesStopSystemSound". Es ist auch eine private Funktion im AudioToolbox-Framework.
Die Deklaration der Funktion ist wie
void AudioServicesStopSystemSound(SystemSoundID inSystemSoundID)
Ich denke, die Kontakt-App verwendet AudioServicesPlaySystemSoundWithVibration in der touchBegan-Methode und AudioServicesStopSystemSound in der touchEnd-Methode, um diesen Effekt zu erzielen.
TLVibrationController verwaltet ein Vibrationsmusterobjekt, um den von Ihnen eingegebenen Prozess aufzuzeichnen.
Zuletzt wird ein Wörterbuch generiert, das an AudioServicesPlaySystemSoundWithVibration übergeben wird, um den gesamten Prozess wie folgt abzuspielen:
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
NSMutableArray* arr = [NSMutableArray array ];
[arr addObject:[NSNumber numberWithBool:YES]];
[arr addObject:[NSNumber numberWithInt:2000]];
[arr addObject:[NSNumber numberWithBool:NO]];
[arr addObject:[NSNumber numberWithInt:1000]];
[arr addObject:[NSNumber numberWithBool:YES]];
[arr addObject:[NSNumber numberWithInt:1000]];
[arr addObject:[NSNumber numberWithBool:NO]];
[arr addObject:[NSNumber numberWithInt:500]];
[dict setObject:arr forKey:@"VibePattern"];
[dict setObject:[NSNumber numberWithInt:1] forKey:@"Intensity"];
AudioServicesPlaySystemSoundWithVibration(4095,nil,dict);
Also, wenn Sie eine benutzerdefinierte Vibration in iOS wollen. Verwenden Sie AudioServicesPlaySystemSoundWithVibration und AudioServicesStopSystemSound.