こんにちは、KID.Aです。
iOS 7からは「Background fetch」モードと「Remote notification」モードの新しいマルチタスク機能が追加されました。
Remote notificationの挙動についてで「Remote notification」モードを説明したため、今回は「Background fetch」モードについて説明をしたいと思います。
実装方法
「Background fetch」モードの実装方法を紹介します。
- プログラム側
まずは、Xcodeを起動して、プロジェクトを作成します。プロジェクト名は「FetchStudy」にします。
次に、CapabilitiesのBackground Modesを項目を開きます。
ModesのBackground fetchをチェックします。
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」アプリをインストール、起動後、ホームキーでアプリを終了します。
マルチタスクには以下の図のような状態で「FetchStudy」アプリが残っています。
いつフェッチが動くかわからないため、今回はエミュレータからフェッチを通知させます。
「Debug」→「Sumilate Background Fetch」でフェッチを通知できます。
端末にフェッチが届いたか、コンソールを見て確認します。コンソールはWindow→Organizerでツールを起動します。
上のDevicesを選んで、左側の接続しているデバイス一覧から、自分のiPhoneのConsoleを押下するとログがみれるようになります。
おおー、きちんと「Receive Fetch」とログがでましたね。
ちなみに、Xcodeからビルド後、アプリをバックグラウンドにするために、ホームキーでアプリを終了しなくても、Xcodeの設定で初回からバックグラウンド起動にすることもできます。
Xcodeの「Product」→「Scheme」→「Edit Scheme」を選択します。
「Bachground Fetch」のチェックボックスにチェックします。
この設定後、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」が起動していなければ、フェッチの通知がきます。
という感じだと思います。
利用頻度で通知タイミングが来るという考えで、アプリ設計するといいと思います。