ヘッダーをスキップ

Oracle® Fusion Middleware Oracle Mobile Application Frameworkでのモバイル・アプリケーションの開発 2.0.1 E57592-01 |
| 目次

前 | 次 |

# 15 アプリケーション機能に関する制約の設定

この章では、ユーザーのアクセス権限またはデバイス要件に基づいてアプリケーション機能を制限できる制約の設定方法について説明します。

この章の内容は次のとおりです。

- 第15.1項「制約の概要」

- 第15.2項「アプリケーション機能の制約の定義」

## 15.1 制約の概要

制約には、アプリケーション機能またはアプリケーション・コンテンツを使用するタイミングが記述されています。制約では、ユーザーとユーザー・ロール、モバイル・アプリケーションの実行対象となるデバイス、およびデバイス上で使用可能なハードウェアに基づいて、アクセスを制限できます。制約は2つのレベルで設定できます。1つ目のアプリケーション機能レベルでは、ユーザーのデバイスにおけるアプリケーション機能の可視性を制御し、2つ目のコンテンツ・レベルでは、アプリケーション機能に対して配信できるMAFコンテンツのタイプを指定できます。`maf-feature.xml`ファイルの概要エディタでは、これら両方のタイプの制約を設定できます。制約はMAFランタイムによって評価され、エンド・ユーザーが特定のコンテンツを表示または使用したり、アプリケーション機能自体にアクセスできるようにするには、`true`に評価される必要があります。

### 15.1.1 制約を使用したアプリケーション機能の表示または非表示

図15-1に示す「制約」タブでは、アプリケーション機能レベルの制約を設定できます。たとえば、デバイスのカメラを使用するアプリケーション機能は、そのデバイスに実際にカメラ機能があることがMAFランタイムによって確認された場合のみ、モバイル・アプリケーションのナビゲーション・バーまたはSpringboard内に表示されます。また、機能レベルの制約を使用すると、ユーザー・ロールと権限に基づいてアプリケーションを保護することもできます。図15-1に、MAFランタイムによって制約が`true`に評価されたときに、管理者権限を持つユーザーのみにアプリケーション機能への
アクセスを許可する制約を作成する方法を示します。制約がランタイムによって`false`と評価された場合、アプリケーション機能はナビゲーション・バーまたはSpringboard内に表示されないため、エンド・ユーザーはそのアプリケーション機能にアクセスできません。

図15-1 アプリケーション機能レベルの制約の設定

### 15.1.2 制約を使用した特定のコンテンツ・タイプの配信

デバイス・ハードウェア・プロパティやユーザー権限などのファクタに対応するため、単一のアプリケーション機能に複数のコンテンツ・タイプを指定し、ユーザー・インタフェースの様々なバージョンを配信できます。アプリケーション機能のコンテンツに関する制約を設定することによって、アプリケーション・ページを表示できるエンド・ユーザーや、そのページの使用方法を特定する条件を指定できます。

たとえば、「コンテンツ」タブ(図15-2を参照)を使用して、管理権限を付与されたユーザーに特定のタイプのユーザー・インタフェースを表示し、基本的なユーザー権限を持つユーザーに別のユーザー・インタフェースを表示できます。また、コンテンツ・レベルの制約によって、デバイスのレイアウトに関する考慮事項に対応できます。図15-2は、この例として、サンプル・アプリケーションで、デバイスの画面幅に基づく制約を使用して、iPhoneとiPadのレイアウトに合わせて調整されたページをコールするAMXモバイル・タスク・フローを配信する方法を示しています。エンド・ユーザーがサンプル・アプリケーションを起動すると、MAFランタイムによって、Employeesアプリケーション機能に対して設定された制約が評価されます。デバイス画面の対角線幅が6インチを超えることがランタイムによって確認されると、`Employees_pad_taskflow.xml`ファイルが選択され、このファイルによって、iPad用に設計されたMAF AMXページがコールされます。この制約が`false`に評価された(つまり、画面の対角線幅が6インチ未満の)場合は、ランタイムによって、iPhone固有のページをコールするMAFタスクフローである`Employees_phone_taskflow.xml`が選択されます。さらに、「コンテンツ」タブを使用すると、ランタイムによって特定のコンテンツが選択されたときに表示されるナビゲーション・バーとSpringboardのイメージを選択できます。コンテンツ固有のイメージを選択しなかった場合、MAFでは、「一般」タブで指定されたアプリケーション機能レベルのイメージが使用されます。

