ライブ・アップデート

improve this page | report issue

概説

ユーザー・セグメンテーションとは、各グループのユーザー間の類似性が反映されるようにユーザーをグループに分ける行為です。 一般的な例として、地理的セグメンテーション、つまり、地理学に基づいたユーザーの分割などがあります。 ユーザーのセグメント化の目標は、値を最大化するように、各セグメント内でユーザーをどのように関係付けるかを決定することです。

Mobile Foundation 内のライブ・アップデート機能を使用すると、シンプルな方法でアプリケーションのユーザーのセグメントごとに異なる構成を定義し、提供できます。 MobileFirst Operations Console には、セグメントごとの構成の値だけでなく、構成の構造も定義するためのコンポーネントが含まれています。 また、構成をコンシュームするためのクライアント SDK も提供されます (Android および iOS のネイティブ・アプリケーション、および Cordova アプリケーションで使用できます)。

一般的なユースケース

ライブ・アップデートは、セグメント・ベースの構成の定義およびコンシュームを支援し、セグメント・ベースでのアプリケーションのカスタマイズを簡単に行えるようにします。 一般的なユースケースとしては、以下のようなものがあります。

  • リリース・トレーンおよびフィーチャー・フリッピング
  • A/B テスト
  • コンテキスト・ベースの、アプリケーションのカスタマイズ (例: 地理的セグメンテーション)

デモンストレーション

以下のビデオで、ライブ・アップデート機能のデモンストレーションをご覧いただけます。

ジャンプ先:

ライブ・アップデートのアーキテクチャー

以下のシステム・コンポーネントは、ライブ・アップデート機能を提供するために一緒に機能します。

アーキテクチャーの概説

  • ライブ・アップデート・アダプター: 以下を提供するアダプター
  • アプリケーション・スキーマおよびセグメント管理
  • アプリケーションへの構成の提供
  • セグメント・リゾルバー・アダプター: オプション。 開発者によって実装されるカスタム・アダプター。 このアダプターは、アプリケーション・コンテキスト (デバイスおよびユーザーのコンテキスト、カスタム・パラメーターなど) を受け取り、コンテキストに対応するセグメントの ID を返します。
  • クライアント・サイドの SDK: ライブ・アップデート SDK は、MobileFirst Server からのフィーチャーおよびプロパティーなど、構成エレメントの取得およびアクセスに使用されます。
  • MobileFirst Operations Console: ライブ・アップデート・アダプターの構成およびライブ更新設定に使用されます。
  • 構成サービス: 内部。 ライブ・アップデート・アダプターの構成管理サービスを提供します。

MobileFirst Server へのライブ・アップデートの追加

デフォルトでは、MobileFirst Operations Console での「ライブ更新設定」は非表示になっています。 有効にするには、提供されているライブ・アップデート・アダプターをデプロイする必要があります。

  1. MobileFirst Operations Console を開きます。 サイドバー・ナビゲーションで、「ダウンロード・センター」→「ツール」タブをクリックします。
  2. ライブ・アップデート・アダプターをダウンロードし、デプロイします。

デプロイ後、「ライブ更新設定」画面が、登録済みアプリケーションごとに現れます。

ライブ・アップデートのデプロイ

アプリケーション・セキュリティーの構成

ライブ・アップデートとの統合を許可するには、スコープ・エレメントが必要です。 これがないと、アダプターはクライアント・アプリケーションからの要求を拒否します。

MobileFirst Operations Console をロードし、[ご使用のアプリケーション] →「セキュリティー」タブ →「スコープ・エレメントのマッピング」の順にクリックします。 「新規」をクリックし、スコープ・エレメント configuration-user-login を入力します。 次に、「追加」をクリックします。

アプリケーション内でスコープ・エレメントを使用する場合は、それをセキュリティー検査にマップすることもできます。

詳しくは、MobileFirst セキュリティー・フレームワークに関する説明を参照してください。

スコープ・マッピングの追加

スキーマおよびセグメント

「ライブ更新設定」画面には、以下の 2 つのタブがあります。

スキーマとは

スキーマは、フィーチャーおよびプロパティーが定義されている場所です。

  • 「フィーチャー」を使用して、構成可能なアプリケーション・フィーチャーを定義し、そのデフォルト値を設定できます。
  • 「プロパティー」を使用して、構成可能なアプリケーション・プロパティーを定義し、そのデフォルト値を設定できます。

セグメント

セグメントは、スキーマによって定義されるデフォルトのフィーチャーおよびプロパティーをカスタマイズして、固有のアプリケーション動作を定義します。

