231

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

たとえば、プレイヤーがライフを失ったり、ゲームが終了したりすると、iPhoneが振動するはずです。

4

12 に答える 12

406

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

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

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

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

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

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

#import <AudioToolbox/AudioServices.h>
于 2011-01-18T14:11:41.103 に答える
46

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です。コンパイラはからへのキャストを試みるとエラーを出しますが、エラーはIntUInt32SystemSoundIDに変換できません」と表示され、混乱を招きます。なぜアップルはそれをSwift列挙型にしないのか私を超えています。

@aponomarenkoの詳細について説明します。私の答えは、そこにあるSwiftersだけです。

于 2014-09-29T07:38:11.483 に答える
35

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

#import <AudioToolbox/AudioToolbox.h> 
...    
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
于 2011-01-18T14:08:15.593 に答える
33

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

重要な注意:将来の非推奨のアラート。

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

于 2015-10-08T19:34:00.820 に答える
10

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

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

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

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

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 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

} 
于 2019-05-02T10:17:16.193 に答える
5

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

SystemSound.Vibrate.PlayAlertSound()
于 2013-10-29T09:10:54.613 に答える
5

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

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

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

こんな感じでした。

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

recorderAVRecorderインスタンスです。

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

于 2013-11-19T23:54:58.333 に答える
5

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

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

UIImpactFeedbackGenerator(style: .heavy).impactOccurred()

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

于 2018-04-30T02:53:05.350 に答える
1

Swiftの場合:

import AVFoundation
...
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
于 2015-08-07T08:44:33.457 に答える
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];
}
于 2015-07-01T10:47:29.360 に答える
-5

使用できます

1)AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

iPhoneおよびいくつかの新しいiPod用。

2)AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

iPad用。

于 2015-03-30T11:36:03.997 に答える