こちらのライブラリを使います。
Documentの中でも、最速でiOS対応する箇所に絞って記録しておきます。
実装
info.plist
に権限追加
<key>BGTaskSchedulerPermittedIdentifiers</key> <array> <string>com.transistorsoft.fetch</string> </array> <key>UIBackgroundModes</key> <array> <string>fetch</string> <string>processing</string> </array>
初期化用の関数を定義します。
Future<void> _initBackgroundFetch() async { BackgroundFetch.configure( BackgroundFetchConfig( minimumFetchInterval: 15, // 15分ごとに更新 ), (String taskId) async { print("[BackgroundFetch] Event received $taskId"); // ここにbackgroundで実行したい処理を追加 BackgroundFetch.finish(taskId); }, (String taskId) { print("[BackgroundFetch] TASK TIMEOUT taskId: $taskId"); BackgroundFetch.finish(taskId); }); }
BackgroundFetchConfig
の引数の中で、iOS対応に関係するのは minimumFetchInterval
のみです。最小の実行間隔を指定します。
最小は15分(デフォルト)です。ただし、使用状況を見てiOS側で最適化された間隔で実行されるため、ここで指定した間隔どおりに必ずしも実行される保証はないそうです。
あとは、アプリの初期化時に先ほど定義した関数を実行すればOKです。
デバッグ方法
background fetchイベントを手動で実行する方法です
実機の場合
Xcodeのターミナルで 一時停止 > lldb のところに下記コマンド追加 > スタート
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.transistorsoft.fetch"]
Simulatorの場合
Xcodeのメニューから Debug > Simulate background fetch