1. ホーム
  2. ios

[解決済み] beginBackgroundTaskWithExpirationHandlerの正しい使い方

2022-11-13 11:20:15

質問

をいつどのように使うのか、少し混乱しています。 beginBackgroundTaskWithExpirationHandler .

Apple は例として、これを applicationDidEnterBackground デリゲートで、重要なタスク(通常はネットワークトランザクション)を完了するためのより多くの時間を得るために使用する例を示しています。

私のアプリを見ると、ネットワーク関連のものはほとんど重要なもののようで、1つが開始されたら、ユーザーがホームボタンを押した場合にそれを完了させたいと考えています。

したがって、すべてのネットワークトランザクション (大きなデータの塊をダウンロードすることについて話しているわけではなく、ほとんどはいくつかの短い xml) を beginBackgroundTaskWithExpirationHandler でラップすることは、安全な方法なのでしょうか?

どのように解決するのですか?

ネットワークトランザクションをバックグラウンドで継続させたい場合は、バックグラウンドタスクでラップする必要があります。また endBackgroundTask を呼び出すことも非常に重要です。そうしないと、割り当てられた時間が経過した後にアプリが終了してしまいます。

私のはこんな感じです。

- (void) doUpdate 
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [self beginBackgroundUpdateTask];

        NSURLResponse * response = nil;
        NSError  * error = nil;
        NSData * responseData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];

        // Do something with the result

        [self endBackgroundUpdateTask];
    });
}
- (void) beginBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void) endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}

私の場合は UIBackgroundTaskIdentifier プロパティがあります。


Swiftで同等のコード

func doUpdate () {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {

        let taskID = beginBackgroundUpdateTask()

        var response: URLResponse?, error: NSError?, request: NSURLRequest?

        let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)

        // Do something with the result

        endBackgroundUpdateTask(taskID)

        })
}

func beginBackgroundUpdateTask() -> UIBackgroundTaskIdentifier {
    return UIApplication.shared.beginBackgroundTask(expirationHandler: ({}))
}

func endBackgroundUpdateTask(taskID: UIBackgroundTaskIdentifier) {
    UIApplication.shared.endBackgroundTask(taskID)
}