iPhoneを1回振動するように設定するにはどうすればよいですか?
たとえば、プレイヤーがライフを失ったり、ゲームが終了したりすると、iPhoneが振動するはずです。
iPhoneを1回振動するように設定するにはどうすればよいですか?
たとえば、プレイヤーがライフを失ったり、ゲームが終了したりすると、iPhoneが振動するはずです。
「iPhoneチュートリアル:iOSデバイスの機能を確認するためのより良い方法」から:
パラメータを取る2つの一見類似した関数がありますkSystemSoundID_Vibrate
:
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
どちらの機能もiPhoneを振動させます。ただし、バイブレーションをサポートしていないデバイスで最初の機能を使用すると、ビープ音が鳴ります。一方、2番目の機能は、サポートされていないデバイスでは何もしません。したがって、デバイスを継続的に振動させる場合は、常識的に言うと、アラートとして機能2を使用します。
AudioToolbox.framework
まず、ビルドフェーズでAudioToolboxフレームワークをターゲットに追加します。
次に、次のヘッダーファイルをインポートします。
#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
基本的にはtypealias
(ファンシースウィフトtypedef
)でUInt32
あり、kSystemSoundID_Vibrate
は通常のInt
です。コンパイラはからへのキャストを試みるとエラーを出しますが、エラーはInt
「UInt32
SystemSoundIDに変換できません」と表示され、混乱を招きます。なぜアップルはそれをSwift列挙型にしないのか私を超えています。
@aponomarenkoの詳細について説明します。私の答えは、そこにあるSwiftersだけです。
これを行う簡単な方法は、オーディオサービスを使用することです。
#import <AudioToolbox/AudioToolbox.h>
...
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
何らかの方法でバイブレーションがオフになっているデバイスではこれに大きな問題がありましたが、アプリケーションが機能するために重要であり、文書化されたメソッド呼び出しの整数であるため、問題なく機能する必要がありました。検証。だから私はここで十分に文書化されたものの外にあるいくつかの音を試しました:TUNER88 / iOSSystemSoundsLibrary
次に、サイレントスイッチやデバイスの設定に関係なく動作する1352に遭遇しました(Settings->vibrate on ring, vibrate on silent)
。
- (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.0以降、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
iPhone 7/7 Plus以降の場合は、これら3つのハプティックフィードバックAPIを使用してください。
let generator = UINotificationFeedbackGenerator()
generator.notificationOccured(style: .error)
使用可能なスタイルは、、、.error
および.success
です.warning
。それぞれに独特の感触があります。
ドキュメント
から:
UIFeedbackGenerator
成功、失敗、および警告を伝達するための触覚を作成する具体的なサブクラス。
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccured()
使用可能なスタイルは、、、.heavy
および.medium
です.light
。これらは、さまざまな程度の「硬度」を持つ単純な振動です。
ドキュメント
から:
物理的な影響をシミュレートする触覚を作成する具体的な
UIFeedbackGenerator
サブクラス
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()
これは、すべてのハプティックスの中で最も目立たないため、ハプティックスがアプリのエクスペリエンスを引き継ぐべきではない場合に最適です。
ドキュメント
から:
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
}
また、Xamarin(monotouch)フレームワークを使用している場合は、
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を使用することもできます。この触覚フィードバックは、AudioToolboxAPIよりもソフトです。
GAME OVERシナリオでは、UIに大きな影響を与えるフィードバックが適しているはずです。
UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
他の触覚フィードバックスタイルを使用できます。
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];
}
使用できます
1)AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
iPhoneおよびいくつかの新しいiPod用。
2)AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
iPad用。