[iOS 7] Background Fetchについて

こんにちは、KID.Aです。

iOS 7からは「Background fetch」モードと「Remote notification」モードの新しいマルチタスク機能が追加されました。

Remote notificationの挙動についてで「Remote notification」モードを説明したため、今回は「Background fetch」モードについて説明をしたいと思います。

 

実装方法

「Background fetch」モードの実装方法を紹介します。

  • プログラム側

まずは、Xcodeを起動して、プロジェクトを作成します。プロジェクト名は「FetchStudy」にします。
スクリーンショット 2013-10-23 16.50.33

次に、CapabilitiesのBackground Modesを項目を開きます。
スクリーンショット 2013-10-23 16.50.52

Background ModesをONにします。
スクリーンショット 2013-10-23 16.51.05

ModesのBackground fetchをチェックします。
スクリーンショット 2013-10-23 16.51.12

 

AppDelegate.mに以下のコードを実装します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

    // Override point for customization after application launch.
    return YES;
}

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

    NSLog(@"receive fetch");
    completionHandler(UIBackgroundFetchResultNewData);

}

アプリがバックグラウンドで動いている際に、端末から「setMinimumBackgroundFetchInterval」で設定した間隔(システム依存のため、間隔は保障はされません。実際はほとんど間隔通りには来ませんので注意が必要です)で、「performFetchWithCompletionHandler」の関数に通知がされます。

以上で完了です。簡単に実装できますね。

 

実証

「FetchStudy」アプリをインストール、起動後、ホームキーでアプリを終了します。
2013-10-23 17.03.01

マルチタスクには以下の図のような状態で「FetchStudy」アプリが残っています。
2013-10-23 16.58.57

いつフェッチが動くかわからないため、今回はエミュレータからフェッチを通知させます。

「Debug」→「Sumilate Background Fetch」でフェッチを通知できます。
スクリーンショット 2013-10-23 17.01.13

端末にフェッチが届いたか、コンソールを見て確認します。コンソールはWindow→Organizerでツールを起動します。

スクリーンショット 2013-10-23 16.56.42

上のDevicesを選んで、左側の接続しているデバイス一覧から、自分のiPhoneのConsoleを押下するとログがみれるようになります。
スクリーンショット 2013-10-23 17.02.00
おおー、きちんと「Receive Fetch」とログがでましたね。

 

ちなみに、Xcodeからビルド後、アプリをバックグラウンドにするために、ホームキーでアプリを終了しなくても、Xcodeの設定で初回からバックグラウンド起動にすることもできます。

Xcodeの「Product」→「Scheme」→「Edit Scheme」を選択します。
スクリーンショット 2013-10-23 17.02.46

「Bachground Fetch」のチェックボックスにチェックします。
スクリーンショット 2013-10-23 17.03.12

この設定後、Xcodeからアプリ起動すると、初回からバックグラウンドで起動できます。

 

詳細

「Background Fetch」モードについて、詳細を説明します。

 

  • 実装

まず、setMinimumBackgroundFetchIntervalはフェッチが届く間隔を設定できる関数ですが、必ず間隔通り来るわけではなく、通知タイミングはシステム依存になります。
値はNSTimeIntervalを設定できます。

iOS側で用意されている定数は2種類あります。
UIApplicationBackgroundFetchIntervalMinimum  フェッチを最小間隔で通知する
UIApplicationBackgroundFetchIntervalNever    フェッチを実行しない

デフォルトでUIApplicationBackgroundFetchIntervalNeverが設定されているため、通常はフェッチが通知されません。
setMinimumBackgroundFetchIntervalにNSTimeIntervalを設定することで、フェッチが通知されるようになります。

 

  • 通知タイミング

「WWDC 2013」の資料を読みますと、システム側が以下のことを行います。
– アプリの利用頻度を端末は学習します。
– アプリ毎の起動時間を覚えています。
– 起動していないと思われる時間はフェッチをさけます。

例えば、3日連続でPM9:00~PM9:15の間「FetchStudy」を起動していたとします。
そうするとシステム側は「FetchStudy」はPM9:00~PM9:15に起動する傾向があると学習します。
4日目のPM9:00に「FetchStudy」が起動していなければ、フェッチの通知がきます。
という感じだと思います。

利用頻度で通知タイミングが来るという考えで、アプリ設計するといいと思います。

 

KID.A

KID.A の紹介

楽して生きることと一発逆転を夢見ている、ちゃきちゃきのAndroiderです。 いろいろアプリを出しているのですが、いつもリリース後にターゲットユーザ数を2桁見誤っていたことに気付くので、残念でなりません。下方修正で、ヒットがでません。おしいです。 明日から本気出します。 よろしくお願いします。
カテゴリー: iOS タグ: , , , , パーマリンク

コメントを残す

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