注意: 第4.9.1項「アプリケーション機能の基本情報の定義方法」で説明されているように、イメージはプラットフォーム固有のガイドラインに準拠している必要があります。

図15-2 コンテンツ・レベルの制約の設定

サンプル・アプリケーションの詳細は、付録F「サンプルのモバイル・アプリケーション・フレームワーク・アプリケーション」を参照してください。

## 15.2 アプリケーション機能の制約の定義

アプリケーション機能レベルの制約を設定する際、`<adfmf:constraint>`要素(`<adfmf:constraints>`の子要素)の`property`、`operator`および`value`属性を使用すると、ユーザー、デバイスまたはハードウェアに基づいてアプリケーションの使用を制限できます。例15-1に示すこれらの属性の定義の例は、アプリケーション機能へのアクセスをField Repに制限し、さらにiOSデバイスでのみアプリケーションを実行するように制限する属性の定義を示しています。

例15-1 <adfmf:constraint>要素

    <adfmf:constraints>
          <adfmf:constraint property="user.roles"
                            operator="contains"
                            value="Field Rep"/>
          <adfmf:constraint property="device.model"
                            operator="contains"
                            value="ios"/>
    </adfmf:constraints>

### 15.2.1 アプリケーション機能に制約を定義する方法

図15-2に示すように、「機能」ページの「制約」タブを使用して、選択したアプリケーション機能の制約を宣言的に構成します。

アプリケーション機能の制約を定義するには:

1. 「制約」タブをクリックします。

2. 「追加」をクリックします。

3. プロパティと適切な演算子を選択し、値を入力します。プロパティの使用の詳細は、第15.2.3項「property属性について」を参照してください。

### 15.2.2 制約を定義する場合の処理

「制約」タブに値を入力すると、例15-1と同様に、定義された`<adfmf:constraint>`要素で識別子ファイルの`<adfmf:constraints>`要素が更新されます。

### 15.2.3 property属性について

MAFでは、ユーザー、デバイスおよびハードウェアの各プロパティを反映する一連の`property`属性が提供されています。これらのプロパティを次の演算子と組み合せて使用することでアプリケーション機能の使用方法が決定されます。

- `contains`

- `equal`

- `less`

- `more`

- `not`

### 15.2.4 ユーザー制約とアクセス制御について

ユーザーがモバイル・アプリケーションにログインすると、MAFモバイル・ランタイムでは、アプリケーション機能ごとに構成されたユーザー・ロール・ベースの制約を、アクセス制御サービス(ACS)によって取得されたユーザー・ロールと権限に対して調整します。その後、MAFでは、制約を満たす権限を持つエンド・ユーザーにのみ、アプリケーション機能(またはアプリケーション機能のコンテンツ)を提供します。このようなユーザー権限とロールに関する制約を設定するだけでなく、「MAFログイン接続の作成」ダイアログに次の項目を入力することによって、モバイル・アプリケーション用のアクセス制御を作成できます(図15-3および第21.5.2項「ログイン・ページの指定方法」を参照)。

- ユーザー・ロールと権限を送信するREST WebサービスのURL。

- アプリケーション機能によってチェックされるユーザー・ロールのリスト。

- 権限のリスト。

第21.4.17項「アクセス制御サービスに関する必知事項」も参照してください。

図15-3 ユーザー・ロールと権限の取得の構成

