📱

【Swift】AudioServicesPlaySystemSoundを使用して端末をバイブレーションさせる

2023/04/18に公開

概要

iPhoneをバイブレーションさせるにはいくつかの方法があります。
サッと調べただけでも

  • UINotificationFeedbackGenerator
  • UIImpactFeedbackGenerator
  • UISelectionFeedbackGenerator
  • AudioServicesPlaySystemSound

とありました。ただ用途として

  • 標準的なバイブレーションのみでよく、カスタマイズはしなくていい(例えば音楽と連動するとか)
  • 繰り返しバイブレーションし、任意のタイミングで止めたい
  • 簡易的に実装できる

でしたので、AudioServicesPlaySystemSoundが条件に一番近そうだったので試しに使用してみました。

環境

この記事は以下のバージョン環境のもと作成されたものです。
【Xcode】14.3
【iOS】16.4
【macOS】Ventuta

AudioServicesPlaySystemSound

https://developer.apple.com/documentation/audiotoolbox/1405248-audioservicesplaysystemsound

こちらは短い音を鳴らすためのメソッドで非同期で実行されるようです。
また引数にkSystemSoundID_Vibrateを渡すことでバイブレーションを実装する事ができます。
ただiPod touch では使用できないようです。
https://developer.apple.com/documentation/audiotoolbox/ksystemsoundid_vibrate

使用方法はAudioToolboxをImportすることで使用する事ができます。

AudioServicesPlaySystemSoundを利用した実装事例

以下のサンプルコードを使用するとstartTestingVibrationでバイブレーションを実行し、stopTestingVibrationで止める事ができます。

import AudioToolbox

final class VibrationManager: ObservableObject {
    @Published var isTestingVibration = false
    private var vibrationTimer: Timer?
    func startTestingVibration() {
        isTestingVibration = true
        vibrationTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
            if self.isTestingVibration {
                AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
            } else {
                self.vibrationTimer?.invalidate()
                self.vibrationTimer = nil
            }
        }
    }

    func stopTestingVibration() {
        isTestingVibration = false
    }
}

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)は約1秒ほどバイブレーションすると止まります。そこでscheduledTimerを使用して繰り返し処理を入れています。
バイブレーションをキャプチャ動画にすることはできませんがボタンをつけるとこんな感じです。

まとめ

以上AudioServicesPlaySystemSoundを使用して端末をバイブレーションさせるでした。
カスタマイズしたい場合や別のバイブレーションパターンを使用したい場合は冒頭であげているAPIをみてください。

Discussion