#Background fetchとは
アプリを起動していなくても、OSの判断で適切だと思われるタイミングで、任意の処理をバックグランドで実行することができます。
#手順1 Background fetchの有効化
Capabilities → Background Modes → Background fetchをオンにします。
#手順2 任意の処理を実行する間隔の指定
AppDelegate.swiftのdidFinishLaunchingWithOptionsに
application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
を実装する。
※ UIApplicationBackgroundFetchIntervalMinimumとしてもOSの判断で処理が呼ばれるため、常に呼ばれるわけではありません。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
return true
}
#手順3 バックグラウンドで実行する処理の実装
処理を実装します。
処理が終わったらcompletionHandlerを実装する必要があります。
約30秒間猶予を与えられているので、この間に処理を完了させcompletionHandlerを呼べるようにしましょう。
もしcompletionHandlerが呼ばれなかった場合は、次回バックグラウンドで呼ばれる時の間隔に影響するみたいです。
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
//バックグラウンドで実行する処理
//適切なものを渡します → 新規データ: .newData 失敗: .failed データなし: .noData
completionHandler(.newData)
}
#デバッグ方法①
Edit Scheme...から下記をひらき、Background FetchのLaunch due to a background fetch eventにチェックを入れます。
これで実行するとperformFetchWithCompletionHandlerが呼ばれます。
#デバッグ方法②
Debug → Simulate Background Fetchを選択するとperformFetchWithCompletionHandlerが呼ばれます。
ただ実機ではなぜかうまくいきませんでした。
#最後に
自分用のメモとして残しました。