バックグラウンドはできるだけ避けるべきというのがAppleのスタンスでしょうか 。ただ、バックグラウンドでもオーディオや位置情報を使うことはできるようです。
Xcode 11.3.1
Background Modes
には、audioや位置情報、通知などはバックグラウンドでも動作することが必要なので説明も多いようです。
audioは継続的にバックグラウンドで動作させたいので実際に使って見ます。
Background Modesの設定
「TARGET」->「Signing & Capabilities」から「+Capabilities」をクリックするとダイアログが表示されるので「Background Modes」を選択します。
Background Modesが追加されるので、「Audio, AirPlay …」にチェックします。
Info.plist に background modes が追加されています。
AVAudioplayer
AVAudioplayerを使ってmp3を再生してみます。以下のままコードを記述しstoryboardを設定します。
AppDelegateの設定
AVAudioSessonをAppDelegateに設定します。
AppDelegate.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import UIKit // AVFoundation をインポート import AVFoundation @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { do { try AVAudioSession.sharedInstance().setCategory( .playback, mode: .default) try AVAudioSession.sharedInstance().setActive(true) } catch { print(error) } return true } ... } |
バックグラウンドなので実機てテストします。実行するとバックグラウンドでも再生しているのがわかります。
オーディオを再生するとしながら、実際は別の処理をさせて音楽は無音にするということを考える方がいるとは思いますが、リジェクトされるかもしれません
2.5.4 マルチタスクAppには、VoIP、オーディオ再生、位置情報取得、タスクの完了、ローカル通知など、適切なバックグラウンドサービスのみを使用してください。バックグラウンドでの位置情報取得モードを使用する場合は、それによってバッテリー持続時間が大幅に減少する可能性があることを通知してください。
Reference: App Store Reviewガイドライン
通知もしろという御達しです。
Error:
1 2 3 |
Can't end BackgroundTask: no background task exists with identifier ..., or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug. |
というエラーがLogとして吐き出されているのですが、これはバグのようでiOS13.4で修正されるということらしいです。
Open Radar Community bug reports