*

iOSでバックグラウンドタスク(BackgroundTask)

公開日: : 最終更新日:2014/07/11 iOS ,

Badge

iOSでは何もしなければアプリケーションがバックグラウンドに移行するとすぐにRunLoopやワーカースレッドが停止し、サスペンド状態に移行します。
バックグランドに移行する際にデータの保存など処理をしたい場合は、applicationDidEnterBackgroundメソッドで5秒以内の処理が許されています。

このiOSの独自仕様についてはApp States and Multitaskingに詳細があります。

バックグラウンドでさらに処理を継続するにはsetKeepAliveTimeout(VoIP向け)やBackground Fetch(iOS7から)を使う方法などがあります。
これらは定期的(10分以上の間隔)に数秒の処理を行うのに適しています。
数分間処理を継続したい場合はbeginBackgroundTaskWithExpirationHandlerを使います。

beginBackgroundTaskWithExpirationHandlerについて

beginBackgroundTaskWithExpirationHandlerを呼びだすと一定時間(iOS7では180秒)の処理が許されます。この時間はbackgroundTimeRemainingで取得することができます。backgroundTimeRemainingがのこり5秒ぐらいになるとexpirationHandlerが呼び出されます。
アプリケーションはexpirationHandlerやタスクが終了したタイミングでendBackgroundTaskを実行し、サスペンド状態に移行させる必要があります。
このexpirationHandlerはメインスレッドで実行されるので、長い処理は禁物です。
また実行途中でendBackgroundTaskによってサスペンドされたスレッドは、アプリケーションがフォアグラウンドに戻ったタイミングで再び再開されます。

バックグラウンドでバッジを更新しつづけるサンプル

さらに処理時間をのばしたい場合(VoIPアプリの場合)、iOS6ではbackgroundTimeRemainingが600秒だったので、setKeepAliveTimeoutと組み合わせることで延々と処理を継続することが可能でした。iOS7では180秒しか継続できないので、途切れてしまうことになります。

以下の方法は現在は使えないようです(2014/7/11)


とりあえずiOS7ではexpirationHandlerがコールされてもendBackgroundTaskを実行しなければタスクを継続するようです。

試してみたサンプルです。

処理はMHJobクラスにまとめています。使い方はこんな感じです。

    MHJob *job = [[MHJob alloc] init];
    job.isBackgroundTask = YES;
    job.expirationBlock = ^(MHJob *job){
        //[job cancel];//jobã中止ãã

    };
    job.completionBlock = ^(BOOL success) {
        NSLog(@"completion(%d)!", success);
    };
    [job run:^(MHJob *job){
        int count = 0;
        while (1) {
            //NSLog(@"remain:%4.1f", [[UIApplication sharedApplication] backgroundTimeRemaining]);
            [[UIApplication sharedApplication] setApplicationIconBadgeNumber:count];
            if (job.state == MHJobState_Canceling) {
                return;
            }
            [job wait:1];
            count += 1;
        }
    }];

Sponsored Link

関連記事

no image

UIAlertのTextFieldでキーボードが表示されない(iOS7)

TextField付きのUIAlertViewでたまにキーボードが表示されないことがあり、 ながら

記事を読む

monster_kolion.png

【イーモン】11月8日デザフェス出展!

デザインフェスタに出展します! デザフェス出展者ページ 英語学習アプリ【イーモン】のキャラ

記事を読む

AppIcon60x60@2x.png

ホーム画面にショートカットアイコン(スキームアイコン)を作成する

iOSのSafariには共有メニューにがあり、表示させているページへのショートカットアイコン

記事を読む

emon.png

【イーモン】v1.5リリース

やっとv1.5リリースできました。 継続的にプレイを続けてもらえるように ゲームのバランス

記事を読む

icloud.jpeg

アプリからiCloudを使うための準備

iOSではアプリがiCloud上にデータを保存するための仕組みが提供されている。 iCloudは

記事を読む

checkbox.png

確認ダイアログ付きチェックボックス(Checkbox)

図のようなチェックボックスとアラートの組合せを実装しようとした際にiOSには外観などを簡単にカスタ

記事を読む

4300d3f14f7f754c5b2cd5b720efb39f.png

cocos2dxでマルチスレッド

cocos2dxでマルチスレッドをいじったときのメモ あらかじめautoreleaseに

記事を読む

sample.png

cocos2dxでhttp通信のprogressを表示する

cocos2d-xでは、ダウンロードの進捗を取得するインターフェイスが用意されていないような

記事を読む

ace.png

イーモン v2.2審査

v2.2を審査に出しました! イーモンxエースクラウンの特別クエストが追加されます!

記事を読む

internet_share.png

インターネット共有のステータスバーを表示させない

私の作っているアプリではcocos2d-xでCCEAGLViewを表示させるUIViewCo

記事を読む

Sponsored Link

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Sponsored Link

  • 発音辞書イーモン
  • English Monsters
  • sLog(時間管理アプリ)
  • 生粋のC++プログラマーです。 最近は、Objective-Cやxcode、cocos2d-xなどを学びながらiPhoneアプリを開発しています。

Google+ Google
PAGE TOP ↑