まず第一に、バックグラウンドで実行されるのはvoip、音声、位置情報アプリのみであり、音声が再生されている間、または位置情報サービスを使用している間のみ実行されることを知っています。
私が知りたいのは、バッテリーの寿命に影響を与えずに、バックグラウンドでアプリを完全に動作させ続ける方法があるかどうかです。
このようにして、私のアプリのユーザーは、設定から選択して、いつでも好きな時間だけアプリを存続させることができます。たとえば、アプリの実行が必要な何かを待っている場合、メッセージを受信した後、キープアライブ機能をオフにすることができます。
これが可能かどうかはわかりませんが、そう言うような記事を読んでいましたが、残念ながら彼らは=(
更新: このチュートリアル で、AcrobitsにはApple Storeに「アプリケーションを強制的にバックグラウンドで稼働させて目覚めさせることができます」という2つのアプリがあることがわかりました。これを行う方法はありますか?
アプリケーションがバックグラウンドに移動するように指示された後、指定された期間だけタスクを実行できます。これより長く実行すると、アプリケーションが終了します。これを行う方法については、「iOSアプリケーションプログラミングガイド」の「 バックグラウンドで長時間実行されるタスクを完了する 」セクションを参照してください。
他の人は、バックグラウンドプロセスとして生き続ける手段としてバックグラウンドでオーディオを再生することに便乗しましたが、Appleは、オーディオ再生が正当な機能である場合にのみそのようなアプリケーションを受け入れます。Appleのアイテム2.16公開されたレビューガイドラインには次のように記載されています。
マルチタスクアプリは、VoIP、音声再生、場所、タスク完了、ローカル通知などの目的にのみバックグラウンドサービスを使用できます。
IoS 7以降、アプリをバックグラウンドで実行する新しい方法があります。 Appleは、アプリがデータを絶えずダウンロードして処理する必要があることを認識します。
- ミュージックプレーヤーアプリなど、バックグラウンドでユーザーに音声コンテンツを再生するアプリ
- バックグラウンドでオーディオコンテンツを記録するアプリ。
- ナビゲーションアプリなど、ユーザーに常に現在地を通知するアプリ
- Voice over Internet Protocol(VoIP)をサポートするアプリ
- 新しいコンテンツを定期的にダウンロードして処理する必要があるアプリ
- 外部アクセサリから定期的な更新を受け取るアプリ
Xコード5+を使用して、Info.plistでアプリのサポートされているバックグラウンドタスクを宣言できます。例えばUIBackgroundModesキーをアプリのInfo.plistファイルに追加し、「fetch」の値を配列に追加すると、アプリはネットワークから少量のコンテンツを定期的にダウンロードして処理できます。 XCode 5のアプリケーションプロパティの「機能」タブ(スナップショットの添付)でも同じことができます。
バックグラウンドタスクが10分以上実行されると、タスクは中断され、beginBackgroundTaskWithExpirationHandlerで指定されたコードブロックが呼び出されてタスクがクリーンアップされます。バックグラウンドの残り時間は、[[UIApplication sharedApplication] backgroundTimeRemaining]で確認できます。アプリがフォアグラウンドにあるとき、最初はbackgroundTimeRemainingが大きな値に設定されます。アプリがバックグラウンドに移行すると、backgroundTimeRemainingの値が599.XXX(10分)から減少することがわかります。 backgroundTimeRemainingがゼロになると、バックグラウンドタスクは中断されます。
//1)Creating iOS Background Task
__block UIBackgroundTaskIdentifier background_task;
background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
//This code block is execute when the application’s
//remaining background time reaches ZERO.
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//### background task starts
//#### background task ends
});
//2)Making background task Asynchronous
if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
{
NSLog(@"Multitasking Supported");
__block UIBackgroundTaskIdentifier background_task;
background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
//Clean up code. Tell the system that we are done.
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
}];
**//Putting All together**
//To make the code block asynchronous
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//### background task starts
NSLog(@"Running in the background\n");
while(TRUE)
{
NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
[NSThread sleepForTimeInterval:1]; //wait for 1 sec
}
//#### background task ends
//Clean up code. Tell the system that we are done.
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
});
}
else
{
NSLog(@"Multitasking Not Supported");
}
ストックiOSデバイスで実行するには、アプリをオーディオプレーヤー/レコーダーまたはVOIPアプリ、アプリストアに送信するための正当なアプリ、または自分専用の偽のアプリにします。
これでさえ、アプリが何であれ「完全に機能する」わけではありませんが、限られたAPIに制限されます。
実行内容に依存します。アプリが大量のメモリを使用している場合、または必要のない関数/クラスを呼び出す場合、SpringBoardはそれを終了することがあります。ただし、Appleの7つのバックグラウンドの使用に従っていないため、Appleによって拒否される可能性が高いでしょう。
バックグラウンドメソッドで実行されるアプリのAppdelegateにコードを実装する必要があるかもしれません。また、アプリケーションクラスについてはdeveloper.Apple.comサイトを参照してください Here はアプリを実行するためのリンクですバックグラウンド