*

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

関連記事

IMG_2206.JPG

【イーモン】プロモーションムービー

デザフェスで使ったプロモーションムービーです! 当日は、AppleTVをつかってiP

記事を読む

gles1.png

OpenGLES 1.1でテクスチャ表示

最近、OpenGLESベースのゲームエンジンであるcocos2dでゲームを作りはじめました(画像

記事を読む

kii1.png

KiiCloudでファイルアップロード

KiiCloudではサーバーと通信が必要な処理は、同期タイプ(Synchronous)と非同タイプ(

記事を読む

tmp.png

最近のAppStore審査【iOS8】

紹介動画でリジェクト!?(App Preview) AppStoreのアプリ紹介にに機能や

記事を読む

products-ico5.png

cocos2d-x v2.2からv3.3への移行

最近、イーモンの更新でiTunesにバイナリをアップロードしたら、 2015年2月から64

記事を読む

icloud.jpeg

iCloudその1:NSMetadataQueryDidUpdateNotification

iCloudのファイル管理についてよくわかってないので、以下の点について実際に確認しながらまとめてい

記事を読む

5017d1a195d95dfed9f60e9fd5d82c13.png

苦手な英語の発音を真面目に考えてみた

最近、英語の発音に真面目に取り組んでます。 これまで読み書きが中心で、リスニングやスピーキン

記事を読む

icloud.jpeg

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

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

記事を読む

statusbar2.png

ステータスバーとナビゲーションバーを含まない領域を取得する

iOS7からUIViewControllerのview.boundsはステータスバーやナビゲーシ

記事を読む

ace.png

イーモンv2.3申請

やっとv2.2がリリースされ、本日v2.3をAppleに申請しました。 v2.3の主

記事を読む

Sponsored Link

Message

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

Sponsored Link

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

Google+ Google
PAGE TOP ↑