Background(iOS) - ntuf/Tips GitHub Wiki
各種Background Mode
■Background Task Completion(iOS4+)
別名Executing Finite-Length Tasks
・用途:処理の途中でアプリをバックグラウンドにされてしまった時の対処
主にユーザー起動のリクエストが当てはまる
フォアグラウンドで終わらない処理をできるだけ続けたい場合に使う
・バックグラウンドタスクを開始するのではなく、フォアグラウンド処理を継続可能にさせる。
・ユーザーにアプリをkillされると実行が止まる
・実行可能時間:
10分間(〜iOS6)
最長3分間(iOS7〜)
iPhone11Pro iOS13では30sec(環境によって変わる)
・あらかじめ延長時間が決まっている場合に使える
(終了時にendBackgroundTaskを呼び出す必要があるため)
バックグラウンド処理の完了後に再度バックグラウンドを呼んで
無限に呼んでも実行時間は延長されない。
・実装:
・beginBackgroundTaskWithExpirationHandlerで追加実行時間をリクエストする
・endBackgroundTaskで途中終了した場合の処理を書く
■Remote Push Notification(-i0S6) /
Background Notification (Silent Push) (iOS7+)
・用途:不定期にコンテンツを受け取る
・Remote Push Notificationの後継
・サーバー経由で通知を送信して実行
・通知の許諾の必要がない
・実行可能時間: 30秒
・Foreground時は必ず実行(即時で実行されないことも多い)
・バッテリー・通信状況によって実行される
・実装:
・Background modes : Remote notifications
・通知を受け取った際に起動する、didReceiveRemoteNotificationに処理を実装しておく
■Background Transfer (Background URLSession) (iOS7+)
・用途:大きなサイズの画像や動画をアップロードするときにユーザを待たせないために実行
アプリを閉じてもアップロードできる様にするアプリがサスペンドしたり終了した後でも、
ネットワークリクエスト(ダウンロードやアップロード)をバックグラウンドで継続させることができる
・BackgroundURLSession(バックグラウンドで通信できるクラス)を用いる
・HTTP/Sでのみ通信が可能
・大きなファイル向けの通信
・アプリと別プロセスでOSが実行
・実行可能時間: 制限時間なし
・Background Fetch, Silent Push と組み合わせることも可能
SilentPushで端末を起こす → 大容量のファイルをBackgroudTransferで同期
→ 完了したらLocalNotificationで通知する
・Object Body のサイズは、100 MB まで
・実装:(ダウンロードの場合)
・NSURLSessionConfiguration の作成
・NSURLSession の作成
・NSURLSessionDownloadTask の作成
・作成したタスクをresume する(通信を開始する)
・ダウンロードが完了したデータを取り出す
タスクが終了した際に呼び出される以下に取得後の処理を実装する
バックグラウンドでセッションが完了した
application:handleEventsForBackgroundURLSession:completionHandler: (UIApplicationDelegate)
ダウンロード完了
URLSession:downloadTask:didFinishDownloadingToURL: (NSURLSessionDownloadDelegate)
URLSession:task:didCompleteWithError: (NSURLSessionTaskDelegate)
■Background Fetch(iOS7+) /
App Reflesh Tasks (iOS13+)
・用途:ニュース系天気系アプリ等、情報の事前取得
・App Reflesh Tasks は BackgroundFetch(iOS7+)の後継
・OSの判断で定期的に実行
・ユーザーの1日の行動パターンを分析して、適切なタイミングで実行する
・実行可能時間: 30秒まで
・実行間隔を指定できる
・一日を通してアプリを最新にできる
・実装:
・Background modes : Background fetch
・setMinimumBackgroundFetchIntervalで呼び出しの最短間隔を設定
・application:performFetchWithCompletionHandlerで処理を実装しておく
■Processing Tasks (iOS13+)
・用途:天気系アプリ等、情報の事前取得
App Reflesh Tasksでは対応できない重たい処理を行いたい場合
・実行条件を設定ができる
・Wifi接続あり
・充電中
・CPUMonitorをOFFにできる
バックグラウンドでCPUを使い過ぎているAppを自動でKILLすることができる
・デバイスがアイドル状態でユーザーが使用を開始すると実行中のバックグラウンドタスクを終了する
・実行可能時間: 数分間に及ぶ実行も可能
・実装:
・Background modes : Background processing
・Info.plistにIdentifierを登録
・BackgroundTasksをimport
・didFinishLaunchWithOptionsに処理を実装
■Bluetoothのバックグラウンド
Centralとしての通信をバックグラウンドで継続
・用途:Bluetoothアクセサリとの通信
behinTBackgroundTaskをTimerで呼び続けるとずっととり続けるらしい。
http://harumi.sakura.ne.jp/wordpress/2019/05/23/ios%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%81%A7%E9%95%B7%E6%99%82%E9%96%93ble%E9%80%9A%E4%BF%A1%E7%B6%9A%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/
アドバタイズ情報の取得可能:非ロック状態、ロック状態(画面OFF)、ロック状態(画面ON)
アドバタイズ情報の取得不可:タスクマネージャからOFF(アプリ切る)
・アドバタイズ取得量
フォアグラウンド :100% (2分後に30%に減少)
非ロック状態アドバタイズ情報の取得 :30%に減少
ロック状態(画面OFF):15%に減少
ロック状態(画面ON) :30%に減少
・実装
Background modes : Use Bluetooth LE accesoriesをチェック
アドバタイズをスキャンする際には、サービスUUIDを指定してスキャンする
import CoreBluetooth
・・・
let serviceUUID: String = “0000” //ビーコンの16Bit UUID
・・・
// UUIDを指定してスキャン
let serviceUUIDs: [CBUUID] =
[ CBUUID, CBUUID]
self.centralManager.scanForPeripherals(withServices: servicesUUIDs,
options: [CBCentralManagerScanOptionAllowDuplicateKey:false])
■バックグラウンドオーディオ再生
Background modes : Audio,AirPlay,and Picture in Picture
??バックグラウンドの音源データをフォアグラウンドアプリが取得することはできるか
→できなさそう
■位置情報の取得
Background modes : Location updates
・用途:すれ違い
??どの程度の距離ですれ違いができるのか?
■通話, VoIP用着信時のプッシュ通知
Background modes : Voice over IP
■外部アクセサリ(Bluetooth機器など)と通信
Background modes : External accessory communication
■Bluetoothのバックグラウンド
Peripheralとして通信を行いたい場合
Background modes : Acts as a Bluetooth LE accessory
Background選定の制約
・バッテリー消費の考慮
・パフォーマンス メインアプリとのバランス
・プライバシー ユーザーに明示
・制限時間
・実行されない時もある
・ユーザー許諾が必要