Après avoir passé plusieurs heures à creuser dans l'application Contact, j'ai compris comment cela fonctionne.
ABNewPersonViewControlle invoque une classe dans le cadre de ToneLibrary pour faire cela.
La pile d'appels ressemble à ceci :
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
Après avoir cherché "AudioServicesPlaySystemSoundWithVibration" sur le web, je n'ai rien trouvé.
Je décide donc de me renseigner moi-même. C'est une fonction privée dans le framework AudioToolbox.
la déclaration de la fonction est la suivante
void AudioServicesPlaySystemSoundWithVibration(SystemSoundID inSystemSoundID,id arg,NSDictionary* vibratePattern)
"inSystemSoundID" est SystemSoundID .tout comme "AudioServicesPlaySystemSound", passe "kSystemSoundID_Vibrate".
"arg" n'est pas important, passez-lui nil, tout fonctionnera encore correctement.
"vibratePattern" est un pointeur de "NSDictionary", le Contact App passe dans { Intensité = 1 ; OffDuration = 1 ; OnDuration = 10 ; } pour enregistrer les entrées de l'utilisateur.
Mais seul l'appel de cette fonction fera qu'une vibration ne s'arrêtera jamais. Je dois donc trouver une fonction pour l'arrêter.
La réponse est "AudioServicesStopSystemSound". Il s'agit également d'une fonction privée dans le cadre de l'AudioToolbox.
la déclaration de la fonction est la suivante
void AudioServicesStopSystemSound(SystemSoundID inSystemSoundID)
Je suppose que l'application Contact utilise AudioServicesPlaySystemSoundWithVibration dans la méthode touchBegan, et AudioServicesStopSystemSound dans la méthode touchEnd pour obtenir cet effet.
TLVibrationController gérera un objet de modèle de vibration pour enregistrer le processus que vous avez entré.
Enfin, il génère un dictionnaire à passer à AudioServicesPlaySystemSoundWithVibration pour rejouer tout le processus comme ci-dessous :
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);
Donc si vous voulez une vibration personnalisée dans iOS. Utilisez AudioServicesPlaySystemSoundWithVibration et AudioServicesStopSystemSound.