📱
【Swift】AudioServicesPlaySystemSoundを使用して端末をバイブレーションさせる
概要
iPhoneをバイブレーションさせるにはいくつかの方法があります。
サッと調べただけでも
- UINotificationFeedbackGenerator
- UIImpactFeedbackGenerator
- UISelectionFeedbackGenerator
- AudioServicesPlaySystemSound
とありました。ただ用途として
- 標準的なバイブレーションのみでよく、カスタマイズはしなくていい(例えば音楽と連動するとか)
- 繰り返しバイブレーションし、任意のタイミングで止めたい
- 簡易的に実装できる
でしたので、AudioServicesPlaySystemSoundが条件に一番近そうだったので試しに使用してみました。
環境
この記事は以下のバージョン環境のもと作成されたものです。
【Xcode】14.3
【iOS】16.4
【macOS】Ventuta
AudioServicesPlaySystemSound
こちらは短い音を鳴らすためのメソッドで非同期で実行されるようです。
また引数にkSystemSoundID_Vibrate
を渡すことでバイブレーションを実装する事ができます。
ただiPod touch では使用できないようです。
使用方法は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