22 アプリケーション機能に関する制約の設定
この章の内容は次のとおりです。
制約の概要
制約は、アプリケーション機能レベルまたはコンテンツ・レベルのどちらかで設定され、機能やコンテンツをいつ使用する必要があるかを示します。制約によってアクセスを制限できます。また、制約は実行時に評価されます。
制約には、アプリケーション機能またはアプリケーション・コンテンツを使用するタイミングが記述されています。制約では、ユーザーとユーザー・ロール、モバイル・アプリケーションの実行対象となるデバイス、およびデバイス上で使用可能なハードウェアに基づいて、アクセスを制限できます。制約は2つのレベルで設定でき、1つ目のアプリケーション機能レベルでは、ユーザーのデバイスにおけるアプリケーション機能の可視性を制御し、2つ目のコンテンツ・レベルでは、アプリケーション機能に対して配信できるMAFコンテンツのタイプを指定できます。maf-feature.xml
ファイルの概要エディタを使用すると、これら両方のタイプの制約を設定できます。制約はMAFランタイムによって評価され、エンド・ユーザーが特定のコンテンツを表示または使用したり、アプリケーション機能自体にアクセスできるようにするには、true
に評価される必要があります。
制約を使用したアプリケーション機能の表示または非表示
MAF機能エディタの「コンテンツ」フォルダには、「制約」フォルダが保持されています。MAFランタイムは制約を評価して、設定された制約値に応じてコンテンツを表示または非表示にします。
「制約」タブでは、アプリケーション機能レベルの制約を設定できます。たとえば、デバイスのカメラを使用するアプリケーション機能は、そのデバイスに実際にカメラ機能があることがMAFランタイムによって確認された場合にのみ、モバイル・アプリケーションのナビゲーション・バーまたはSpringboard内に表示されます。また、機能レベルの制約を使用すると、ユーザー・ロールと権限に基づいてアプリケーションを保護することもできます。MAFランタイムによって制約がtrue
に評価されたときに、管理者権限を持つユーザーのみにアプリケーション機能へのアクセスを許可する制約を作成する方法を図に示します。ランタイムによって制約がfalse
と評価された場合、アプリケーション機能はナビゲーション・バーまたはスプリングボード内に表示されないため、そのアプリケーション機能にユーザーはアクセスできなくなります。
制約を使用した特定のコンテンツ・タイプの配信
デバイス・ハードウェア・プロパティなどのファクタに対応するため、単一のアプリケーション機能に複数のコンテンツ・タイプを指定し、ユーザー・インタフェースの様々なバージョンを配信できます。アプリケーション機能のコンテンツに関する制約を設定することで、アプリケーション・ページを表示できるユーザーや、そのページの使用方法を決定します。
たとえば、「コンテンツ」タブを使用して、管理権限を付与されたユーザーに特定のタイプのユーザー・インタフェースを表示し、基本的なユーザー権限を持つユーザーに別のユーザー・インタフェースを表示できます。また、コンテンツ・レベルの制約によって、デバイスのレイアウトに関する考慮事項に対応できます。この例として、サンプル・アプリケーションでデバイスの画面幅に基づく制約を使用して、iPhoneとiPadのレイアウトにあわせて調整されたページをコールするAMXモバイル・タスク・フローを配信する方法を図に示します。ユーザーがサンプル・アプリケーションを起動すると、MAFランタイムによって、Employeesアプリケーション機能に設定された制約が評価されます。ランタイムは、デバイス画面の対角線が6インチを超えることを確認した場合、Employees_pad_taskflow.xml
ファイルを選択し、これにより、iPad用に設計されたMAF AMXページがコールされます。この制約がfalse
に評価された(つまり、画面の対角線幅が6インチ未満の)場合は、ランタイムによって、iPhone固有のページをコールするMAFタスク・フローであるEmployees_phone_taskflow.xml
が選択されます。さらに、「コンテンツ」タブを使用すると、ランタイムによって特定のコンテンツが選択されたときに表示されるナビゲーション・バーとSpringboardのイメージを選択できます。コンテンツ固有のイメージを選択しなかった場合、MAFでは、「一般」タブで指定されたアプリケーション機能レベルのイメージが使用されます。
注意:
「アプリケーション機能の表示プロパティの設定」で説明されているように、イメージはプラットフォーム固有のガイドラインに準拠している必要があります。
サンプル・アプリケーションの詳細は、「サンプルのMAFアプリケーション」を参照してください。
アプリケーション機能の制約の定義
アプリケーション機能レベルの制約は、アプリケーションの使用を制限するために設定します。<adfmf:constraint>
要素のproperty
属性、operator
属性、およびvalue
属性を使用して制限を定義します。
アプリケーション機能レベルの制約を設定する際、<adfmf:constraint>
要素(<adfmf:constraints>
の子要素)のproperty
、operator
およびvalue
属性を使用すると、ユーザー、デバイスまたはハードウェアに基づいてアプリケーションの使用を制限できます。次の例に示すこれらの属性の定義の例は、アプリケーション機能へのアクセスをField Repに制限し、さらにiOSデバイスでのみアプリケーションを実行するように制限する属性の定義を示しています。
<adfmf:constraints> <adfmf:constraint property="user.roles" operator="contains" value="Field Rep"/> <adfmf:constraint property="device.model" operator="contains" value="ios"/> </adfmf:constraints>
アプリケーション機能に制約を定義する方法
MAF機能エディタの「制約」フォルダを使用して、選択したアプリケーション機能の制約を定義する手順を使用してください。
図22-2に示すように、「機能」ページの「制約」タブを使用して、選択したアプリケーション機能の制約を宣言的に構成します。
アプリケーション機能の制約を定義するには:
- 「制約」タブをクリックします。
- 「追加」をクリックします。
- プロパティと適切な演算子を選択し、値を入力します。「property属性について」を参照してください。
制約を定義する場合の処理
「アプリケーション機能の制約の定義」に示されている例と同様に、「制約」タブに値を入力すると、定義された<adfmf:constraint>
要素を使用して、識別子ファイルの<adfmf:constraints>
要素が更新されます。
property属性について
プロパティのセットを演算子および適切な値と組み合せて、アプリケーション機能の使用方法を決定します。
MAFには、ユーザー、デバイスおよびハードウェアの各プロパティを反映するproperty
属性のセットが用意されています。これらのプロパティを次の演算子と組み合せて使用することでアプリケーション機能の使用方法が決定されます。
-
contains
-
equal
-
less
-
more
-
not
ユーザー制約とアクセス制御について
MAFランタイムは、構成済のユーザー・ロールベースの制約および関連付けられた権限とユーザー・ログインを照合します。アプリケーション機能へのアクセスは、user.roles
とuser.privileges
に基づく制約を使用することで管理します。
ユーザーがモバイル・アプリケーションにログインした後、MAFランタイムでは、アプリケーション機能ごとに構成されたユーザー・ロールベースの制約を、アクセス制御サービス(ACS)によって取得されたユーザー・ロールと権限に対して調整します。その後MAFでは、制約を満たす権限を持つエンド・ユーザーにのみ、アプリケーション機能(またはアプリケーション機能のコンテンツ)を提供します。このようなユーザー権限とロールに関する制約を設定するだけでなく、「MAFログイン接続の作成」ダイアログに次の項目を入力することによって、モバイル・アプリケーション用のアクセス制御を作成できます(次の図および「ログイン・ページの指定方法」を参照)。
-
ユーザー・ロールと権限を送信するREST WebサービスのURL。
-
アプリケーション機能によってチェックされるユーザー・ロールのリスト。
-
権限のリスト。
「アクセス制御サービスに関する必知事項」も参照してください。
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
に評価します。次の例では、ユーザーの権限にマネージャ権限が含まれる場合はアプリケーション機能が含まれません。<feature ...> ... <constraints> <constraint property="user.privileges" operator="not" value="manager" /> </constraints> ... </feature>
ハードウェア関連の制約について
ハードウェア関連の制約は、ハードウェアを使用する機能がデバイスで使用できるようにするために設定します。制約のhardware.hasCamera
、hardware.screen.height
、hardware.hasCompass
などは属性値のtrue
またはfalse
で定義して、その値がtrue
の場合は機能を使用できるようにします。
ハードウェア・オブジェクトは、カメラの有無、コンパス向首方向情報提供機能、ファイルの保存機能など、デバイスで使用可能なハードウェアを参照します。次のプロパティではequal
演算子が使用されます。
-
hardware.networkStatus
: アプリケーションの起動時にネットワークの状態が表示されます。NotReachable
、CarrierDataConnection
およびWiFiConnection
の3つの属性値を使用してこのプロパティを変更できます。次の例は、後者の値を示しています。その例に示すとおり、この値を設定することで、デバイス・ハードウェアがWi-Fi接続があることを示している場合にのみモバイル・アプリケーションにこのモバイル・アプリケーション機能が表示されることになります。つまり、デバイスにWi-Fi接続がない場合は、モバイル・アプリケーションをロードしても、そのアプリケーション機能は表示されません。<feature ...> ... <constraints> <constraint property="hardware.networkStatus" operator="equal" value="WiFiConnection" /> </constraints> ... </feature>
注意:
この制約は、iOSデバイスの起動時に評価されます。起動時にデバイスにWi-Fi接続がなく、その後その接続を取得した場合(ユーザーがWi-Fiのホットスポットに入った場合など)、アプリケーション機能は無効のままとなり、ユーザーがモバイル・アプリケーションを停止し再起動するまで利用できません。
-
hardware.hasAccelerometer
: デバイスに加速度計があるかどうかを示します。このプロパティは、true
またはfalse
の値で定義します。次の例は、true
の値を示しており、ハードウェアに加速度計がある場合にのみこのアプリケーション機能が利用可能なことを示しています。<feature ...> ... <constraints> <constraint property="hardware.hasAccelerometer" operator="equal" value="true" /> </constraints> ... </feature>
注意:
iOSベースのハードウェアにはすべて加速度計があるため、このプロパティは常に
true
の値にして、iOSデバイスでアプリケーション機能が利用できるようにしておく必要があります。 -
hardware.hasCamera
: デバイスにカメラがあるかどうかを示します。この制約は、true
またはfalse
の属性値を使用して定義します。次の例では、値がtrue
に設定され、デバイスにカメラが含まれる場合にのみアプリケーション機能が利用可能なことを示しています。<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>
アプリケーション機能およびコンテンツに関する動的制約の作成
EL式で定義した制約により、モバイル・アプリケーションはアプリケーション機能とコンテンツを動的にレンダリングするようになります。false
と評価されたEL式がその後でtrue
と評価されることがあるという点で、EL式による定義には柔軟性があります。
name
、operator
およびvalue
属性によって定義される静的制約に基づいてアプリケーション機能またはユーザー・インタフェース・コンテンツを表示または非表示にするだけでなく、EL式で制約を定義することによって、モバイル・アプリケーションでアプリケーション機能およびコンテンツを動的に表示することができます。EL式に基づいた制約の動的評価によって、独自のBean論理をコールする式を書いたり、複雑なEL式を書いたり、論理アクセスするアプリケーション・プリファレンスを書くことさえできます。制約をEL式として定義すると、EL式がfalse
として評価されたとき、MAFランタイムは、アプリケーション機能を当初は非表示にできますが、同じEL式がtrue
として評価されたときには後で表示することができます。次の例の遅延メソッド式に示しているように、<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>
要素内で定義された静的制約間で<adfmf:constraintExpression>要素をネストする方法を示しています。Oracle Mobile Application Frameworkタグ・リファレンスを照してください。
静的制約とEL定義制約の結合について
MAFランタイムによる表示を有効にするには、静的制約のすべての条件がtrue
に評価される必要があります。制約EL式がtrue
として評価された場合はアプリケーション機能およびコンテンツが表示され、式がfalse
として評価された場合はそれらが非表示になります。
動的コンテンツの定義方法
動的制約は、「制約式」コンポーネントを「ソース」エディタ内または「構造」ウィンドウ内にドラッグし、そのコンポーネントにEL式を移入して<adfmf:constraintExpression>
を作成することで定義します。「制約式」コンポーネントを定義する手順を使用してください。
静的制約とは異なり、maf-feature.xml
概要エディタを使用して、動的制約の作成および更新を行うことはありません。かわりに、「制約式」コンポーネントを「ソース」エディタまたは「構造」ウィンドウにドラッグすることで<adfmf:constraintExpression>
を作成し、次に「式ビルダー」を使用してこのコンポーネントにEL式を移入します。
「制約式」コンポーネントを定義するには: