##はじめに
最初に"Background Fetch"のことをさらっと聞いた時、「きっと、アプリが落ちていても、指定した間隔で定期的に処理をさせることができるAPIなんだろうな」なんて期待しましたが、いざ調べてみると、私の期待は見事に打ち砕かれました。
というわけで、今回のお題は「思うようにいかない"Background Fetch"」です。
##何故期待が打ち砕かれたか
"Background Fetch"はコーダーが制御することはできず、通知されるタイミングはシステム依存です。
"Background Fetch"の間隔を指定する定数は、Fetchを最小間隔で通知する"UIApplicationBackgroundFetchIntervalMinimum"とFetchを実行しない"UIApplicationBackgroundFetchIntervalNever"しかありません。
どうやら、システム側がアプリの利用頻度を学習し、起動していると思われる時間に通知タイミングが来るようになっているみたいです。
つまり、"Background Fetch"だけではコーダーの思った通りの間隔で処理を走らせることはできないというわけです。
##とりあえず試してみた
すでに試す前から心を折られた感じの筆者ですが、とりあえず試してみました。
###プロジェクト作成
まず、プロジェクトを作ります。(BackgroundFetchTestというプロジェクトにしました。)
次に"TARGETS"の"Capabilities"を以下のように設定します。
###コード記述
とりあえず、Fetchが通知されたらログを吐き出すだけの簡単なコードを書いてみました。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// OSでサポートされている最小の間隔を指定
application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
return true
}
func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
// ログ出力
NSLog("ふぇっちたん起動したお♪")
// データなし
completionHandler(.NoData);
}
"performFetchWithCompletionHandler"の中の"completionHandler"は必ず呼ぶ必要があるようで、引数は以下のenum型になります。
public enum UIBackgroundFetchResult : UInt {
case NewData // 新しいデータのダウンロードに成功した
case NoData // ダウンロードすべきデータがなかった
case Failed // データのダウンロードに失敗した
}
ところで、"ふぇっち"と平仮名にすると、なんか可愛い感じなので、なんとなく擬人化したら女の子かなって思うのは私だけでしょうか?
###デバッグ
"Background Fetch"のデバッグには、以下の2種類の方法があります。
1."Edit Scheme">"Options">"Background Fetch"にチェックを入れてビルドする。
2."Debug">"Simulate Background Fetch"を実行する。
##実行してみた
とりあえず、私は1の方法でデバッグしてみました。
アプリが起動される(バックグラウンド実行のため、画面は表示されない。)と、以下のログが表示されました。
##まとめ
ネットで記事を漁って軽く触っただけですが、現時点では、"Background Fetch"単体ではあまり有用ではないのかな、と感じました。
今回は触れませんでしたが、"Remote Push Notification"をトリガーに"Background Fetch"を実行させる機能があり、それを使えば定期的に処理を走らせることが可能なようです。