はい。別のアプリへの切り替えなど、ユーザーのマルチタスクアクションにアプリを応答させたい場合は、対処する必要があります。
- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application
アプリが非常に長い時間のかかる操作(大きなファイルのダウンロードなど)を行っており、ユーザーがアプリをバックグラウンドに入れた場合はどうなりますか?ユーザーがアプリに戻ったときに、その操作は自動的に一時停止および再開されますか?
アプリがバックグラウンドに入ったとき、またはフォアグラウンドで再開したときに、舞台裏で何が起こるのでしょうか?
ユーザーがアプリをバックグラウンドに移動させたときに、アプリの実行がメソッドの途中にある場合はどうなりますか?
たとえば、私のアプリは
for (int i = 1 to 10000K) {
do some calculation;
}
I == 500Kの場合、ユーザーは別のアプリに切り替えます。アプリのforループはどうなりますか?
iOSアプリプログラミングガイド から:
アプリのデリゲートの
applicationDidEnterBackground:
メソッドには、タスクを完了して戻るまでに約5秒かかります。実際には、このメソッドはできるだけ早く戻る必要があります。時間がなくなる前にメソッドが返らない場合、アプリは強制終了され、メモリから削除されます。タスクの実行にさらに時間が必要な場合は、beginBackgroundTaskWithExpirationHandler:
メソッドを呼び出してバックグラウンド実行時間を要求し、セカンダリスレッドで長時間実行されるタスクを開始します。バックグラウンドタスクを開始するかどうかに関係なく、applicationDidEnterBackground:
メソッドは5秒以内に終了する必要があります。
上記で説明した長時間実行される操作がメインスレッドで実行され、アプリケーションがバックグラウンドに戻ってから5秒以上かかる場合、アプリケーションは強制終了されます。メインスレッドはブロックされ、-applicationDidEnterBackground:
から時間内に戻る機会がなくなります。
タスクがバックグラウンドスレッドで実行されている場合(実行に時間がかかる場合は実際に実行されるはずです)、アプリケーションが-applicationDidEnterBackground:
から戻ると、そのスレッドは一時停止しているように見えます( この答え )。アプリケーションがフォアグラウンドに戻されると再開されます。
ただし、後者の場合、バックグラウンドへの途中でクリーンアップすることで、バックグラウンドにあるときにいつでもアプリケーションを終了できるように準備する必要があります。
時間を消費する可能性のある操作を実行していて、それを強制終了したくない場合は、UIBackground Task iで実行することで操作の時間を延長できます。
{
UIBackgroundTaskIdentifier taskId = 0;
taskId = [application beginBackgroundTaskWithExpirationHandler:^{
taskId = UIBackgroundTaskInvalid;
}];
// Execute long process. This process will have 10 mins even if your app goes in background mode.
}
「ハンドラー」と呼ばれるブロック引数は、バックグラウンドタスクの有効期限が切れた(10分)ときに発生します。 ドキュメント へのリンクはこちら
上記のように、アプリがバックグラウンドで実行され、Appleは実行内容に応じて許可または拒否できる場合があります。
さらに重要なのは、これらのカテゴリのいずれかに当てはまる場合、アプリのリフレッシュレートはAppleアルゴリズムによって決定されます。これは1つの変数にすぎませんが、バックグラウンド時間の割り当てはアプリごとに異なり、管理下にないという考えが得られます。