IPhoneを1回振動するように設定するにはどうすればよいですか?
たとえば、プレーヤーが命を失うか、ゲームが終了すると、iPhoneが振動します。
「 iPhoneチュートリアル:iOSデバイスの機能を確認するより良い方法 」から:
パラメータkSystemSoundID_Vibrate
をとる2つの一見類似した関数があります。
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
両方の機能がiPhoneを振動させます。ただし、振動をサポートしていないデバイスで最初の機能を使用すると、ビープ音が鳴ります。一方、2番目の機能は、サポートされていないデバイスでは何もしません。したがって、警告として、常識的に言うと、機能2を使用して、デバイスを連続的に振動させる場合です。
まず、ビルドフェーズでAudioToolboxフレームワークAudioToolbox.framework
をターゲットに追加します。
次に、このヘッダーファイルをインポートします。
#import <AudioToolbox/AudioServices.h>
AudioToolboxがkSystemSoundID_Vibrate
をSystemSoundID
型として提示するようになったため、コードは次のとおりです。
import AudioToolbox.AudioServices
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
追加のキャストステップを実行する代わりに
(@Dovの小道具)
そして、ここにあなたがそれを行う方法がありますSwift(私と同じトラブルに遭遇した場合)
AudioToolbox.framework
に対するリンク(プロジェクトに移動し、ターゲットを選択し、フェーズをビルドし、バイナリをライブラリにリンクし、そこにライブラリを追加します)
それが完了したら:
import AudioToolbox.AudioServices
// Use either of these
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
安っぽいのは、SystemSoundID
は基本的にUInt32
のtypealias
(空想Swift typedef
)であり、kSystemSoundID_Vibrate
は通常のInt
であるということです。コンパイラーは、Int
からUInt32
にキャストしようとするとエラーを出しますが、エラーは「SystemSoundIDに変換できません」と表示され、混乱を招きます。なぜAppleをSwift enumにしなかったのは私を超えています。
@ aponomarenko'sが詳細に入りますが、私の答えはSwifters向けです。
そのための簡単な方法は、オーディオサービスを使用することです。
#import <AudioToolbox/AudioToolbox.h>
...
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
何らかの方法で振動がオフになっているデバイスではこれに大きな問題がありましたが、アプリケーションの機能にとって重要であり、文書化されたメソッド呼び出しの単なる整数であるため、それが関係なく動作する必要がありました検証。だから私はここでよく文書化されたものの外にあったいくつかの音を試してみました: TUNER88/iOSSystemSoundsLibrary
次に、サイレントスイッチまたはデバイス(Settings->vibrate on ring, vibrate on silent)
の設定に関係なく動作している1352を見つけました。
- (void)vibratePhone;
{
if([[UIDevice currentDevice].model isEqualToString:@"iPhone"])
{
AudioServicesPlaySystemSound (1352); //works ALWAYS as of this post
}
else
{
// Not an iPhone, so doesn't have vibrate
// play the less annoying tick noise or one of your own
AudioServicesPlayAlertSound (1105);
}
}
重要な注意:将来の廃止の警告。
iOS 9.の時点で、API関数の説明:
AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID)
AudioServicesPlayAlertSound(inSystemSoundID: SystemSoundID)
次の注意事項が含まれています。
This function will be deprecated in a future release.
Use AudioServicesPlayAlertSoundWithCompletion or
AudioServicesPlaySystemSoundWithCompletion instead.
適切な方法は、次の2つのいずれかを使用することです。
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate, nil)
または
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate) {
//your callback code when the vibration is done (it may not vibrate in iPod, but this callback will be always called)
}
import AVFoundation
を忘れないでください
Xamarin(モノタッチ)フレームワークを使用している場合は、単に呼び出します
SystemSound.Vibrate.PlayAlertSound()
私の旅行では、オーディオの録音中に次のいずれかを試しても、デバイスが有効になっていてもデバイスは振動しません。
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
私の方法は、デバイスの動きを測定する特定の時間に呼び出されました。記録を停止し、振動が発生した後に再開する必要がありました。
こんな感じでした。
-(void)vibrate {
[recorder stop];
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
[recorder start];
}
recorder
はAVRecorderインスタンスです。
これが以前に同じ問題を抱えていた他の人を助けることを願っています。
IOS 10および新しいiPhoneでは、ハプティックAPIも使用できます。この触覚フィードバックは、AudioToolbox APIよりもソフトです。
GAME OVERシナリオの場合、UIに大きな影響を与えるフィードバックが適しているはずです。
UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
その他の触覚フィードバックスタイル を使用できます。
IPhone 7/7 Plus以降の場合、これら3つのハプティックフィードバックAPIを使用します。
let generator = UINotificationFeedbackGenerator()
generator.notificationOccured(style: .error)
使用可能なスタイルは、.error
、.success
、および.warning
です。それぞれに独特の感触があります。
docs から:
成功、失敗、警告を伝える触覚を作成する具体的な
UIFeedbackGenerator
サブクラス。
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccured()
使用可能なスタイルは、.heavy
、.medium
、および.light
です。これらは、さまざまな程度の「硬さ」を持つ単純な振動です。
docs から:
物理的影響をシミュレートするための触覚を作成する具体的な
UIFeedbackGenerator
サブクラス
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()
これは、すべてのハプティックスの中で最も目立たないため、ハプティックスがアプリのエクスペリエンスを引き継ぐべきではない場合に最も適しています。
docs から:
選択の変更を示す触覚を作成する具体的な
UIFeedbackGenerator
サブクラス。
これらのAPIを使用する際に覚えておく価値のあることがいくつかあります。
実際にハプティックを作成するわけではありません。あなたはシステムをリクエストハプティックを生成します。システムは以下に基づいて決定します。
したがって、システムは、触覚に対する要求が不可能な場合、黙って無視します。これがサポートされていないデバイスが原因である場合、これを試すことができます:
func haptic() {
// Get whether the device can generate haptics or not
// If feedbackSupportLevel is nil, will assign 0
let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int ?? 0
switch feedbackSupportLevel {
case 2:
// 2 means the device has a Taptic Engine
// Put Taptic Engine code here, using the APIs explained above
case 1:
// 1 means no Taptic Engine, but will support AudioToolbox
// AudioToolbox code from the myriad of other answers!
default: // 0
// No haptic support
// Do something else, like a beeping noise or LED flash instead of haptics
}
switch
-case
ステートメントのコメントを置き換えると、このハプティック生成コードは他のiOSデバイスに移植可能になります。最高レベルの触覚を生成します。
prepare()
メソッドがあり、準備状態になります。ゲームオーバーの例の使用:ユーザーが非常に低いHPを持っているか、危険なモンスターが近くにいることで、ゲームが終了しようとしていることがわかります。
この場合、Taptic Engineを準備すると、高品質で応答性の高いエクスペリエンスが作成されます。
たとえば、アプリでパンジェスチャ認識機能を使用して、表示される世界の部分を変更するとします。ユーザーが360度「見ている」ときにハプティックを生成する必要があります。 prepare()
の使用方法は次のとおりです。
@IBAction func userChangedViewablePortionOfWorld(_ gesture: UIPanGestureRecogniser!) {
haptic = UIImpactFeedbackGenerator(style: .heavy)
switch gesture.state {
case .began:
// The user started dragging the screen.
haptic.prepare()
case .changed:
// The user trying to 'look' in another direction
// Code to change viewable portion of the virtual world
if virtualWorldViewpointDegreeMiddle = 360.0 {
haptic.impactOccured()
}
default:
break
}
Swiftの場合:
import AVFoundation
...
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
私の場合、AVCaptureSessionを使用していました。 AudioToolboxはプロジェクトのビルドフェーズにあり、インポートされましたが、まだ機能しませんでした。それを機能させるために、私は振動の前にセッションを停止し、その後も続けました。
#import <AudioToolbox/AudioToolbox.h>
...
@property (nonatomic) AVCaptureSession *session;
...
- (void)vibratePhone;
{
[self.session stopRunning];
NSLog(@"vibratePhone %@",@"here");
if([[UIDevice currentDevice].model isEqualToString:@"iPhone"])
{
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
}
else
{
AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);
}
[self.session startRunning];
}