iOSのBackground Fetchの動作の特徴について
iOSのBackground Fetchの動作について
iOSは利用者が操作中のアプリ以外の動作を厳しく制限している。
セキュリティ的には安全でいいのだが、アプリを企画するほうからすると、著しい制限と感じることがある。
代替策としてAppleが用意したのがBackground Fetch (バックグラウンド・フェッチ) という機能だ。
Appleクラウドから数分から数時間という果てしなく不定期にアプリが起動されるというものだ。
いろいろ試したみたところ面白い特徴があったので、ここにまとめてみたい。
・Background Fetch デリゲートメソッドは並列実行される(コンカレントキューのため)
例えば、クラウドにデータを保存する手続きをBackground Fetch で行う場合を考えてみる。
Background Fetchエントリポイント
UIApplication#application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
上掲のデリゲートメソッド(エントリーポイント)はコンカレントキューで並列実行される。
そのため、前回のBackground Fetch実行が完了していなくても、その数秒後に呼び出された場合には同時実行されることになることに注意したい。
completionHandler() を実行するしないに関わらず、動作は同じだ。
・Background Fetch で実行するスレッドからサブスレッドを生成しないほうがよい
Background Fetchデリゲートメソッドに記述するコードの中でスレッドを生成(dispatch_async())した場合、そのスレッドはメインスレッドが完了してもサスペンド状態にはなるもののメモリ中の残るのだ。
次にBackground Fetch 呼び出しされたときに、前回生成したスレッドはsuspend(サスペンド)からresume(復帰、リジューム)して前回サスペンドした地点から継続実行される。
このBackground Fetch の動作仕様によって、クラウドへ重複書き込みしてしまうリスクがあるのだ。
これについては、dispatch_async() 以外にも、ブロックスやハンドラでも同様だ。(これらもサブスレッドで動作するため)
Background Fetch デリゲートメソッド(エントリーポイント)で、サブスレッドを生成したりブロックスのような別スレッド内でネットワーク通信を実行すると、NSURLConnection接続がタイムアウトエラーやSSL確立エラーになることが頻発し通信が不安定になる。
よって、これまで述べたような仕様を理解したうえでスレッド手続きを行うことが必要だ。
・Background Fetch の実行可能な時間が30秒だという神話が流布されているが実際には10秒と考えたほうがよい
Appleの明文化されていない仕様はコロコロ変わることが知られているが、Background Fetch実行時間についてもドキュメントに明文化されていない。(なるべく早く完了することという記載のみだ。)
次のログが示しているように前回のBackground Fetch実行手続きが異常終了した場合には実行時間(permittedBackgroundDuration)が10秒になる場合もある。
MM DD HH:MM:SS (Device ID) assertiond[63] : has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x000000000> id: (Process ID) name: Deliver Message process: <BKNewProcess: 0x000000000; (App ID); pid: 521; hostpid: -1> permittedBackgroundDuration: 10.000000 reason: suspend owner pid:53 preventSuspend preventThrottleDownCPU preventThrottleDownUI preventSuspendOnSleep
)}
Background Fetchでデリゲートメソッドが呼び出されてから、スレッドがサスペンドされるまでの時間は余裕をみて10秒と考えてアプリを企画したほうがよい。
30秒なんていう長い時間を要して行う手続き自体はまずないし、そんな時間をかけてはならない。ドキュメントに書いてある通り即座に完了すべきだ。
・Background Fetch で行える手続きについて
Background Fetchで呼び出されるデリゲートメソッドでは、画面の描画以外のことはすべてできると考えて良い。
View描画関連、OpenGL描画関連は行うことができないのだ。
・Background Fetch でAppleのクラウドから呼び出される間隔について
Background Fetch でアプリが呼び出される間隔は様々だ。
最短では、1秒間に連続して2回呼び出されることもあるし、20時間間隔が開くことさえある。
24時間以上間隔が開くことはないので、1秒以下から23時間という間隔を想定して企画する必要がある。
少なくとも1日に1回はAppleクラウドからBackground Fetch呼び出しされることは保証されているということだ。
ただし、ホームボタンダブルクリックで表示されるタスク一覧から削除したアプリは、Background Fetch呼び出しされない。
2023年12月 | ||||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
  |   |   |   |   | 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 | 26 | 27 | 28 | 29 | 30 |
31 |   |   |   |   |   |   |
iOS
web
アプリの著作権
ブロックチェーン/暗号技術
新しい社会
禅・大乗仏教
日本のなりたち