スキーマおよびセグメントの追加

アプリケーションのスキーマおよびセグメントを追加する前に、開発者または製品管理チームは、以下のいくつかの側面について決定しておく必要があります。

  • ライブ・アップデートを使用するフィーチャーのセットと、それらのデフォルトの状態
  • 構成可能なストリングの プロパティーのセットと、それらのデフォルト値
  • アプリケーションのマーケット・セグメント

マーケット・セグメントごとに、以下を決定してください。

  • あらゆるフィーチャーの状態と、アプリケーションの存続期間中にこの状態をどのように変更可能か
  • あらゆるプロパティーの値と、アプリケーションの存続期間中にこの値をどのように変更可能か


パラメーターが決定されると、スキーマのフィーチャーとプロパティー、およびセグメントを追加できます。
追加するには、「新規」をクリックし、必要な値を指定します。

  • フィーチャー: フィーチャーは、アプリケーション機能の一部が有効であるか無効であるかを判別します。 アプリケーションのスキーマでフィーチャーを定義する際に、以下のエレメントを指定する必要があります。
    • id – 固有のフィーチャー ID。 ストリング、編集不可。
    • name - フィーチャーの記述名。 ストリング、編集可能。
    • description – フィーチャーの簡略説明。 ストリング、編集可能。
    • defaultValue – セグメント内でオーバーライドされなかった場合のフィーチャーのデフォルト値 (下記の『セグメント』を参照)。 ブール値、編集可能。
  • プロパティー: プロパティーは、「キー:値」のエンティティーで、アプリケーションをカスタマイズするために使用できます。 アプリケーションのスキーマでプロパティーを定義する際に、以下のエレメントを指定する必要があります。
    • id – 固有のプロパティー ID。 ストリング、編集不可。
    • name - プロパティーの記述名。 ストリング、編集可能。
    • description – プロパティーの簡略説明。 ストリング、編集可能。
    • defaultValue - セグメント内でオーバーライドされなかった場合のプロパティーのデフォルト値 (下記の『セグメント』を参照)。 ストリング、編集可能。
  • セグメント: セグメントは、マーケット・セグメントに対応するエンティティーです。 セグメントには、スキーマ内に定義されたフィーチャーおよびプロパティーが含まれています。これらの値はオーバーライドされる可能性があります。 セグメントを定義する際に、以下のエレメントを指定する必要があります。
    • id - 固有のセグメント ID。 ストリング、編集不可。
    • name - セグメントの記述名。 ストリング、編集可能。
    • description – セグメントの簡略説明。 ストリング、編集可能。
    • Features - スキーマ内に定義されたフィーチャーのリスト。ユーザーは、スキーマのデフォルトとは異なる静的値をフィーチャーに設定できます。
    • Properties - スキーマ内に定義されたプロパティーのリスト。ユーザーは、スキーマのデフォルトとは異なる静的値をプロパティーに設定できます。
注:
  • フィーチャーまたはプロパティーがスキーマに追加されると、対応するフィーチャーまたはプロパティーがアプリケーションのすべてのセグメントに (デフォルト値で) 自動的に追加されます。
  • フィーチャーまたはプロパティーがスキーマから削除されると、対応するフィーチャーまたはプロパティーがアプリケーションのすべてのセグメントから自動的に削除されます。

スキーマのフィーチャーおよびプロパティーをデフォルト値で定義

スキーマのフィーチャーおよびプロパティーの追加

マーケット・セグメントに対応するセグメントの定義

セグメントの追加

フィーチャーおよびプロパティーのデフォルト値のオーバーライド

フィーチャーを有効にし、そのデフォルトの状態を変更します。 フィーチャーを有効にする

プロパティーのデフォルト値をオーバーライドします。 プロパティーのオーバーライド

アプリケーションへのライブ・アップデート SDK の追加

ライブ・アップデート SDK は、MobileFirst Operations Console で登録済みアプリケーションの「ライブ更新設定」画面で以前定義されたランタイム構成のフィーチャーおよびプロパティーを照会する API を開発者に提供します。

Cordova プラグインの追加

Cordova アプリケーション・フォルダーで、以下を実行します。

cordova plugin add cordova-plugin-mfp-liveupdate

iOS SDK の追加

  1. IBMMobileFirstPlatformFoundationLiveUpdate pod を追加して、アプリケーションの pod ファイルを編集します。
    例えば、次のとおりです。

    use_frameworks!
    
    target 'your-Xcode-project-target' do
       pod 'IBMMobileFirstPlatformFoundation'
       pod 'IBMMobileFirstPlatformFoundationLiveUpdate'
    end
    
  2. コマンド・ライン・ウィンドウから、Xcode プロジェクトのルート・フォルダーにプロジェクトし、コマンド pod install を実行します。

