最近のアクセス:
ネイティブ モバイル アプリケーションのリモート設定

はじめに

GeneXus のネイティブ モバイル アプリケーションの重要な機能の 1 つとして、既にデプロイしたアプリケーションをコードを変更することなく設定することができます。この機能は、ジェネレーターの最初のバージョンから有効です。
GeneXus でこのリモート設定を実装することは簡単でも、このタスク専用に設計されている外部ツールも存在することに留意してください。たとえば、Firebase Remote Config というツールです。
このツールには Remote Config という機能があります。Remote Config とは何でしょうか?Firebase Remote Config のドキュメントに記載されています。
Firebase Remote Config は、ユーザーにアプリのアップデートをダウンロードしてもらわなくても、アプリの動作や外観を変更できるクラウドサービスです。Remote Config を使用すると、アプリの動作や外観を制御するアプリ内既定値を作成できます。その後、Firebase コンソールか Remote Config バックエンド API を使用して、すべてのアプリユーザーまたはユーザーベースの特定セグメントに対して、アプリ内既定値をオーバーライドできます。アップデートを適用するタイミングはアプリ側で制御できます。アプリはアップデートの有無を頻繁にチェックし、パフォーマンスにほとんど影響をおよぼすことなくアップデートを適用できます。
GeneXus では簡単に解決できない Remote Config の説明で重要なのは次の部分です:「Firebase コンソールか Remote Config バックエンド API を使用して、すべてのアプリユーザーまたはユーザーベースの特定セグメントに対して、アプリ内既定値をオーバーライドできます」Firebase で実現できるユーザーのセグメント化は、開発者が実装できるカスタムソリューションよりもはるかに完成度が高いです。
とはいえ、GeneXus でもリモート設定を直接コーディングすることで、アプリケーションのあらゆる側面をリモートで設定することはできます。これは、開発者のためのより良い選択肢にすぎません。

A/B テスト

Remote Config のサポートは、Firebase を使用するアプリケーションで A/B テストもサポートするための唯一の要件です。
Firebase A/B Testing ページより:
A/B Testing は、プロダクトとマーケティングのテストを簡単に実行、分析、スケーリングでき、アプリ操作の最適化に役立ちます。

一般的なシナリオ

この機能の最も一般的なシナリオは、実行時に開発者が変更したい一連のアプリケーションのパラメーターを設定することであり、これは重要なユーザーセグメントのためです。
そのためには、一連の既定値、すなわちサーバーで値が設定されていない場合やまだフェッチされていない場合に使用される値を指定する必要があります。
サーバーからのパラメーターのフェッチは、ほとんどの場合アプリケーション起動時に実行されますが、特定の時間間隔で実行することもできます。それは特別な場合です。
また、フェッチされたパラメーターの適用は、ある特定のタイミングで実行されます。最も一般的なケースは、アプリケーション起動時です。アプリケーション実行中にパラメーターが変更されないようにするためです。ほかには、サーバーからパラメーターがフェッチされた直後に適用するケースです。
サーバーからパラメーターがフェッチされてローカルで適用されると、アプリケーションは getter 関数を使用してそのパラメーターを読み取ることができます。

宣言型 vs 命令型

最も一般的なシナリオのソリューションを宣言型で実装すると、この機能を使用するためにはコードは必要ありません。これには、次のものが含まれます:
  • 既定値の定義
  • サーバーから値をフェッチするタイミングの指定
  • フェッチされた値を適用するタイミングの指定
  • 有効なパラメーターに対して厳密にタイプ指定された定義の提供
宣言型ソリューションを提供するだけでなく、最大限の柔軟性を実現するために、カスタムの命令型ソリューションも提供します。

リモート設定のプロバイダー

ネイティブモバイルのメインオブジェクトに、リモート設定のプロバイダーを指定するための新しいプロパティが追加されました。
現時点で実装されているプロバイダーは Firebase のみですが、将来的にはほかのプロバイダーも実装される可能性があります。

[ Remote Configuration Provider ] プロパティ

RemoteConfig 外部オブジェクトを使用して、モバイルアプリケーションをリモートで設定するために使用するプロバイダーです。
値:
  • None (既定値)
  • Firebase
None の値を選択した場合、この機能はオフになります。

追加のプロパティ

[ Remote Configuration Provider ] プロパティNone 以外の値を選択すると、「Remote Configuration Settings」というセクションが表示され、次のプロパティが設定可能になります。

