概要
- アプリがバックグラウンドにある状態で一定期間毎に特定の処理を実行できる
- 実行される間隔に関しては、アプリの利用状況などをみて決定される
- iOS7から使用可能
具体的な利用シーン
- 定期的にサーバーと通信し、未読のコンテンツが会った場合にlocal pushにて通知を行う
- リアルタイムではないが、擬似的なpush通知がremote pushを利用しなくても実装可能
実装方法
Background Fetchの有効化
はじめに、アプリでBackground Fetchが利用できるように設定を追加していきます。手順は以下の通り。
- ProjectのCapabilitiesを選択
- Background Modesを「On」に変更
- 「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のデバッグについて書いていきます。今回は一番簡単な方法だけ紹介します。
- iOSシュミレータにてアプリを起動
- xcodeに戻り、ナビゲーションの「Debug」をクリック
- Debugの中に「Simulate Backgroun Fetch」という項目があるので、それをクリック
これで強制的に- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandlerのメソッドで定義した処理を実行することができます。