ヘッダーをスキップ

Oracle Enterprise Pack for Eclipse Oracle Mobile Application Framework (OEPE Edition)でのモバイル・アプリケーションの開発 リリース2.1.2 E64870-01 |
| 目次

前 | 次 |

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

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

この章には次の項が含まれます:

- 第22.1項「制約の概要」

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

## 22.1 制約の概要

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

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

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

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

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

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

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

注意: イメージはプラットフォーム固有のガイドラインに準拠している必要があります(第3.3項「アプリケーション機能の基本情報の定義方法」を参照)。

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

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

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

次の例は、`<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>

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

図22-2に示すように、MAF機能エディタの「制約」フォルダを使用して、選択したアプリケーション機能の制約を宣言的に構成します。

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

1. 図22-3に示すように、「制約」フォルダを右クリックして「新」を選択し、「制約」を選択します。

   図22-3 新規制約の作成

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

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

この項の最初の方にある例と同様に、「制約」フォルダに値を入力すると、定義された`<adfmf:constraint>`要素によってディスクリプタ・ファイルの`<adfmf:constraints>`要素が更新されます。

### 22.2.3 property属性について

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

- `contains`

- `equal`

- `less`

- `more`

- `not`

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

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

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

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

- 権限のリスト。

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

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

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

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

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

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

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

  次の例は、not演算子と`user.privileges`プロパティを使用してアプリケーション機能へのアクセスを制限する方法を示しています。

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

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

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

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

  次の例は、`hardware.networkStatus`プロパティを定義する方法を示しています。

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

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

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

  次の例は、`hardware.hasAccelerometer`プロパティを使用する方法を示しています。

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

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

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

  次の例は、`hardware.hasCamera`プロパティを使用する方法を示しています。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

`name`、`operator`および`value`属性によって定義される静的制約に基づいてアプリケーション機能またはユーザー・インタフェース・コンテンツを表示または非表示にするだけでなく、EL式で制約を定義することによって、モバイル・アプリケーションでアプリケーション機能およびコンテンツを動的に表示することができます。EL式に基づいた制約の動的評価によって、独自のBean論理をコールする式を書いたり、複雑なEL式を書いたり、論理アクセスするアプリケーション・プリファレンスを書くことさえできます。制約をEL式として定義すると、EL式が`false`として評価されたとき、MAFランタイムは、アプリケーション機能を当初は非表示にできますが、同じEL式が`true`として評価されたときには後で表示することができます。EL式を使用した動的制約の定義方法に関する次の例の遅延メソッド式に示すように、`<adfmf:constraintExpression>`要素によって、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>

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

#### 22.2.6.1 静的な制約とEL定義の制約の組合せについて

表示を可能にするためにMAFランタイムが静的な制約のすべての条件を`true`に評価しなければならないのに対して、制約のEL式が`true`として評価されると、同様にアプリケーション機能とコンテンツが表示されますが、式が`false`として評価されると、アプリケーション機能とコンテンツは非表示になります。

#### 22.2.6.2 動的な制約の定義方法

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

制約式コンポーネントを定義するには、次の手順を実行します。

1. 図22-5のように、「制約」フォルダを右クリックして新規を選択し、「制約式」を選択します。

   図22-5 制約式の作成

2. 図22-6に示すように、をクリックして「式ビルダー」ダイアログを開きます。

   図22-6 制約のEL式の構築

3. 「式ビルダー」ダイアログで、リストの中のオブジェクトをダブルクリックし、演算子をダブルクリックし、式を完結させることによって式を作成します。

4. 終了したら、「OK」をクリックします。