73

iOS 5以降、ユーザーはアラートとリングのカスタムバイブレーションパターンを作成できます。次のスクリーンショットは、1つを作成するためのUIを示しています(iOS 6の連絡先アプリ)。

iOS6でカスタムバイブレーションを作成するためのUIのスクリーンショット

ドキュメントを含めて検索してきましたが、カスタムバイブレーションの作成または再生を公開するパブリックAPIが見つかりません。最も近いのは、AudioToolboxフレームワークを使用して、短く一定の振動を再生することです。

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

カスタムバイブレーション用のAPIがあるかどうか誰かが知っていますか?必ずしもパブリックAPIである必要はありません。連絡先アプリが何を使用しているか知りたいです。誰か知っている?

PSその他は(_CTServerConnectionCreate)で提案しています。試してみましたが、なんらかの理由でバイブレーションが出ませんでした。CoreTelephony

2015年10月の更新:

iOS 9には、互換性のあるデバイスのTapticEngineと対話するための新しいプライベートAPIがあります。詳細については、iOS9のTapticを参照してください。

4

2 に答える 2

104

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を使用します。

于 2012-10-24T10:34:50.680 に答える
4

これを行うHapticKeyboardというプロジェクトがあります。参照:http ://code.google.com/p/zataangstuff/source/browse/trunk/HapticKeyboard/Classes/HapticKeyboard.m?r = 93

具体的には、最後の関数セットを見てください

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

2つの問題があります:

  1. あなたのアプリがアプリストアに入るのを許可されるとは思えません。Appleはこれをユーザーのバッテリーの消耗と見なし、ユーザーエクスペリエンスについてはかなり厳格です
  2. これには脱獄が必要な場合があります。私がこれを最後にプレイして以来、いくつかの新しいiOSバージョンがありますので、見分けるのは難しいです
于 2012-10-23T14:25:40.313 に答える