`user.roles`および`user.privileges`に基づく制約を使用してアプリケーション機能へのアクセスを制御します。たとえば、アプリケーション機能へのアクセスをmanagerロールを持つユーザーのみに許可するには、`user.roles contains manager`の制約をアプリケーション機能の定義に追加する必要があります。

`user.roles`および`user.privileges`では、`contains`および`not`の演算子を次のように使用します。

- `contains`: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれる場合、ランタイムではその制約を`true`に評価します。例15-2には、`contains`演算子を使用した`user.roles`プロパティの使用の例が示されています。ユーザーのロールに従業員のロールが含まれている場合は、モバイル・アプリケーションにアプリケーション機能が表示されます。

  例15-2 ユーザー・ロール・コレクションに対するcontains演算子の使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="user.roles"
                        operator="contains"
                        value="employee" />
         </constraints>
         ...
      </feature>

- `not`: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれない場合、ランタイムではその制約を`true`に評価します。例15-3では、ユーザーの権限に管理者権限が含まれる場合はアプリケーション機能が含められません。

  例15-3 not演算子とuser.privilegesプロパティを使用したアプリケーション機能へのアクセスの制限

      <feature ...>
         ...
         <constraints>
            <constraint property="user.privileges"
                        operator="not"
                        value="manager" />
         </constraints>
         ...
      </feature>

### 15.2.5 ハードウェア関連の制約について

ハードウェア・オブジェクトは、カメラの有無、コンパス向首方向情報提供機能、ファイルの保存機能など、デバイスで使用可能なハードウェアを参照します。次のプロパティでは`equal`演算子が使用されます。

- `hardware.networkStatus`: アプリケーションの起動時にネットワークの状態が表示されます。`NotReachable`、`CarrierDataConnection`および`WiFiConnection`の3つの属性値を使用してこのプロパティを変更できます。例15-4は、この3つ目の値を示しています。その例に示すとおり、この値を設定することで、デバイス・ハードウェアがWi-Fi接続があることを示している場合にのみモバイル・アプリケーションにこのモバイル・アプリケーション機能が表示されることになります。つまり、デバイスにWi-Fi接続がない場合は、モバイル・アプリケーションをロードしても、そのアプリケーション機能は表示されません。

  例15-4 hardware.networkStatusプロパティの定義

      <feature ...>
      ...
         <constraints>
            <constraint property="hardware.networkStatus"
                        operator="equal"
                        value="WiFiConnection" />
         </constraints>
      ...
      </feature>

  注意: この制約は、iOSデバイスの起動時に評価されます。起動時にデバイスにWi-Fi接続がなく、その後その接続を取得した場合(ユーザーがWi-Fiのホットスポットに入った場合など)、アプリケーション機能は無効のままとなり、ユーザーがモバイル・アプリケーションを停止し再起動するまで利用できません。

- `hardware.hasAccelerometer`: デバイスに加速度計があるかどうかを示します。このプロパティは、`true`または`false`の値で定義します。例15-5は、`true`の値を示しており、ハードウェアに加速度計がある場合にのみこのアプリケーション機能が利用可能なことを示しています。

  例15-5 hardware.hasAccelerometerプロパティの使用方法

      <feature ...>
      ...
         <constraints>
            <constraint property="hardware.hasAccelerometer"
                        operator="equal"
                        value="true" />
      </constraints>
      ...
      </feature>

  注意: iOSベースのハードウェアにはすべて加速度計があるため、このプロパティは常に`true`の値にして、iOSデバイスでアプリケーション機能が利用できるようにしておく必要があります。

- `hardware.hasCamera`: デバイスにカメラがあるかどうかを示します。この制約は、`true`または`false`の属性値を使用して定義します。例15-6は、値が`true`に設定されており、デバイスにカメラが含まれている場合にのみアプリケーション機能が利用可能なことを示しています。

  例15-6 hardware.hasCameraプロパティの使用方法

      <feature ...>
      ...
         <constraints>
            <constraint property="hardware.hasCamera"
                        operator="equal"
                        value="true" />
      </constraints>
      ...
      </feature>

  注意: すべてのiOSベース・ハードウェアにカメラが搭載されているわけではありません。この値は、iOSデバイスでモバイル・アプリケーションを起動したときに動的に評価されます。そのときに、モバイル・アプリケーションでは、`true`に評価されないアプリケーション機能が削除されます。