[ Default Values ] プロパティ

リモート設定のパラメーターの既定値を設定します。

[ Fetching of Remote Values ] プロパティ

どのようにサーバーから値をフェッチするかを指定します。
値:
  • On Application Activation (既定値): アプリケーションは、起動したり、バックグラウンドから戻ったりするたびに、リモートの値のフェッチを試行します。ただし、最後に正常にフェッチされてから [ Minimum Fetch Interval ] プロパティ (以下参照) で指定されている時間が経過した場合のみです。
  • After Elapsed Time: アプリケーション実行中、および最後に正常にフェッチされてから [ Minimum Fetch Interval ] プロパティ (以下参照) で指定されている時間が経過した後、アプリケーションがサーバーから値をフェッチしようとします。
  • Manual: アプリケーションは自動的に値をフェッチしません。フェッチを実行するために対応するコードを追加するかどうかは開発者次第です。

[ Minimum Fetch Interval ] プロパティ

正常にフェッチされてから、新しい自動フェッチが実行されるまでの最小時間を指定します ( [ Fetching of Remote Values ] プロパティ != Manual の場合)。
値: 整数型の値 (分単位) です。既定値は、1.440 分 (== 24 時間) です。

[ Application of Fetched Values ] プロパティ

フェッチされた値を適用するタイミングを指定します。
値:
  • On Application Launch (既定値): フェッチされた値がある場合、それらはアプリケーション起動時に適用されます。 [ Fetching of Remote Values ] プロパティに On Application Activation が設定されている場合は、新しい値をフェッチする前に適用されます。つまり、フェッチされた値は、次回のアプリケーション起動時に適用されます。
  • Immediately: フェッチされた値は、フェッチが完了した直後に適用されます。次回これらの値を読み込んだとき、新しくフェッチされた値が返されます。
  • Manual: 値は自動的に適用されません。開発者が値を適用する必要があります。

RemoteConfig 外部オブジェクト

この外部オブジェクトは、アプリケーション開発者がリモート設定のプロバイダーと対話するために使用する機能を提供します。
  • 名前: RemoteConfig
  • 場所: GeneXus.SD モジュール
この外部オブジェクトは、生成されたコード (オフライン) やユーザーイベントで使用できます。

プロパティ

LastSuccessfulFetch: DateTime

設定がサーバーから正常にフェッチされた最後の時刻のタイムスタンプを示します。
注: [ Remote Configuration Provider ] プロパティが None に設定されている場合、または値がまだフェッチされていない場合、空の DateTime を返します。最後のフェッチでエラーが発生した場合、前回のフェッチに対応する DateTime が返されます。
注: このプロパティでは、自動的に実行されるフェッチ操作も考慮されます。

LastFetchStatus: Enum(FetchStatus) { None, Success, Failure }

最後のフェッチのステータスを返します。
値:
  • None: サーバーから値がフェッチされていません。
  • Success: 最後のフェッチが成功しました。
  • Failure: 最後のフェッチを完了できませんでした。
注: このプロパティでは、自動的に実行されるフェッチ操作も考慮されます。

メソッド

HasValue(key: String): Boolean

指定されたキーを持つ値 (既定値またはサーバーからフェッチされた値) が存在する場合は True、そうでない場合は False を返します。

GetStringValue(key: String): String

指定されたキーに対して設定された値を文字列で返します。
考慮事項:
  • サーバーから値がフェッチされている場合は、その値を返します。そうでない場合は、既定値を返します。サーバーからの値も既定値もない場合は、空の String を返します。
  • [ Remote Configuration Provider ] プロパティが None に設定されている場合、このメソッドは空の String を返します。

GetIntegerValue(key: String): Numeric(9,0)

指定されたキーに対して設定された値を小数点なしの数値で返します。
考慮事項: GetStringValue の考慮事項と同様です。

GetDecimalValue(key: String): Numeric(12,4)

指定されたキーに対して設定された値を小数点付きの数値で返します。
考慮事項: GetStringValue の考慮事項と同様です。

GetBooleanValue(key: String): Boolean

指定されたキーに対して設定された値をブール値で返します。
考慮事項: GetStringValue の考慮事項と同様です。

GetDateValue(key: String): Date

指定されたキーに対して設定された値を日付で返します。
考慮事項: GetStringValue の考慮事項と同様です。

GetDateTimeValue(key: String): DateTime

指定されたキーに対して設定された値を日時で返します。
考慮事項: GetStringValue の考慮事項と同様です。

