web-dev-qa-db-ja.com

iPhoneを振動させる

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

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

223
jarryd

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

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

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

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

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

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

#import <AudioToolbox/AudioServices.h>
398
linuxbuild

Swift 2.0+

AudioToolboxがkSystemSoundID_VibrateSystemSoundID型として提示するようになったため、コードは次のとおりです。

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は基本的にUInt32typealias(空想Swift typedef)であり、kSystemSoundID_Vibrateは通常のIntであるということです。コンパイラーは、IntからUInt32にキャストしようとするとエラーを出しますが、エラーは「SystemSoundIDに変換できません」と表示され、混乱を招きます。なぜAppleをSwift enumにしなかったのは私を超えています。

@ aponomarenko'sが詳細に入りますが、私の答えはSwifters向けです。

45
Can

そのための簡単な方法は、オーディオサービスを使用することです。

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

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

重要な注意:将来の廃止の警告。

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を忘れないでください

24
Hugo Alonso

Xamarin(モノタッチ)フレームワークを使用している場合は、単に呼び出します

SystemSound.Vibrate.PlayAlertSound()
5
Wheelie

私の旅行では、オーディオの録音中に次のいずれかを試しても、デバイスが有効になっていてもデバイスは振動しません。

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

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

こんな感じでした。

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

recorderはAVRecorderインスタンスです。

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

5
Sebastien Peek

IOS 10および新しいiPhoneでは、ハプティックAPIも使用できます。この触覚フィードバックは、AudioToolbox APIよりもソフトです。

GAME OVERシナリオの場合、UIに大きな影響を与えるフィードバックが適しているはずです。

UIImpactFeedbackGenerator(style: .heavy).impactOccurred()

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

4
samwize

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

利用可能な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を使用する際に覚えておく価値のあることがいくつかあります。

注A

実際にハプティックを作成するわけではありません。あなたはシステムをリクエストハプティックを生成します。システムは以下に基づいて決定します。

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

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

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

  • ハプティックスの生成はハードウェア-レベルのタスクであるため、callハプティックス生成コードと実際にこのため、Taptic Engine APIにはすべてprepare()メソッドがあり、準備状態になります。ゲームオーバーの例の使用:ユーザーが非常に低いHPを持っているか、危険なモンスターが近くにいることで、ゲームが終了しようとしていることがわかります。
  • 数秒以内にハプティックを生成しない場合、Taptic Engineはアイドル状態に戻ります(バッテリー寿命を節約するため)


この場合、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

} 
3
Benj

Swiftの場合:

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

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