#SwiftUIを使って学習がてらタイマーアプリを作ってみよう Part7
###前置き
前回投稿したPart6の続きです。
今回のゴールとしては下記の処理の実装とします。
1.アプリがバックグランドにいる状態でも音がなり続けるようにする
次回はSwiftUIでUIKit(UIPageViewController)を使うpartです。
###開発環境
Mac (OS Big Sur version:11.3.1)
Xcode (version:12.5)
Swift (version: 5.4)
対象IOS(version:14.5以上)
###AVAudioPlayerをバックグランドに対応させる
参考元の記事をもとに実装
やっていることは二つだけで簡単にできた
・1.TargetsのSigning&Capabilitiesの[Background Modes]でAudio,AirPlay,and Picture in Pictureにチェックを入れる
・2.AppDelegateを作成してapplication(_ application:UIApplication, didFinishLaunchingWithOptions)内で
AVAudioSessionの設定を行うことでバックグランドでも音楽ファイルを再生できるようになる
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(.playback, mode: .default)
} catch {
fatalError("Cateogry設定失敗")
}
do {
try session.setActive(true)
} catch {
fatalError("Session失敗")
}
return true
}
AVAudioSessionに関して深掘りしてるサイト
があったんで一部を記載。
もっと詳しいのはAppleのドキュメントを見るべし
Categoryの説明
name | 説明 |
---|---|
ambient | 他のアプリで音を流していても再生が止まらない スクリーンロックやサイレント状態にしていると音が聞こえなくなる |
playback | 設定されているアプリが起動すると他のアプリのサウンド再生が止まる。 サイレント状態だろうがスクリーンロックされていようが再生が継続される |
record | 録音しかできない 権限の設定が必要 |
playAndRecord | 録音と再生ができるのでVoIPに使われる事が多い 他のアプリで再生しながら録音するときはAVAudioSessionCategoryOptionMixWithOthersを使う必要がある |
multiRoute | 複数の出力デバイスで再生する時に使う |
Modeの説明
name | 説明 |
---|---|
voiceChat/videoChat | Voice Processing I/O を使うようになるので、ノイズキャンセリングが有効になる |
measurement | DSP等が無効化されて信号処理がやりやすくなる(みたい) |
moviePlayback | 端末のスピーカでステレオ再生が強化されるみたい。主に動画再生時に使う。 |
spokenAudio | 他の音声の割り込みがあったときに、中断再開が出来る模様 |
###参考・引用元
・[iPhone] Background バックグランド処理
・AVAudioSessionの深い話
・AppleDeveloper > Documentation > AVFAudio > AVAudioSession
###シリーズ:「SwiftUIの学習でタイマーアプリを作ってみよう」のリンク
part1:プロジェクトの作成とGitHubに登録
part2: Timerを利用したカウント処理の実装
part3:計測画面でのプログレスバーの実装
part4:スピナー実装
part5:ライブラリから音楽を選択して再生
part6:タイマー処理のバックグランド対応
part7:音楽のバックグランド再生対応 ← 今ここ
part8:PageViewを作成
part9:PageViewのインジゲータを作成