私のアプリが最初にダウンロードされるとき、ユーザーは200MB(上限)のような大きなファイルをダウンロードする必要があります。このファイルがダウンロードされるまで、ユーザーがアプリを開いたままにしておくことは絶対に期待できません。そのため、彼/彼女はアプリを閉じる可能性があり、アプリはバックグラウンドになります。
このシナリオでファイルを引き続きダウンロードするにはどうすればよいですか?これはiOSでも可能ですか?
ダウンロードを開始すると、バックグラウンドタスクを開始できます。
バックグラウンドに移行しているアプリは、重要な土壇場のタスクを完了するために追加の時間を要求する場合があります。
ただし、このようなタスクは、システムによる未定義の実行時間に制限されます。ただし、この場合、200Mbのファイルのダウンロードはタスクが大きすぎる可能性があります。
以下を- (void)applicationDidEnterBackground:(UIApplication *)application
に追加します
UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
}];
そして、あなたは行ってもいいです...私はこれを私の公開されたダウンロードマネージャーアプリの1つに持っています
これは問題なく動作します。 Appleは、10分間のバックグラウンドタスクのみを有効にするので、どれだけの時間があるかを確認することもできます。
NSTimeInterval ti = [[UIApplication sharedApplication]backgroundTimeRemaining];
NSLog(@"backgroundTimeRemaining: %f", ti); // just for debug
IOS 7.0以降で導入されたNSURLSessionを使用して、アプリが一時停止されている場合でもファイルのアップロード/ダウンロードを続行できます。
NSURLSessionクラスと関連クラスは、コンテンツをダウンロードするためのAPIを提供します。このAPIは、認証をサポートするためのデリゲートメソッドの豊富なセットを提供し、アプリが実行されていないとき、またはiOSでアプリが中断されているときに、アプリがバックグラウンドダウンロードを実行できるようにします。
そして
バックグラウンドセッションを使用すると、アプリの実行中にバックグラウンドでコンテンツのアップロードとダウンロードを実行できます。 NSURLSessionConfigurationクラスのbackgroundSessionConfiguration:メソッドを呼び出すことで、バックグラウンドセッション構成を作成できます。
この link でNSURLSessionを使用するためのクールなチュートリアル。
私のアプリの1つで、大量のデータをロードしていました。データがダウンロードされるまで、ユーザーがアプリをフォアグラウンドに保つことは期待できません。アプリをバックグラウンドで実行しているときに、次のコードを使用してデータをダウンロードしています。その正しく動作する:-)
次の手順を実行してください:
1)ViewControllerのヘッダーファイルで次の行を使用します
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
.mファイルに合成します。
2)ViewDidLoadで、次のようなUIBackgroundTaskIdentifierを割り当てます。
self.backgroundTask = UIBackgroundTaskInvalid;
3)次のコード行を使用します。ここでは、beginBackgroundTaskWithExpirationHandler:ブロック内のgetDataFromServerメソッドを保持しています。
self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
}];
/* Here your downloading Code, let say getDataFromServer method */
[self getDataFromServer]; // Its dummy method
/* Your downloading Code End Here */
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
});
4)バックグラウンドでデータをダウンロードする残り時間を確認する場合は、appDelegateのapplicationDidEnterBackground:(UIApplication *)application delegateメソッドに次の行を含めます。
NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining);
AFNetworkingを使用すると、バックグラウンドで重い操作を実行できます。
AFNetworkingライブラリは、NSURLConnectionとNSOperationQueueの優れた組み合わせです。このライブラリは、他のアプリケーションに影響を与えないバックグラウンドでの非同期ダウンロードに使用されます。
AFNetworkingを使用すると、ExpirationHandleを使用してダウンロードを処理できます。つまり、ダウンロード中に接続が失われた場合、再度接続されます。
ライブラリソースfor AFNetworking
参照ソースAFNetworkingはバックグラウンドで動作します
Apple参照リンクApple
バックグラウンド実行とマルチタスク Apple
#pragma mark - View Loading handling
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
}
#pragma mark - Background handling when application goes background
UIBackgroundTaskIdentifier background_task;
- (void)appDidEnterBackground:(NSNotification *)notification {
UIApplication *application = [UIApplication sharedApplication];
if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
{
NSLog(@"Multitasking Supported");
if (background_task == UIBackgroundTaskInvalid) {
background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
NSLog(@"Background task expiration\n");
//Clean up code. Tell the system that we are done.
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
}];
//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");
for(int cnt=0; cnt<10; cnt++) //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.
NSLog(@"here you can do something before it really enters background");
[NSThread sleepForTimeInterval:1]; //wait for 1 sec
[application endBackgroundTask: background_task];
background_task = UIBackgroundTaskInvalid;
});
}
else
{
NSLog(@"Multitasking Not Supported");
}
}
}
あなたはこれからもっと知ることができます slide 。
このスライドのスニペットから簡単で便利な変更を加えます。お役に立てれば。
NewsStand iOSアプリケーションを作成します。標準のiOSアプリケーションではありません。
Standart iOSアプリケーション:
NewsStandアプリケーションには、クローズ時またはバックグラウンドでダウンロードするための特別な時間特権があります。 24時間に1回、remoteContentReadyデリゲートコールに応答する特権があります。
NewsStandアプリケーションの構築は、標準のiOSアプリケーションの構築と同じです。 newStandアプリケーションとしてマークするだけです。
次に、remoteContentReady委任内にあるコードを実行する特権が与えられます。
RemoteContentReadyシグナルを受信するには、サーバーサイド(c#、php、bla bla)からシグナルを送信する必要があります。
すべてのiOSアプリに当てはまるわけではありません。 remoteNotificationシグナルのようなもの。これを行うには、WebサイトのSSL認定が必要な場合があります。
宜しくお願いします