[iOS 7] [MultiTasking] プッシュ通知をトリガーにコンテンツをダウンロードする

iOS 7からプッシュ通知をトリガーにバックグラウンドでコンテンツのダウンロードが実行することができるそうです。 この機能を利用すれば、ネットワークから定期的にコンテンツを取得する必要のあるアプリでは、サーバに変更があった際にプッシュ通知を送信し、iOS端末はバックグラウンドで新しいコンテンツがをダウンロードしたりできるようです。

プッシュ通知をトリガーにバックグラウンドでコンテンツのダウンロードを実行するために必要な手順は以下の通りです。

  1. プロジェクト設定でRemote notificationsを有効にする
  2. application:didReceiveRemoteNotification:fetchCompletionHandler:メソッドを実装する

1.プロジェクト設定でRemote notificationsを有効にする

プッシュ通知をトリガーにバックグラウンドでコンテンツのダウンロードを実行するには、まずプロジェクトにその旨を設定する必要があります。この設定はXcode上から簡単に変更できます。
Xcodeを開いたら、プロジェクトナビゲータよりプロジェクトをクリックします。

ios-background-fetch-1

プロジェクトの設定画面を開いたら、タブメニューよりCapabilitiesをタップします。

ios-background-fetch-2

すると、Background Modesの項目があるので、スイッチをONにします。

ios-background-fetch-3

バックグラウンドで動作させる機能の中からRemote notificationsにチェックを入れます。

ios7-apns-background-1

2.application:performFetchWithCompletionHandler:メソッドを実装する

あとは実際の処理を実行するだけです。処理はUIApplicationで定義されるapplication:didReceiveRemoteNotification:fetchCompletionHandler:に実装します。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
	// コンテンツのダウンロード処理など

	if (success) {
		if (hasData) {
			completionHandler(UIBackgroundFetchResultNewData);
		} else {
			completionHandler(UIBackgroundFetchResultNoData);
		}
	} else {
		completionHandler(UIBackgroundFetchResultFailed);
	}
}

completionHandlerブロックはダウンロード操作の完了時に実行するブロックで、ダウンロード処理が完了したらこのブロックを実行します。このとき、引数に指定するUIBackgroundFetchResultの値は、処理結果に一番近いものを以下の3つの中から指定します。

UIBackgroundFetchResultNewData
新しいデータのダウンロードに成功した
UIBackgroundFetchResultNoData
ダウンロードすべきデータがなかった
UIBackgroundFetchResultFailed
データのダウンロードに失敗した

まとめ

ニュース系のアプリのようにコンテンツを定期的に更新する必要のなるアプリでは非常に有効だと思います。また、iOS 7でバックグラウンドで定期的にフェッチ処理を実行すると合わせて使うとさらに効果的です!

ただ、本記事では具体的にどうやってバックグラウンドでコンテンツを落とすのが正解かとういうことに触れられていません・・。やはり こNSURLSessionが絡んでくるのですかね。この辺はまた次回!