Contact Appでサーバル時間を掘り下げた後、私はそれがどのように機能するかを理解しました。
ABNewPersonViewControlleは、これを行うためにToneLibraryフレームワークのクラスを呼び出します。
呼び出しスタックは次のようになります。
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
Webで「AudioServicesPlaySystemSoundWithVibration」を検索したところ、何も見つかりませんでした。
だから私はそれを自分で調べることにしました。これは、AudioToolboxフレームワークのプライベート関数です。
関数の宣言は次のようになります
void AudioServicesPlaySystemSoundWithVibration(SystemSoundID inSystemSoundID,id arg,NSDictionary* vibratePattern)
「inSystemSoundID」はSystemSoundIDです。「AudioServicesPlaySystemSound」と同様に、「kSystemSoundID_Vibrate」を渡します。
「arg」は重要ではありません。nilを渡してください。すべてが正常に機能します。
「vibratePattern」は「NSDictionary」のポインターであり、ContactAppは{Intensity= 1; OffDuration = 1; OnDuration = 10; ユーザー入力を記録するための}。
ただし、この関数を呼び出すだけで、振動が止まることはありません。だから私はそれを止めるためにいくつかの関数を見つけなければなりません。
答えは「AudioServicesStopSystemSound」です。これは、AudioToolboxフレームワークのプライベート関数でもあります。
関数の宣言は次のようになります
void AudioServicesStopSystemSound(SystemSoundID inSystemSoundID)
ContactアプリはtouchesBeganメソッドでAudioServicesPlaySystemSoundWithVibrationを使用し、touchEndメソッドでAudioServicesStopSystemSoundを使用してこの効果を実現していると思います。
TLVibrationControllerは、入力したプロセスを記録するために振動パターンオブジェクトを管理します。
最後に、AudioServicesPlaySystemSoundWithVibrationに渡す辞書を生成して、以下のようにプロセス全体を再生します。
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);
したがって、iOSでカスタムバイブレーションが必要な場合。AudioServicesPlaySystemSoundWithVibrationおよびAudioServicesStopSystemSoundを使用します。