Android
 Computer >> コンピューター >  >> システム >> Android

【Flutter】アプリ内アップデートの実装方法:新バージョンをユーザーに効果的に通知する2つのパッケージ徹底解説

新しいバージョンのアプリをリリースするとき、必ずユーザーにそのことを知ってほしいものです。重大なバグを修正したのか、新しい機能を追加したのか、あるいはアプリがよりスムーズに、より速く動くようになったのか――どんな内容であれ、ユーザーに伝える必要があります。

アプリ開発者として、すべてのユーザーに最新バージョンを使ってほしいと考えるのは自然なことです。

では、どうすればユーザーに新しいバージョンの存在を確実に知ってもらえるのでしょうか?

答えはシンプルです。新バージョンがリリースされたときに、アプリ内で直接通知すればよいのです。

その方法は主に2つあります。

  • プッシュ通知を利用する
  • アプリ起動時に知らせる

本記事ではプッシュ通知については扱わず、パッケージを活用してダイアログを表示し、「新しいバージョンが利用可能であること」と「アップデートへの対応方法」をユーザーに伝える方法に焦点を当てて解説します。

OS標準機能ではダメなの?

こうした機能は、モダンなモバイルOSにはすでに組み込まれていると思われるかもしれません。実際、その通りですが、Androidだけの話です。

iOSは(現時点では)開発者がアプリの新バージョンを検出してユーザーに通知する仕組みを提供していません。一方Androidには、Google Playライブラリの一部として「In-App Update(アプリ内アップデート)」ライブラリが用意されています。

そこで、Flutterが両プラットフォームをサポートしていることも踏まえ、アプリのバージョン更新処理に役立つ代表的な2つのパッケージを紹介します。

  1. Upgrader
  2. In App Update

どちらも目的の結果は得られますが、その実現方法は大きく異なります。

重要な前提条件

始める前に、テスト対象のアプリがGoogle Playストアから直接インストールされたものである必要がある点を理解しておきましょう。これは、両パッケージともGoogle Playサービスに依存しており、アプリの所有者確認を行うためです。

この条件を満たしていない場合、パッケージ使用時に次のようなエラーが発生します。

Install Error(-10): The app is not owned by any user on this device.
An app is "owned" if it has been acquired from Play.

In App Update パッケージの使い方

まず知っておくべき点として、このパッケージはAndroidでのみ動作します。内部でAndroidのアプリ内アップデートライブラリに依存しているためです。

このパッケージは、事実上Androidライブラリのラッパーであり、以下のAPIメソッドが公開されています。

  • Future<AppUpdateInfo> checkForUpdate(): アップデートが利用可能かどうかをチェックする
  • Future<AppUpdateResult> performImmediateUpdate(): 即時アップデート(フルスクリーン表示)を実行する
  • Future<AppUpdateResult> startFlexibleUpdate(): 柔軟なアップデート(バックグラウンドダウンロード)を開始する
  • Future<void> completeFlexibleUpdate(): 利用可能な柔軟なアップデートを実際にインストールする

✋ 即時アップデートと柔軟なアップデートの違いについて詳しく知りたい方は、Googleの公式ドキュメントを参照してください。

パッケージのセットアップ

まず、pubspec.yamlファイルにパッケージを追加します。

dependencies:
  flutter:
    sdk: flutter
  in_app_update: ^3.0.0

その後、flutter pub getを実行します。

アプリ内でアップデート処理を行いたい箇所に、次のインポート文を追加します。

import 'package:in_app_update/in_app_update.dart';

最初に、アプリにアップデートがあるかどうかをチェックするロジックを追加します。これにはcheckForUpdateメソッドを使用します。戻り値はFutureで、アップデートの利用可能性や進行状況に関する情報を含んでいます。

updateAvailabilityプロパティを使えば、アップデートが利用可能かどうかを判定できます。アップデートが利用可能な場合、この値はUPDATE_AVAILABLEになります。したがって、メソッドは次のようになります。

InAppUpdate.checkForUpdate().then((updateInfo) {
  if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) {
    // アップデートを実行するロジック
  }
});

次に、即時アップデートと柔軟なアップデートのどちらをトリガーするかを決める必要があります。

即時アップデートは、ユーザーにとって重要なアップデートのためのものであるべきです。たとえば、重大なバグを修正するバージョンや、重要な新機能を提供するバージョンなどが該当します。

即時アップデートを開始するには、performImmediateUpdateメソッドを使用します。このメソッドはAppUpdateResult列挙型を返し、アップデートが成功したかどうかを教えてくれます。

このメソッドを呼び出す前に、即時アップデートが許可されているかどうかを確認する必要があります。それは、AppUpdateInfoオブジェクトのimmediateUpdateAllowedフラグにアクセスすることで行えます。

柔軟なアップデートをトリガーしたい場合は、startFlexibleUpdateメソッドを使用します。これはバックグラウンドで動作し、即時アップデートメソッドと同様にAppUpdateResult列挙型を返します。

この場合、アップデートが成功したら、completeFlexibleUpdateメソッドを呼び出して、アップデートをアプリにインストールする必要があります。

以上のコードをまとめると、各タイプのアップデートのロジックを含めたコードは次のようになります。

InAppUpdate.checkForUpdate().then((updateInfo) {
  if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) {
    if (updateInfo.immediateUpdateAllowed) {
      // 即時アップデートを実行
      InAppUpdate.performImmediateUpdate().then((appUpdateResult) {
        if (appUpdateResult == AppUpdateResult.success) {
          // アップデート成功
        }
      });
    } else if (updateInfo.flexibleUpdateAllowed) {
      // 柔軟なアップデートを実行
      InAppUpdate.startFlexibleUpdate().then((appUpdateResult) {
        if (appUpdateResult == AppUpdateResult.success) {
          // アップデート成功
          InAppUpdate.completeFlexibleUpdate();
        }
      });
    }
  }
});

