【flutter】flutter_background_serviceパッケージを使用して、Flutterアプリからサーバに定期POSTを実行する。
はじめに
前回、こちらの記事で、Flutterアプリからサーバーにヘルスデータを送信し、Gemini APIを通じてアドバイスのテキスト(例:昨日はよく眠れたみたいですね。この調子!)を生成する部分を実装した。
前回までの実装だと、ユーザーが「連携開始する」ボタンを押すたびに、健康データをサーバー側にPOSTリクエスト送る仕様になっているので、Flutterアプリで毎日特定の時間にバックグラウンドで定期的にPOSTリクエストを実行する方法に変更したい。
flutter_background_serviceパッケージをインストール
今回は、iOSとAndroidの両方に対応した、定期的にバックグラウンドタスクを実行するflutterパッケージとしてflutter_background_service を利用する。
このパッケージは、アプリが閉じられた後もDartコードを継続的に実行する機能を提供する。これにより、定期的なPOSTリクエストをバックグラウンドで送信するなどの処理が可能になる。
パッケージインストールのセクションを参考に、インストールする。
ShellScript
$ flutter pub add flutter_background_service
$ flutter pub get
パッケージのReadmeを見ると、Androidに関するwarningが記載されているが、これはbackgroundではなくforegroundを使用したい場合の追加設定に関してなので、今回はスルーする。
フォアグラウンドとバックグラウンドの違い
フォアグラウンドサービスは、アプリがバックグラウンドにあっても実行を続ける必要がある重要な作業(例えば、音楽の再生や位置情報の追跡)に使用され、ユーザーには常に通知を通じてそのサービスの存在を知らせる。
フォアグラウンドサービスは、システムによる優先度付けを受けやすく、バッテリーの消費やメモリ使用の最適化の影響を受けにくいため、長時間にわたるタスクの実行に適している。
一方で、バックグラウンドサービスは、ユーザーの直接的な介入を必要としない自動的な処理に利用される。例えば、アプリがユーザーの知らないところで自動的に天気情報を更新する場合など。
バックグラウンドサービスはユーザーに通知を送ることなくバックグラウンドで実行でき、システムのリソース管理のもとで動作し、必要に応じてシステムによってその実行が停止される可能性がある。
フォアグラウンドはユーザーに通知が必要であり、追加設定が必要になることが多い。Android 8.0(API レベル 26)以上では、通知チャネルを作成して、フォアグラウンドサービスの通知をユーザーに表示する必要がある。
バックグラウンドサービスの初期化
アプリの起動時にバックグラウンドサービスを初期化する必要がある。
lib/services フォルダ内に background_service_initializer.dart ファイルを作成し、ファイル内でバックグラウンドサービスの設定を行い、main.dartからサービスを開始する。
Dart
// lib/services/background_service_initializer.dart
import 'dart:async';
import 'dart:io';
import 'package:clocky_app/api/api_client.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:health/health.dart';
Future initializeBackgroundService() async {
final service = FlutterBackgroundService();
await service.configure(
androidConfiguration: AndroidConfiguration(
onStart: onStart,
autoStart: true,
isForegroundMode: false,
),
iosConfiguration: IosConfiguration(
autoStart: true,
onForeground: onStart,
onBackground: onIosBackground,
),
);
}
@pragma('vm:entry-point')
void onStart(ServiceInstance service) async {
// バックグラウンドで実行するコード
}
@pragma('vm:entry-point')
Future<bool> onIosBackground(ServiceInstance service) async {
// iOSのバックグラウンド処理
return true;
}
main.dart ファイル内で、initializeService 関数を、、、、
続きは、こちらで記載しています。