iOS 7でバックグラウンド フェッチを有効化する。

iOS 7からフェッチ処理をバックグラウンドで定期的に実行出来るようになったそうなので、試してみました。

実行するために必要なステップは以下の3ステップ

  • Background fetchの有効化
  • 実行する間隔の設定
  • 実行する処理の処理

Background fetchの有効化

左サイドバーの Project をクリックし、 TARGETSCapabilities にある Background Modes をONにします。

Backgrounds Modesには、バックグラウンドで処理させる機能の一覧があります。

この中にあるBackground fetchにチェックを入れるだけで、有効化は完了。

Background fetchの有効化

実行する間隔の設定

Background fetchを実行するためには、有効化するだけではなく、最短実行間隔の設定も必要。

didFinishLaunchingWithOptions:で間隔を設定します。

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
  [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
  retrun YES;
}

setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum を設定するとOSデフォルトの最短時間が設定され、NSTimeIntervalにすると、任意の時間が設定出来るようです。

しかし、あくまでも最短の実行間隔を設定するだけで、実際に実行されるかどうかはアプリの利用状況をOSが判別して決定されるようです。

また、UIApplicationBackgroundFetchIntervalNeverを設定すると、有効化していてもフェッチ処理は実行されなくなります。

実行する処理の設定

実行する間隔を設定したら、performFetchWithCompletionHandler:に実際の処理を記述します。

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
  NSLog(@"Fetch!!!!!");
  completionHandler(UIBackgroundFetchResultNewData);
}

フェッチ処理後には、completionHandlerを絶対に呼ばなければならないのですが、フェッチ処理の結果によって渡す引数が変わります。

成功した時は、UIBackgroundFetchResultNewData

フェッチ取得するデータが無かった時は、UIBackgroundFetchResultNoData

失敗したときは、UIBackgroundFetchResultFailedを引数に渡します。

フェッチ処理のデバッグ

バッググラウンドフェッチのデバッグをする時、そのままデバッグしていてもフェッチ処理は実行されず、 DebugSimulate Background Fetch をクリックする度にフェッチ処理を実行します。

フェッチ処理のデバッグ1

 

また、バックグラウンドフェッチ処理のデバッグをする時には、 ProductSchemeEdit Scheme... の設定を開いて、 Launch due to a background fetch event にチェックを入れると、デバッグ時にアプリをバックグラウンド起動するようになります。

フェッチ処理のデバッグ1

 

フェッチ処理のデバッグ2

 

以上。これでバックグラウンド処理出来るようになったことだし、何を処理させようか。

 

参考:

Background Fetch を試してみた

[iOS 7] [MultiTasking] バックグラウンドで定期的にフェッチ処理を実行する

Objective-C