Upgrader パッケージの使い方

1つ目のオプションとは対照的に、こちらはiOSとAndroidの両方に対応したソリューションです。ストアからデータを収集し、アプリ自体の現在の情報と照合することで動作します。

データを照会するためのAPIを持つ代わりに、このパッケージはロジックを内部で処理するウィジェットを提供しています。

パッケージのセットアップ

まず、pubspec.yamlファイルにパッケージを追加します。

dependencies:
  flutter:
    sdk: flutter
  upgrader: ^5.0.0

その後、flutter pub getを実行します。

アプリ内のアップデート処理を行いたい箇所に、次のインポート文を追加します。

import 'package:upgrader/upgrader.dart';

両者の主な違いはUIの部分にあるので、自分に合った方を選びましょう。

このパッケージを統合するには、bodyウィジェットをUpgradeAlertまたはUpgradeCardでラップする必要があります。以下はその例です。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: applicationName,
      home: UpgradeAlert( /// <------------------
        child: MainPage(
          key: Key("YOUR_KEY"),
          title: applicationName
        ),
      )
    );
  }
}

ストアに新しいバージョンが存在する場合、ユーザーの画面にはアップデートを促すダイアログが表示されます。

テスト時の注意点

動作をテストする際は、main.dartファイルのmainメソッド内に次のコードを追加してください。

await Upgrader.clearSavedSettings();

なお、Upgraderパッケージには非常に多くの設定項目があります。詳細は公式ドキュメントで確認することを強くおすすめします。

パッケージのテスト方法

どちらのパッケージを選んでも、ロジックが正しく機能することを確認する必要があります。

しかし、公式版をリリースせずにどうやってテストすればよいのでしょうか? 答えは、Google Play Consoleの「内部テスト」機能を使うことです。内部テスター向けにアプリの新バージョンをリリースすれば、公開版にはならず、アップグレード機能をテストできます。

手順は以下の通りです。

  1. Google Play Consoleアカウントにログインし、アップデートロジックを実装したアプリのページに移動します。
  2. [設定] → [アプリ内共有] から [テスターを管理] を開き、テスターが共有アプリをダウンロード・インストールできるようにします。リンク経由でもメールでも設定できます。
  3. 次に、[テスト] → [内部テスト] に移動し、右上の [新しいリリースを作成] ボタンをクリックします。
  4. リリースを作成したら、内部テストのメインページに戻り、[テスター] タブをクリックします。そこにテスターのメールアドレス一覧が表示されるので、青い矢印アイコンをクリックします。
  5. この画面で、[メールアドレスを追加] から自分自身を内部テスターとして登録できます。
  6. 完了したら、内部テスト画面に戻り、一番下までスクロールすると [テスターがテストに参加する方法] のセクションに [リンクをコピー] ボタンがあります。

このボタンをクリックして、自分宛てにリンクを送信すれば、アプリの新バージョンをダウンロードできるようになります。

よくあるエラーと対処法

上記の手順を1つでも飛ばすと、生成されたリンクは404エラー(ページが見つかりません)につながるので注意してください。

また、次のようなエラーが表示された場合は:

Install Error(-6): The download/install is not allowed, due to the current device state
(e.g. low battery, low disk space, …).

エミュレーター上でアプリを実行している可能性があります。エミュレーターにGoogle Playストアがインストールされ、ログイン済みであることを確認しましょう。

まとめ

本記事では、Flutterアプリにアプリ内アップデート機能を実装するための2つの主要パッケージ「Upgrader」と「in_app_update」を解説しました。

  • Androidのみ対応で、Google Playのネイティブなアップデート体験を提供したいなら → in_app_update
  • iOSとAndroid両方に対応させたいなら → upgrader

筆者自身も自作アプリにアプリ内アップデートパッケージを統合する際に同じプロセスを経験したことがあり、その経験をもとにこの記事を書きました。皆さんのアプリ開発の参考になれば幸いです。

最後までお読みいただきありがとうございました!

  1. Android Nのすべて:開発者プレビューのインストール方法から新機能まで徹底解説

    Android Nは、5月に開催されるGoogle I/Oで初披露される予定でしたが、実際にはそれより早く登場しました。世界で最も人気のあるモバイルOSの最新バージョンのプレビューは、Nexus 6、Nexus 5X、Nexus 6P、Nexus Player、Nexus 9、Pixel Cをお持ちの方なら、今すぐ試すことができます。最初の開発者プレビューはアルファ版ビルドで、夏まで4〜6週間ごとのペースで更新されながら、第3四半期(Q3)の正式リリースへと進んでいきます。これは非常に初期段階のバージョンであり、常用を想定したものではありません。バージョン番号がAndroid 7.0になるのか

  2. CarPlayに足りないもの——iPhoneユーザーが本気で欲しいAndroid Autoの便利機能

    公開日:2026年1月23日(米国東部時間 午前10時01分) 筆者のShimulは心理学を専攻しましたが、卒業後は学位の道には戻らず、大学時代のSNSインターンを起点に、iGeeksBlog、Guiding Tech、MySmartPriceなどのテックメディアや、人気テックインフルエンサーのRajiv Makhni氏のもとでSNSマネージャーとしてキャリアを積んできました。キャリア初期はSNS運用が中心でしたが、MySmartPriceに参加してから消費者向けテック記事の執筆の世界に足を踏み入れ、Appleエコシステム、Androidスマートフォン、そして日々の生活を快適にするちょっとし