FlutterでFireRemoteConfigを使ってバージョンアップを強制する

FlutterとRemoteConfigを使って、
アプリをあるバージョン"以上"にする方法を紹介します

(正確には アプリがあるバージョン未満の場合にアップデートを促す方法、です)

まずFlutter側のRemoteConfigの設定を済ませます

pub.dev

以下のようにRemoteConfigの設定もしてしまいます remote config

使うパッケージ

アプリのバージョン取得用 pub.dev

x.x.xの形式のバージョン同士を比較する用 pub.dev

実装

Flutterで実装する場合、iOSAndroidでバージョンは基本的には同じだと思いますが、
審査待ち等何らかの事情で足並みが揃わない場合のためにiOSAndroidで処理を分けています

import 'dart:io';
import 'package:package_info/package_info.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:firebase_remote_config/firebase_remote_config.dart';

  Future<bool> _shouldUpdate() async {
    final packageInfo = await PackageInfo.fromPlatform();
    final appVersionStr = packageInfo.version;
    final appVersion = Version.parse(appVersionStr); // 現在のアプリのバージョン

    // remoteConfigの初期化
    final RemoteConfig remoteConfig = await RemoteConfig.instance;

    // 何らかの事情でRemoteConfigから最新の値を取ってこれなかった場合のフォールバック
    final defaultValues = <String, dynamic>{
      'android_required_semver': appVersionStr,
      'ios_required_semver': appVersionStr
    };
    await remoteConfig.setDefaults(defaultValues);

    await remoteConfig.fetch(); // デフォルトで12時間キャッシュされる
    await remoteConfig.activateFetched();

    final remoteConfigAppVersionKey =
        Platform.isIOS ? 'ios_required_semver' : 'android_required_semver'; // iOSとAndroid以外のデバイスが存在しない世界線での実装
    final requiredVersion = Version.parse(remoteConfig.getString(remoteConfigAppVersionKey));
    return appVersion.compareTo(requiredVersion).isNegative;
  }

あとは適所で

    if (await _shouldUpdate()) {
      // アップデートを促すモーダルを出す等の処理
    }

など書けばOKです

なおストアのページを開かせる際には

pub.dev

が便利