12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iOS7から使用できるBackground Fetchについて

Last updated at Posted at 2015-08-03

概要

  • アプリがバックグラウンドにある状態で一定期間毎に特定の処理を実行できる
    • 実行される間隔に関しては、アプリの利用状況などをみて決定される
  • iOS7から使用可能

具体的な利用シーン

  • 定期的にサーバーと通信し、未読のコンテンツが会った場合にlocal pushにて通知を行う
    • リアルタイムではないが、擬似的なpush通知がremote pushを利用しなくても実装可能

実装方法

Background Fetchの有効化

はじめに、アプリでBackground Fetchが利用できるように設定を追加していきます。手順は以下の通り。

  1. ProjectのCapabilitiesを選択
  2. Background Modesを「On」に変更
  3. 「On」にするとModesが表示されるので、Background fetchの項目にチェックを入れる

メソッドの設定

Background Fetchを利用するには、以下の2つのメソッドが必要です。

// fetchする間隔の設定。
- (void)setMinimumBackgroundFetchInterval:(NSTimeInterval)minimumBackgroundFetchInterval

// 実際にbackground fetchにて実行する処理を記述する
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

- (void)setMinimumBackgroundFetchInterval:(NSTimeInterval)minimumBackgroundFetchInterval

これは、どのくらいの間隔でBackground Fetchを実行したいかを設定するためのメソッドです、AppDelegate.mのdidFinishLaunchingWithOptionsで呼んでください。
以下サンプルです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
	// このような感じで呼ぶ。今回は最小間隔を指定
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    
    return YES;
}

Background Fetchでは具体的な期間を明示することができません。最小間隔を指定したとしても、実際に呼ばれる間隔は、今までどのくらいアプリを使用しているか、どのくらいの頻度で開いているか等のデータに基づいて決定されます。

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

このメソッドでは、実際にBackground Fetchが実行された際に行う処理について記載します。
必ずcompletionHanlderを書かなくてはならないので、その点に関しては注意してください。
以下サンプルです。

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
	// 処理が成功したかどうかをBOOL型でsuccessという変数で定義していると仮定
    if (success) {
        completionHandler(UIBackgroundFetchResultNewData);
    } else {
    	completionHandler(UIBackgroundFetchResultFailed);
    }
}

また、completionHandlerで設定できるのは以下3つの項目となります。

// データDLに成功
UIBackgroundFetchResultNewData
// DLするデータがなかった
UIBackgroundFetchResultNoData
// DLに失敗した
UIBackgroundFetchResultFailed => データのダウンロードに失敗した 

デバッグ

最後にBackground Fetchのデバッグについて書いていきます。今回は一番簡単な方法だけ紹介します。

  1. iOSシュミレータにてアプリを起動
  2. xcodeに戻り、ナビゲーションの「Debug」をクリック
  3. Debugの中に「Simulate Backgroun Fetch」という項目があるので、それをクリック

これで強制的に- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandlerのメソッドで定義した処理を実行することができます。

参考

12
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?