バックグラウンド処理
iOS は電池のためにバックグラウンド実行を厳しく制限する。 「バックグラウンドで動き続ける」ことは基本的にできない。
手段#
| 手段 | 用途 | 実行時間 |
|---|---|---|
beginBackgroundTask |
進行中の処理の完了 | 約 30 秒 |
BGAppRefreshTask |
内容の更新 | 約 30 秒。OS が時間を決める |
BGProcessingTask |
重い処理(DB 整理など) | 数分。充電中・待機中に実行 |
| バックグラウンド URLSession | ファイル転送 | 制限なし(OS が代行) |
| 継続的な実行 | 音楽、ナビ、VoIP など限られた種類のみ | 制限なし |
OS がいつ実行するかを決める#
swift
let request = BGAppRefreshTaskRequest(identifier: "com.example.refresh")
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
try BGTaskScheduler.shared.submit(request)earliestBeginDate は最も早い時刻であって、
その時刻に実行される保証はない。
OS は次のような要素で判断する。
- 利用者がそのアプリをどれだけ使うか
- 電池残量、充電中か
- ネットワークの状態
- 低電力モードか
あまり使われないアプリは、ほとんど実行されない。
設計の原則#
| 原則 | 理由 |
|---|---|
| 必ず期限切れハンドラを実装する | 中断されたときに片付ける |
| 冪等にする | 途中で切れても再実行できるように |
| 短く区切る | 時間内に終わる単位に分ける |
| 前面での更新も用意する | 背景実行に依存しない |
expirationHandler を実装せずに時間超過すると、
アプリが強制終了される。
ファイル転送#
大きなダウンロード・アップロードは
バックグラウンド URLSession を使う。
アプリが終了していても OS が転送を続け、
完了時にアプリを起動して通知する。
参考文献#
- Apple. Background Tasks. https://developer.apple.com/documentation/backgroundtasks
- Apple. Downloading files in the background. https://developer.apple.com/documentation/foundation/downloading-files-in-the-background