- `hardware.hasCompass`: デバイスにコンパスがあるかどうかを示します。この制約は、例15-7に示すように、`true`または`false`の属性値を使用して定義します。

  例15-7 hardware.hasCompassプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.hasCompass"
                        operator="equal"
                        value="true" />
         </constraints>
         ...
      </feature>

  注意: すべてのiOSデバイスにコンパスがあるわけではありません。この値は、iOSデバイスでモバイル・アプリケーションを起動したときに動的に評価されます。そのときに、モバイル・アプリケーションでは、`true`に評価されないアプリケーション機能が削除されます。

- `hardware.hasContacts`: デバイスにアドレス帳またはコンタクト先があるかどうかを示します。この制約は、例15-8に示すように、`true`または`false`の属性値を使用して定義します。

  例15-8 hardware.hasContactsプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.hasContacts"
                        operator="equal"
                        value"=true" />
            </constraints>
         ...
      </feature>

  注意: iOSベースのハードウェアのコンタクト先はApache Cordova経由でアクセスされるため、iOSデバイスに対しては`value`属性は常に`true`に設定されます。

- `hardware.hasFileAccess`: デバイスでファイル・アクセスが可能かどうかを示します。この制約は、例15-9に示すように、`true`または`false`の属性値を使用して定義します。ランタイムがこの制約を`true`に評価した場合にのみ、アプリケーション機能を利用できます。

  例15-9 hardware.hasFileAccessプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.hasFileAccess"
                        operator="equal"
                        value="true" />
         </constraints>
         ...
      </feature>

  注意: iOSベースのハードウェアのファイル・アクセスはApache Cordova経由でアクセスされるため、iOSデバイスに対しては`value`属性は常に`true`になります。

- `hardware.hasGeoLocation`: デバイスが地理的位置情報サービスを提供しているかどうかを示します。この制約は、例15-10に示すように、`true`または`false`の属性値を使用して定義します。デバイスが地理的位置情報をサポートする場合にのみ、アプリケーション機能を利用できます。

  例15-10 hardware.hasGeoLocationプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.hasGeoLocation"
                        operator="equal"
                        value="true"/>
         </constraints>
         ...
      </feature>

  注意: Apache Cordovaでは、すべてのiOSデバイスに対して地理的位置情報サービスへのアクセスを提供しているわけではありません。デバイスによっては、制約がランタイムにより評価された場合に、アプリケーション機能が利用できない可能性があります。

- `hardware.hasLocalStorage`: デバイスがファイルのローカル記憶域を提供するかどうかを示します。この制約は、例15-11に示すように、`true`または`false`の`value`属性を使用して定義します。デバイスがローカルでのファイルの格納をサポートする場合にのみ、アプリケーション機能が表示されます。

  例15-11 hasLocalStorageプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.hasLocalStorage"
                        operator="equal"
                        value="true" />
         </constraints>
         ...
      </feature>

  注意: Apache CordovaではすべてのiOSハードウェアでローカル・ファイル記憶域へのアクセスが提供されるため、iOSデバイスに対する`value`属性は常に`true`になります。

- `hardware.hasMediaPlayer`: デバイスにメディア・プレーヤがあるかどうかを示します。この制約は、例15-12に示すように、`true`または`false`の`value`属性を使用して定義します。デバイスにメディア・プレーヤがある場合にのみ、アプリケーション機能が表示されます。

  例15-12 hardware.hasMediaPlayerプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.hasMediaPlayer"
                        operator="equal"
                        value="true" />
         </constraints>
         ...
      </feature>

  注意: Apache CordovaではiOSベースのハードウェアでメディア・プレーヤへのアクセスを提供しているため、iOSデバイスでは`value`属性は常に`true`になります。

