LoginSignup
2

More than 1 year has passed since last update.

SwiftUIを使って学習がてらタイマーアプリを作ってみよう7

Last updated at Posted at 2021-07-07

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の設定を行うことでバックグランドでも音楽ファイルを再生できるようになる

AppDelegate.swift
    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のインジゲータを作成

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2