コンテンツへスキップ

アップデート動作

Capgoアプリのアップデートをリリースする際、ユーザーにできるだけ早くそのアップデートを受け取ってもらいたいと思うでしょう。しかし、セッション中にダウンロードを待たせたりアプリを再起動させたりして、ユーザーエクスペリエンスを妨げたくはありません。

Capgoのアップデート動作は、アップデートを迅速に配信することとユーザーの中断を最小限に抑えることのバランスを取るように設計されています。

デフォルトのアップデートフロー

デフォルトでは、Capgoは以下のようにアプリのアップデートを処理します:

  1. アプリ起動時、Capgoプラグインは新しいアップデートが利用可能かどうかをチェックします

  2. アップデートが見つかった場合、ユーザーが現在のバージョンを使用し続けている間にバックグラウンドでダウンロードされます

  3. ダウンロードが完了すると、Capgoはユーザーがアプリをバックグラウンドにするか完全に終了するのを待ちます

  4. ユーザーが次回アプリを起動すると、更新されたバージョンが実行されます

このフローにより、ユーザーはアップデートプロンプトによって中断されたり、ダウンロードを待たされたりすることなく、常にアプリの最新バージョンを実行できます。

なぜこのアプローチなのか?

バックグラウンドまたは終了イベントでアップデートを適用することには、ユーザーエクスペリエンスにおいて以下のような主要な利点があります:

  • セッション中にアップデートプロンプトで中断されたり、ダウンロードを待たされたりすることがありません

  • アップデートはセッション間でシームレスに適用されるため、アプリの起動エクスペリエンスは常に新鮮です

  • アクティブなユーザーを中断する心配なく、頻繁にアップデートを配信できます

主な欠点は、ユーザーがアプリをバックグラウンドにして素早く再開した場合、それらのアクション間でアップデートが適用されたため、保存されていない状態が失われる可能性があることです。

これを緩和するために、以下を推奨します:

  • 状態を頻繁に保存し、アプリが再開したときに適切に復元する

  • アプリの状態の大部分を変更する頻繁なアップデートを避ける

  • 重要なフローについては、アップデート動作をカスタマイズすることを検討する(以下参照)

アップデートが適用されるタイミングのカスタマイズ

場合によっては、アップデートがいつ適用されるかをより細かく制御したい場合があります。例えば、進行中のフローが完了するまでアップデートを確実に待機させたい場合や、サーバーサイドの変更とアプリのアップデートを連携させたい場合などです。

CapgoはsetDelay関数を提供しており、アップデートがインストールされる前に満たす必要がある条件を指定できます:

import { CapacitorUpdater } from '@capgo/capacitor-updater';
await CapacitorUpdater.setMultiDelay({
delayConditions: [
{
kind: 'date',
value: '2023-06-01T00:00:00.000Z',
},
{
kind: 'background',
value: '60000',
},
],
});

この例では、2023年6月1日以降AND アプリが60秒以上バックグラウンドになるまでアップデートのインストールを遅延させます。

利用可能な遅延条件は以下の通りです:

  • date: 特定の日時以降までアップデートの適用を待機
  • background: アプリがバックグラウンドになってから最小限の期間が経過するまで待機
  • nativeVersion: アップデートを適用する前に、最小バージョンのネイティブバイナリがインストールされるまで待機
  • kill: 次のアプリ終了イベントまでアップデートの適用を待機

これらの条件を組み合わせることで、アップデートがインストールされるタイミングを正確に制御できます。

即時アップデートの適用

重要なアップデートや非常にシンプルな状態のアプリの場合、バックグラウンドや終了イベントを待たずに、ダウンロード完了後すぐにアップデートを適用したい場合があります。CapgoはdirectUpdate設定オプションでこれをサポートしています。

directUpdateはJavaScriptコードではなく、capacitor.config.tsファイルで設定します:

import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
plugins: {
CapacitorUpdater: {
autoUpdate: true,
directUpdate: true,
},
},
keepUrlPathAfterReload: true,
};
export default config;

directUpdateを有効にすると、ユーザーがアプリをアクティブに使用している最中でも、ダウンロードが完了次第すぐにアップデートが適用されます。

directUpdateはネイティブ設定であるため、JavaScriptコードで追加の処理が必要になることに注意してください。

directUpdateを使用する場合、appReadyイベントをリッスンし、それに応じてアプリのスプラッシュスクリーンを非表示にする必要があります:

import { CapacitorUpdater } from '@capgo/capacitor-updater';
import { SplashScreen } from '@capacitor/splash-screen';
CapacitorUpdater.addListener('appReady', () => {
// スプラッシュスクリーンを非表示
SplashScreen.hide();
});
CapacitorUpdater.notifyAppReady();

appReadyイベントは、アプリの初期化と保留中のアップデートの適用が完了した時点で発火します。これは、ユーザーが最新バージョンを確実に見られるようにするため、アプリのUIを表示しても安全なポイントです。

appReadyイベントの処理に加えて、directUpdateを使用する場合はkeepUrlPathAfterReload設定オプションをtrueに設定することを推奨します。これにより、アップデートによってアプリがリロードされた際に現在のURLパスが保持され、アプリ内でのユーザーの位置を維持し、混乱を軽減します。

directUpdateを使用する際にappReadyイベントを処理せず、keepUrlPathAfterReloadを設定しない場合、ユーザーは一時的に古いバージョンのアプリを見たり、初期ルートに戻されたり、アップデートが適用される際にちらつきを見る可能性があります。

directUpdateは重要なバグ修正やセキュリティパッチを配信する際に便利ですが、いくつかのトレードオフがあります:

  • appReadyイベントを適切に処理しない場合、アップデートが適用される際に短いちらつきやローディング状態が見える可能性があります
  • アップデートがアプリの状態やUIを変更する場合、セッション中に破壊的な変更が見える可能性があります
  • keepUrlPathAfterReloadが設定されていない場合、アプリ内でのユーザーの位置が失われ、混乱を招く可能性があります
  • スムーズな移行を確保するために、状態の保存と復元を慎重に処理する必要があります

directUpdateを有効にする場合は、以下を推奨します:

  • appReadyイベントを処理してアプリのUIが表示されるタイミングを制御する
  • keepUrlPathAfterReloadtrueに設定してアプリ内でのユーザーの位置を保持する
  • ユーザーの進行状況を失わないように、必要に応じてアプリの状態を保存および復元する
  • 不自然な遷移、状態の損失、位置の混乱がないことを確認するために、アプリのアップデート動作を徹底的にテストする

ほとんどの場合、デフォルトのアップデート動作がアップデートの迅速な配信と中断の最小化の最適なバランスを提供します。しかし、特定のニーズを持つアプリの場合、Capgoはアップデートがいつどのように適用されるかをカスタマイズする柔軟性を提供します。