- `hardware.hasMediaRecorder`: デバイスにメディア・レコーダがあるかどうかを示します。この制約は、例15-13に示すように、`true`または`false`の`value`を使用して定義します。デバイス・ハードウェアがメディア・レコーダをサポートする場合にのみ、アプリケーション機能が含まれます。

  例15-13 hardware.hasMediaRecorderプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.hasMediaRecorder"
                        operator="equal"
                        value="true" />
         </constraints>
         ...
      </feature>

  注意: すべてのiOSベースのハードウェアにApache Cordovaからアクセス可能なメディア・レコーダがあるため、すべてのiOSデバイスでこの値を`true`に設定します。Apple iTouchなどのいくつかのデバイスにはマイクがありませんが、エンド・ユーザーは外部マイクを取り付けることでレコーディングが可能になります。

- `hardware.hasTouchScreen`: ハードウェアにタッチ・スクリーン機能があるかどうかを示します。この制約は、例15-14に示すように、`true`または`false`の`value`属性を使用して定義します。デバイス・ハードウェアがタッチ・スクリーンをサポートする場合にのみ、アプリケーション機能が含められます。

  例15-14 hardware.hasTouchScreenプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.hasTouchScreen"
                        operator="equal"
                        value="true" />
         </constraints>
         ...
      </feature>

  注意: すべてのiOSベースのハードウェアにタッチ・スクリーン機能があるため、iOSデバイスの`value`属性を`true`に設定します。

- `hardware.screen.width`: デバイスの現在の向きでの画面幅を示します。画面幅を、デバイスに表示される実際のピクセルを表す物理デバイス・ピクセル単位ではなく、論理デバイス・ピクセル単位(例15-15では320)で示す数値を入力します。この値はデバイスの向きによって異なります。

  例15-15 hardware.screen.widthプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.screen.width"
                        operator="equal"
                        value="320" />
         </constraints>
         ...
      </feature>

  注意: この値はモバイル・アプリケーションの起動時に評価され、その際にランタイムが制約を評価し、`true`に評価されない制約を持つアプリケーション機能は削除されます。アプリケーション機能の設定はモバイル・アプリケーションの起動後に固定されるため、モバイル・アプリケーションの起動後にユーザーがデバイスを回転した場合、この制約はMAFのランタイムによって再評価されません。