Android SDK の追加

  1. Android Studio で、「Android」→「Gradle Scripts」を選択し、build.gradle (Module: app) ファイルを選択します。
  2. 以下のように、dependencies 内に ibmmobilefirstplatformfoundationliveupdate を追加します。

    dependencies {
         compile group: 'com.ibm.mobile.foundation',
         name: 'ibmmobilefirstplatformfoundation',
         version: '8.0.+',
         ext: 'aar',
         transitive: true
    
         compile group: 'com.ibm.mobile.foundation',
         name: 'ibmmobilefirstplatformfoundationliveupdate',
         version: '8.0.0',
         ext: 'aar',
         transitive: true
    }   
    

ライブ・アップデート SDK の使用

ライブ・アップデート SDK を使用するにはいくつかの方法があります。

事前に判別されているセグメント

関連セグメントの構成を取得するためのロジックを実装します。
「segment-name」、「property-name」、および「feature-name」をユーザー独自のものに置換します。

Cordova

    var input = { segmentId :'segment-name' };
    LiveUpdateManager.obtainConfiguration(input,function(configuration) {
        // do something with configration (JSON) object, for example,
        // if you defined in the server a feature named 'feature-name':
        // if (configuration.features.feature-name) {
        //   console.log(configuration.properties.property-name);
	// }
    } ,
    function(err) {
        if (err) {
           alert('liveupdate error:'+err);
        }
  });

iOS

LiveUpdateManager.sharedInstance.obtainConfiguration("segment-name", completionHandler: { (configuration, error) in
  if error == nil {
    print (configuration?.getProperty("property-name"))
    print (configuration?.isFeatureEnabled("feature-name"))
  } else {
    print (error)
  }
})

Android

LiveUpdateManager.getInstance().obtainConfiguration("segment-name", new ConfigurationListener() {

    @Override
    public void onSuccess(final Configuration configuration) {
        Log.i("LiveUpdateDemo", configuration.getProperty("property-name"));
        Log.i("LiveUpdateDemo", configuration.isFeatureEnabled("feature-name").toString());
    }

    @Override
    public void onFailure(WLFailResponse wlFailResponse) {
        Log.e("LiveUpdateDemo", wlFailResponse.getErrorMsg());
    }
});

ライブ・アップデート構成を取得して、応用ロジックおよびアプリケーション・フローに、フィーチャーおよびプロパティーの状態を反映することができます。 例えば、今日が祝日の場合、アプリケーションに新しいマーケティング・プロモーションを導入することができます。

セグメント・リゾルバー・アダプター

『ライブ・アップデートのアーキテクチャー』のトピックで、「セグメント・リゾルバー」アダプターについて述べました。
このアダプターの目的は、アプリケーション/デバイス/ユーザー・コンテキストおよび応用カスタム・パラメーターに基づいてセグメントを取得するための、カスタム・ビジネス・ロジックを提供することです。

セグメント・リゾルバー・アダプターを使用するには、以下のようにします。

  1. 新規 Java アダプターを作成します
  2. 「アダプター」→「ライブ・アップデート・アダプター」→ 「segmentResolverAdapterName」で、セグメント・リゾルバー・アダプターとしてアダプターを定義します。
  3. 開発が完了したら、必ずアダプターをビルドしてデプロイしてください

セグメント・リゾルバー・アダプターは、REST インターフェースを定義します。 このアダプターへの要求には、その本体内に、エンド・ユーザーが属し、要求をアプリケーションに送り返すセグメントを決定するために必要なすべての情報が含まれています。

パラメーターによって構成を取得するには、ライブ・アップデート API を使用して要求を送信します。

Cordova リゾルバー

var input = { params : { 'paramKey': 'paramValue'} ,useClientCache : true };                                                  
LiveUpdateManager.obtainConfiguration(input,function(configuration) {
        // do something with configration (JSON) object, for example:
        // console.log(configuration.properties.property-name);                                                                                                             // console.log(configuration.data.features.feature-name);                                                                                                        
    } ,
    function(err) {
        if (err) {
           alert('liveupdate error:'+err);
        }
  });

iOS

LiveUpdateManager.sharedInstance.obtainConfiguration(["paramKey":"paramValue"], completionHandler: { (configuration, error) in
  if error == nil {
    print (configuration?.getProperty("property-name"))
    print (configuration?.isFeatureEnabled("feature-name"))
  } else {
    print (error)
  }
})

