バックグラウンド処理

バックグラウンド処理

執筆済 ソフトウェア開発iOS

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 が転送を続け、 完了時にアプリを起動して通知する。

参考文献#

ノート一覧を閉じる