- `hardware.screen.height`: デバイスの現在の位置における画面高さを示します。例15-16に示すように、320や480などの画面高さ(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

  例15-16 hardware.screen.heightプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.screen.height"
                        operator="equal"
                        value="480" />
         </constraints>
         ...
      </feature>

  注意: モバイル・アプリケーションの起動時に、`true`に評価されない制約を持つアプリケーション機能を削除するプロセスの一部として、この制約の画面高さの値がMAFランタイムによって評価されます。アプリケーション機能の設定はモバイル・アプリケーションの起動後に固定されるため、モバイル・アプリケーションの起動後にユーザーがデバイスの向きを変えた場合、この制約はランタイムによって再評価されません。

- `hardware.screen.availableWidth`: デバイスの現在の向きで利用可能な画面幅を示します。例15-17に示すように、320や480などの画面幅(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

  例15-17 hardware.screen.availableWidthプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.screen.availableWidth"
                        operator="equal"
                        value"320" />
         </constraints>
         ...
      </feature>

- `hardware.screen.availableHeight`: デバイスの現在の位置で利用可能な画面高さを示します。例15-18に示すように、320や480などの画面幅(論理ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

  例15-18 hardware.screen.availableHeightプロパティの使用方法

      <feature ...>
         ...
         <constraints>
            <constraint property="hardware.screen.availableHeight"
                        operator="equal"
                        value"480" />
         </constraints>
         ...
      </feature>

### 15.2.6 アプリケーション機能およびコンテンツに関する動的制約の作成

`name`、`operator`および`value`属性で定義された静的制約に基づいてアプリケーション機能またはユーザー・インタフェースの表示と非表示を設定する以外にも、EL式を使用して制約を定義することにより、アプリケーション機能およびコンテンツを動的にレンダリングできるようにモバイル・アプリケーションを設定できます。EL式に基づいて制約を動的に評価すると、独自のBeanロジックをコールできる式を記述したり、複雑なEL式を記述したり、アプリケーション・プリファレンスにアクセスするロジックを記述することもできます。制約をEL式として定義することで柔軟性が向上し、MAFランタイムで、EL式が`false`として評価された場合は最初にアプリケーション機能を非表示にするが、後で同じEL式が`true`として評価されたときには表示するようにできます。例15-19の遅延メソッド式に示しているように、`<adfmf:constraintExpression>`要素を使用すると、EL式を使用してアプリケーション機能に対する制約を定義できます。

例15-19 EL式を使用した動的制約の定義

    <adfmf:constraints>
       <adfmf:constraint id="c1" property="hardware.screen.dpi" operator="more" value="120"/>
       <adfmf:constraint id="c2" property="device.model" operator="equal" value="iPad"/>
       <adfmf:constraintExpression id="c3" value="#{myBean.checkConstraint}"/>
    </adfmf:constraints>

例15-19でも示されているように、`maf-feature.xml`ファイルの`<adfmf:constraints>`要素内で定義された静的制約間でこの要素をネストできます。詳細は、Oracle Fusion Middleware Oracle Mobile Application Frameworkのタグ・リファレンスを参照してください。

#### 15.2.6.1 静的制約とEL定義制約の結合について

MAFランタイムによる表示を有効にするには、静的制約のすべての条件が`true`に評価される必要があります。制約EL式が`true`として評価された場合はアプリケーション機能およびコンテンツが表示され、式が`false`として評価された場合はそれらが非表示になります。

#### 15.2.6.2 動的コンテンツの定義方法

静的制約とは異なり、動的制約の作成(または更新)を行う場合は、`maf-feature.xml`概要エディタを使用しません。かわりに、制約式コンポーネントをソース・エディタまたは「構造」ウィンドウにドラッグし、式ビルダーを使用してこのコンポーネントにEL式を移入することにより、`<adfmf:constraintExpression>`を作成します。

制約式コンポーネントを定義するには:

1. `maf-feature.xml`ファイルのソース・エディタを選択します。

2. `<adfmf-constraints>`要素に移動します。

3. 「コンポーネント」ウィンドウで、「共通」コンポーネントを選択します(図15-4を参照)。

   図15-4 制約式コンポーネント

4. 制約式コンポーネントを選択し、次のいずれかの方法を使用して`<adfmf-constraints>`要素に追加します。

   - 「コンポーネント」ウィンドウで、制約式コンポーネントをダブルクリックします。

   - 制約式コンポーネントをソース・エディタの`<adfmf-constraints>`要素にドラッグします。

   - 制約式コンポーネントを「構造」ウィンドウの「制約」ノードにドラッグします。

5. 図15-5に示すように、「constraintExpressionの挿入」ダイアログでEL式を入力するか、式ビルダー(このダイアログ内の「プロパティ・メニュー」アイコン(ギア)をクリックしてアクセス)を使用してEL式を作成します。

   図15-5 InsertconstraintExpessionダイアログを使用したEL制約の定義

   例15-19は、「ADFマネージドBean」カテゴリからのEL式の作成を示しています。ただし、制約のEL式は、第7.3.5項「式ビルダーのカテゴリについて」で説明されているカテゴリのいずれからでも作成できます。

   注意: `adfc-mobile-config.xml`に定義されているアプリケーション・スコープのマネージドBeanのみが制約のEL式に使用できます。

   図15-6 制約のEL式の作成

6. 「OK」をクリックします。