Fetch(): Boolean

サーバーから同期的に値の取得を試行します。成功した場合は True、失敗した場合は False を返します。
[ Remote Configuration Provider ] プロパティが None に設定されている場合は、このメソッドは False を返し、直ちに終了します。

Apply(): Boolean

最後のフェッチ操作でフェッチされた値の適用を試行します (自動または手動)。成功した場合は True、失敗した場合は False を返します。
[ Remote Configuration Provider ] プロパティが None に設定されている場合、またはフェッチされた値が存在しない場合は、このメソッドは False を返し、直ちに終了します。

始める前に

Firebase Remote Config を使用するには、まず、Firebase コンソールでプロジェクトを作成し、iOS および Android の設定ファイルを取得して、それらを GeneXus の KB に設定する必要があります。
詳細については、[ Firebase Analytics Android File ] プロパティ および  [ Firebase Analytics iOS File ] プロパティを参照してください。

Firebase コンソールでの値の設定

Firebase でプロパティの値を追加または変更するには、Firebase コンソールに移動し、該当するプロジェクトを選択して、左側のメニューの [ 拡大 ] -> [ Remote Config ] に移動します。
そこで値を追加または削除できます。

例について

ここの例では、「ボックス」内に何かテキストを表示し、あるテーマクラスを適用することで、そのボックスの境界線や背景色を変更できるようにするとします。そのために、次の 3 つのクラスを作成します: RedBox (赤)、GreenBox (緑)、および BlueBox (青) です。また、remote-configuration プロパティを「box-class」という名前で定義します。これは Firebase コンソールで設定できます。

フェッチ: On Application Activation、適用: On Application Launch、ClientStart イベントでのクラスの変更

「box-class」の [ Fetching of Remote Values ] プロパティ および [ Application of Fetched Values ] プロパティは既定値のままにしておき、 [ Default Values ] プロパティに既定値を追加します。
それから ClientStart イベントに次のコードを追加します:
Event ClientStart
    composite
        &themeClassName = RemoteConfig.GetStringValue("box-class")
        ctlBox.class = &themeClassName
    endComposite
EndEvent
次の点に注目してください:
  • 最初のアプリケーション起動時に、サーバーから値をフェッチしますが、適用はしません。
  • 最初の ClientStart イベント実行時に、GetStringValue メソッドは [ Default Values ] プロパティで定義されている値を返します。
  • 次回のアプリケーション起動時に、フェッチされた値が適用され、Firebase コンソールで設定された値を返します (もしある場合)。

フェッチ: On Application Activation、適用: Immediately、ClientStart イベントでのクラスの変更

「box-class」の [ Fetching of Remote Values ] プロパティは既定値のままにしておき、 [ Application of Fetched Values ] プロパティに Immediately を設定して、 [ Default Values ] プロパティに既定値を追加します。
それから ClientStart イベントに次のコードを追加します:
Event ClientStart
    composite
        &themeClassName = RemoteConfig.GetStringValue("box-class")
        ctlBox.class = &themeClassName
    endComposite
EndEvent
次の点に注目してください:
  • 最初のアプリケーション起動時に、サーバーから値をフェッチし、それらをすぐに適用します。
  • 最初の ClientStart イベント実行時に、GetStringValue メソッドは Firebase コンソールからフェッチされた値を返すか (もしある場合)、または [ Default Values ] プロパティで定義されている値に戻ります。

フェッチ: Manual、適用: Manual、ClientStart イベントでのクラスの変更

「box-class」の [ Fetching of Remote Values ] プロパティに Manual、 [ Application of Fetched Values ] プロパティにも Manual を設定し、 [ Default Values ] プロパティに既定値を追加します。
それから ClientStart イベントに次のコードを追加します:
Event ClientStart
    composite
        &themeClassName = RemoteConfig.GetStringValue("box-class")
        ctlBox.class = &themeClassName
    endComposite
EndEvent
また、次のように、アプリケーションのどこかに別のイベントを追加します:
Event 'FetchAndApply'
    composite
        &success = RemoteConfig.Fetch()
        if &success
            RemoteConfig.Apply()
        endif
    endComposite
EndEvent
次の点に注目してください:
  • FetchAndApply イベントが実行されない限り、値はフェッチされません。


サブページ
Created: 21/08/23 23:28 by Admin Last update: 22/03/14 00:48 by Admin
カテゴリ
Powered by GXwiki 3.0