Android

Map <String,String> params = new HashMap<>();
params.put("paramKey", "paramValue");

LiveUpdateManager.getInstance().obtainConfiguration(params , new ConfigurationListener() {

    @Override
    public void onSuccess(final Configuration configuration) {
        Log.i("LiveUpdateDemo", configuration.getProperty("property-name"));
        Log.i("LiveUpdateDemo", configuration.isFeatureEnabled("feature-name").toString());
    }

    @Override
    public void onFailure(WLFailResponse wlFailResponse) {
        Log.e("LiveUpdateDemo", wlFailResponse.getErrorMsg());
    }
});

アダプターの実装

その後、ライブ・アップデート・クライアント SDK を使用してアプリケーションによって提供される引数は、ライブ・アップデート・アダプターに渡され、そこからセグメント・リゾルバー・アダプターに渡されます。 これは自動的にライブ・アップデート・アダプターによって行われ、開発者のアクションは必要ありません。

新しく作成したセグメント・リゾルバー・アダプターの実装を更新して、これらの引数で関連セグメントを返すようにします。
以下に、ユーザーが使用できるサンプル・コードを示します。

注: 必ずアダプターの pom.xml に Gson 従属関係を追加してください。

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.7</version>
</dependency>

SampleSegmentResolverAdapterApplication.java

@Api(value = "Sample segment resolver adapter")
@Path("/")
public class SampleSegmentResolverAdapter {

    private static final Gson gson = new Gson();
    private static final Logger logger = Logger.getLogger(SampleSegmentResolverAdapter.class.getName());

    @POST
    @Path("segment")
    @Produces("text/plain;charset=UTF-8")
    @OAuthSecurity(enabled = true, scope = "configuration-user-login")
    public String getSegment(String body) throws Exception {
        ResolverAdapterData data = gson.fromJson(body, ResolverAdapterData.class);
        String segmentName = "";

        // Get the custom arguments
        Map<String, List<String>> arguments = data.getQueryArguments();

        // Get the authenticatedUser object
        AuthenticatedUser authenticatedUser = data.getAuthenticatedUser();
        String name = authenticatedUser.getDisplayName();

        // Get registration data such as device and application
        RegistrationData registrationData = data.getRegistrationData();
        ApplicationKey application = registrationData.getApplication();
        DeviceData deviceData = registrationData.getDevice();

        // Based on the above context (arguments, authenticatedUser and registrationData) resolve the segment name.
        // Write your custom logic to resolve the segment name.

        return segmentName;
    }
}

SampleSegmentResolverAdapter.java

public class ResolverAdapterData {
    public ResolverAdapterData() {
    }

    public ResolverAdapterData(AdapterSecurityContext asc, Map<String, List<String>> queryArguments)
    {
        ClientData cd = asc.getClientRegistrationData();

        this.authenticatedUser = asc.getAuthenticatedUser();
        this.registrationData = cd == null ? null : cd.getRegistration();
        this.queryArguments = queryArguments;
    }

    public AuthenticatedUser getAuthenticatedUser() {
        return authenticatedUser;
    }

    public RegistrationData getRegistrationData() {
        return registrationData;
    }

    public Map<String, List<String>> getQueryArguments() {
        return queryArguments;
    }

    private AuthenticatedUser authenticatedUser;
    private RegistrationData registrationData;
    private Map<String, List<String>> queryArguments;
}

セグメント・リゾルバー・アダプターの REST インターフェース

要求

属性
URL /segment
メソッド POST
コンテンツ・タイプ application/json
本文 <セグメント解決に必要なすべての情報を含んでいる JSON オブジェクト>

応答

属性
コンテンツ・タイプ text/plain
本文 <セグメント ID を記述するストリング>

高度なトピック

インポート / エクスポート

スキーマおよびセグメントが定義された後、システム管理者は、他のサーバー・インスタンスにそれらをエクスポートおよびインポートできます。

スキーマのエクスポート

curl --user admin:admin http://localhost:9080/mfpadmin/management-apis/2.0/runtimes/mfp/admin-plugins/liveUpdateAdapter/com.sample.HelloLiveUpdate/schema > schema.txt

スキーマのインポート

curl -X PUT -d @schema.txt --user admin:admin -H "Content-Type:application/json" http://localhost:9080/mfpadmin/management-apis/2.0/runtimes/mfp/admin-plugins/liveUpdateAdapter/com.sample.HelloLiveUpdate/schema
  • 「admin:admin」をユーザー独自のものに置換します (デフォルトは「admin」)。
  • 「localhost」およびポート番号をユーザー独自のものに置換します (必要な場合)。
  • アプリケーション ID「com.sample.HelloLiveUpdate」をユーザー独自のアプリケーション ID に置換します。

