0

私のアプリでは、メソッドでたくさんの画像をダウンロードしています。

私は使用しています

 downloadTask = [[UIApplication sharedApplication]
                   beginBackgroundTaskWithExpirationHandler:^{

                       [[UIApplication sharedApplication] endBackgroundTask:downloadTask]; 
                       downloadTask = UIBackgroundTaskInvalid;

                   }]; 

ホームボタンまたはスリープボタンを押すと、画像のダウンロードが続行されます。

UIAlertView 内の UIProgressView で進行状況を表示しています。パーセントが 100% の場合、alertView は無視され、viewController を別の場所に変更して、ダウンロードした画像を表示します。しかし、ダウンロードが終了した時点でアプリが本当にアクティブな場合にのみ、これが発生することを望みます。

アプリの状態と、画面をオフにしてダウンロードしている間を見てきました。

[UIApplication sharedApplication].applicationState

すべてのダウンロード中、状態は UIApplicationStateActive です

画面がオフまたはオンの状態でダウンロードが行われていることを確認するにはどうすればよいですか?

回答を受け入れた後に編集:

ホームボタンをタップするとアプリがUIApplicationStateBackgroundに入り、ウェイク/スリープをタップするとUIApplicationStateInactiveに入ります

正解のアプローチに従って、私のアプリはどちらの場合もダウンロードを続けます。

4

2 に答える 2

2

画面は 2 つの状態でオフになります (アプリが開かれていない場合を除く)。

  • 中断: この場合、アプリが再びアクティブになるまでダウンロードが続行されないため、心配する必要はありません。でこの状態になります
  • background : サスペンドに入る前の限られた時間この状態であり、この時点で画面は既にオフになっています。ここで、あなたが言ったことをすべて実行するかどうかを確認したい場合があります。この状態でもコードを実行できるからです。この状態では、アプリのステータスはUIApplicationStateBackgroundであるため、次のようなチェックを実行できます。

結果を得るには、アプリがバックグラウンドで実行されているかどうかを確認する必要があります。ちょうどこのような:

if([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {
  // Do stuff  
}

バックグラウンドにある場合は、画面がオフになっています。

更新:いくつかのテストの後、私が理解したのは、あなたが経験している動作はおそらくメインスレッドでのダウンロードの実行によるものであるということです.

(たとえば) グローバル キューでダウンロードを送信する必要があります。このようにして、アプリケーションは期待どおりにバックグラウンド状態に入ります。

....
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.bti];
    }];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self doBackgroundStuff];
});
....

このように、ダウンロード中にアプリをバックグラウンドにすると、アプリの状態がUIApplicationStateBackgroundになり、最初に書いたように確認できます。進行中に UI の更新を行っている場合は、それらをメイン スレッドに送り返すことを忘れないでください (ダウンロードが別のスレッドにあるため)。

于 2012-08-25T18:23:54.470 に答える
1

指定されたアプリケーション デリゲート メソッドapplicationDidEnterBackground:applicationWillEnterForeground:. 例:

- (void)applicationDidEnterBackground:(UIApplication *)application
    _applicationRunsInForeground = NO;
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    _applicationRunsInForeground = YES;
}

このフラグをアプリケーション デリゲート内に置きたくない場合は_applicationRunsInForeground、代わりにビュー コントローラー クラスでデリゲートの NSNotifications を確認できます (UIApplicationWillEnterForegroundNotificationおよびUIApplicationDidEnterBackgroundNotification)。

于 2012-08-25T13:13:49.697 に答える