kokh log

yumikokhの開発日記

flutter: iOSでアプリ起動していないときに処理を実行する

こちらのライブラリを使います。

pub.dev

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