セグメントのエクスポート

curl --user admin:admin http://localhost:9080/mfpadmin/management-apis/2.0/runtimes/mfp/admin-plugins/liveUpdateAdapter/com.sample.HelloLiveUpdate/segment?embedObjects=true > segments.txt

セグメントのインポート

#!/bin/bash
segments_number=$(python -c 'import json,sys;obj=json.load(sys.stdin);print len(obj["items"]);' < segments.txt)
counter=0
while [ $segments_number -gt $counter ]
do
    segment=$(cat segments.txt | python -c 'import json,sys;obj=json.load(sys.stdin);data_str=json.dumps(obj["items"]['$counter']);print data_str;')
    echo $segment | curl -X POST -d @- --user admin:admin --header "Content-Type:application/json" http://localhost:9080/mfpadmin/management-apis/2.0/runtimes/mfp/admin-plugins/liveUpdateAdapter/com.sample.HelloLiveUpdate/segment
    ((counter++))
done
  • 「admin:admin」をユーザー独自のものに置換します (デフォルトは「admin」)。
  • 「localhost」およびポート番号をユーザー独自のものに置換します (必要な場合)。
  • アプリケーション ID「com.sample.HelloLiveUpdate」をユーザー独自のアプリケーション ID に置換します。

キャッシュ

キャッシュは、ネットワーク待ち時間を回避するためにデフォルトで有効になっています。 これは、更新が即時に行われない可能性があることを意味します。
より頻繁に更新を行う必要がある場合には、キャッシュを無効にすることができます。

Cordova

オプションの useClientCache ブール値フラグを使用したクライアント・サイド・キャッシュの制御:

	var input = { segmentId :'18' ,useClientCache : false };
        LiveUpdateManager.getConfiguration(input,function(configuration) {
                // do something with resulting configuration, for example:
                // console.log(configuration.data.properties.property-name);  
                // console.log(configuration.data.features.feature-name);
        } ,
    function(err) {
                if (err) {
                   alert('liveupdate error:'+err);
        }
  });

iOS

LiveUpdateManager.sharedInstance.obtainConfiguration("segment-name", useCache: false, completionHandler: { (configuration, error) in
  if error == nil {
    print (configuration?.getProperty("property-name"))
    print (configuration?.isFeatureEnabled("feature-name"))
  } else {
    print (error)
  }
})

Android

LiveUpdateManager.getInstance().obtainConfiguration("segment-name", false, new ConfigurationListener() {

    @Override
    public void onSuccess(final Configuration configuration) {
      Log.i("LiveUpdateSample", configuration.getProperty("property-name"));
      Log.i("LiveUpdateSample", configuration.isFeatureEnabled("feature-name").toString());
    }

    @Override
    public void onFailure(WLFailResponse wlFailResponse) {
        Log.e("LiveUpdateSample", wlFailResponse.getErrorMsg());
    }
});

キャッシュの有効期限

「アダプター」→「ライブ・アップデート・アダプター (Live Update adapter)」に定義されている expirationPeriod 値は、キャッシュの期限が切れるまでの時間の長さを示します。

サンプル・アプリケーションのイメージ

サンプル・アプリケーション

サンプル・アプリケーションで国別フラグを選択します。すると、アプリケーションは、ライブ・アップデートを使用して、選択した国に対応する言語でテキストを出力します。 マップ機能を有効にし、マップを提供すると、対応する国の地図が表示されます。

ここをクリック して Xcode プロジェクトをダウンロードします。
ここをクリック して Android Studio プロジェクトをダウンロードします。

サンプルの使用法

サンプルの README.md ファイルの指示に従ってください。

「ライブ更新設定」の変更

各セグメントは、スキーマからデフォルト値を取得します。 言語に基づいて、個々の値を変更します。 例えば、フランス語の場合、helloText - Bonjour le monde を追加します。

「MobileFirst Operations Console」→「[ご使用のアプリケーション]」→「ライブ更新設定」→ 「セグメント」タブ ** で、例えば、FR** に属している「プロパティー」リンクをクリックします。

  • 「編集」アイコンをクリックして、例えば、フランスの地図を表しているイメージへのリンクを指定します。
  • アプリケーションの使用中に地図を表示するには、includeMap フィーチャーを有効にする必要があります。
Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.
Last modified on November 27, 2019