iPhoneを振動させる


228

iPhoneを1回振動するように設定するにはどうすればよいですか?

たとえば、プレーヤーが命を落としたり、ゲームが終了したりすると、iPhoneが振動します。


9
シェイクのジェスチャーは振動とはまったく異なります。1つは人間が開始し、もう1つはデバイスが開始します。
栄子

回答:


404

iPhoneチュートリアル:iOSデバイスの機能を確認するためのより良い方法」から:

パラメータを取る2つの一見似た関数がありますkSystemSoundID_Vibrate

1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

どちらの機能もiPhoneを振動させます。ただし、振動に対応していないデバイスで最初の機能を使用すると、ビープ音が鳴ります。一方、2番目の関数は、サポートされていないデバイスでは何も行いません。したがって、常識的に言うと、デバイスを継続的に振動させる場合は、関数2を使用します。

まず、AudioToolbox.frameworkビルド段階でAudioToolboxフレームワークをターゲットに追加します。

次に、このヘッダーファイルをインポートします。

#import <AudioToolbox/AudioServices.h>

3
#import <Cocoa / Cocoa.h>は不要です。
ラプター2009

10
振動時間を1秒未満に減らす方法はありますか?
ジョージアスダ2013年

11
追加したいのは、iOSの設定でバイブレーションがオフになっている場合、これらのコマンドを使用してもユーザーがバイブレーションを受けないことです。
Denis Kutlubaev 2013年

7
Swift:(AudioServicesPlayAlertSound(UInt32(kSystemSoundID_Vibrate))少なくともベータ2以降)
Sam Soffes 2014年

1
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate); iPhoneのバイバレートはよくなりますが、iPadではビープ音は鳴りません。
Mangesh 14

45

Swift 2.0以降

AudioToolboxはをタイプkSystemSoundID_Vibrateとして表示するSystemSoundIDため、コードは次のとおりです。

import AudioToolbox.AudioServices

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)

追加のキャスト手順を実行する代わりに

(@Dovの小道具)

元の回答(Swift 1.x)

そして、これが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。コンパイラからキャストしようとするために、あなたにエラーを与えるIntUInt32が、混乱され、「SystemSoundIDに変換できません」とエラーが読み込みます。なぜAppleがSwift列挙型にしたのではないのでしょうか。

@aponomarenkoが詳細を説明します。私の答えは、Swiftersだけです。


これはSwift 2 / iOS 9 / Xcode 7で修正されたようです。使用AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)して問題なくコンパイルされました
Dov

35

これを行う簡単な方法は、オーディオサービスを使用することです。

#import <AudioToolbox/AudioToolbox.h> 
...    
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

3
#import <AudioToolbox / AudioToolbox.h>そして、プロジェクトのビルドフェーズにAudioToolbox.frameworkを追加する必要があります。
Michael Mangold 2013

31

何らかの方法でバイブレーションがオフになっているデバイスでは、これで大きな問題がありましたが、アプリケーションの機能にとって重要であり、ドキュメント化されたメソッド呼び出しに対する単なる整数であるため、それは成功します検証。だから私はここで十分に文書化されたものの外にあるいくつかの音を試しました: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);
     }
}

7
マジック定数の代わりに名前付きエイリアスを使用することを常にお勧めします。たとえば、1352ではなくkSystemSoundID_Vibrateを使用します。回答を更新することをお勧めします。
nalexn

3
この魔法の1352の使用は理想的ではないことに同意しますが、デバイスのバイブレーションスイッチがオフの場合でも、バイブレーションを強制する他の方法を見つけることができません。これが唯一の方法のようです。
marcshilling 2015

4
私は公開された定数を過ぎて始まる整数でforループを書いて、どれが振動を引き起こしたかを理解しました
Joel Teply

2
iPhoneでマナーモードをオンにしてもiPhoneが振動しているのが確認できます。正解です。
vomako

2
AudioServicesPlaySystemSound(1352)は、2016
JustAnotherCoder

26

重要な注意:今後のサポート終了のアラート。

以下のようiOSの9.0APIの機能の説明については:

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


インポートステートメントがありません
Juan Boero

AudioToolbox.AudioServicesをインポートする
Hugo Alonso、

自分でやった、AVFoundationのものだけだ。
Juan Boero、2015

とにかく振動の持続時間を設定しますか?
Micro

いくつかの通話を連結する必要があります。新しい通話の間にタイムラプスを使用してください
Hugo Alonso

7

iPhone 7/7 Plus以降では、これら3つのハプティックフィードバックAPIを使用します。

利用可能な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を使用する場合、覚えておくべきことがいくつかあります。

注A

実際に触覚を作成するわけではありません。システムに触覚を生成するように要求します。システムは以下に基づいて決定します。

  • デバイスで触覚が可能かどうか(この場合、触覚エンジンがあるかどうか)
  • アプリが音声を録音できるかどうか(不要な干渉を防ぐため、録音中に触覚は生成されません)
  • システム設定で触覚が有効になっているかどうか。

したがって、それが不可能な場合、システムはハプティックの要求を黙って無視します。これがサポートされていないデバイスが原因である場合、これを試すことができます:

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デバイスに移植できます。最高レベルの触覚を生成します。

注B

  • 触覚の生成はハードウェアレベルのタスクであるため、触覚生成コードを呼び出してから実際に発生するまでの間に遅延が発生する可能性がありますこのため、Taptic Engine APIにはすべてprepare()、準備が整った状態にするためのメソッドがあります。ゲームオーバーの例の使用:ユーザーがHPが非常に低いか、危険なモンスターが近くにいるため、ゲームが間もなく終了することを知っているかもしれません。
  • 数秒以内に触覚を生成しない場合、Taptic Engineはアイドル状態に戻ります(バッテリー寿命を節約するため)


この場合、Tapticエンジンを準備すると、より高品質で応答性の高いエクスペリエンスが作成されます。

たとえば、アプリがパンジェスチャー認識機能を使用して、表示される世界の部分を変更するとします。ユーザーが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

} 

覚えておいてimport UIKitください!
ベンジ

hapticこのメソッド内にの新しいインスタンスを作成する必要はありません。呼び出すimpactOccuredのと同じインスタンスで呼び出しているのではありませんprepare
rmaddy

5

そして、Xamarin(monotouch)フレームワークを使用している場合は、

SystemSound.Vibrate.PlayAlertSound()

5

私の旅行で、オーディオの録音中に次のいずれかを試した場合、デバイスが有効になっていても振動しないことがわかりました。

1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

私の方法は、デバイスの動きを測定する特定の時間に呼び出されました。振動が発生した後、録音を停止してから再開する必要がありました。

こんな感じでした。

-(void)vibrate {
    [recorder stop];
    AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
    [recorder start];
}

recorder AVRecorderインスタンスです。

これが以前に同じ問題を抱えていた他の人を助けることを願っています。


4

iOS 10以降のiPhoneでは、触覚APIを使用することもできます。この触覚フィードバックは、AudioToolbox APIよりも柔らかくなっています。

GAME OVERシナリオでは、UIへの影響が大きいフィードバックが適しています。

UIImpactFeedbackGenerator(style: .heavy).impactOccurred()

他の触覚フィードバックスタイルを使用できます


1

Swiftの場合:

import AVFoundation
...
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))

0

私の場合、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];
}

-5

使用できます

1)AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

iPhoneといくつかの新しいiPod用。

2)AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

iPad用。


3
iPod touchとiPadは振動できません。
DDPWNAGE 2015年

1
振動機能のないデバイス(iPod Touchなど)では、これは何もしません
Lal Krishna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.