23 通知の有効化と使用方法
この章の内容は次のとおりです。
通知の概要
通知とは、ユーザーの操作なしで(アプリケーションの実行中はアプリケーション外部で)ユーザーが受信する警告やバナーなどのオーディオ信号、ビジュアル信号、またはオーディオ/ビジュアル信号のことです。プッシュ通知は、サーバーなどの外部ソースからモバイル・デバイス上の登録済アプリケーションに送信されます。また、ローカル通知は、アプリケーションによって送信され、そのアプリケーションによって受信されます。
通知は、モバイル・アプリケーションの標準のユーザー・インタフェース以外でユーザーに提供されるシグナルです。これらの通知は、アプリケーションの状態とユーザー設定に応じて、アラート・メッセージやバナーとして表示されます。通知は、視覚的に、または音で(あるいはその両方で)配信できます。
主な通知のタイプには、次の2つがあります。
-
プッシュ通知は、サーバーなどの外部ソースからモバイル・デバイス上のアプリケーションに送信されます。通知を受信したユーザーは、アプリケーションを起動するか、その通知を無視できます。無視した場合はアプリケーションがアクティブになりません。
図23-1は、iOSデバイスにおけるプッシュ通知アラートを示しています。
図23-1 プッシュ通知
プッシュ通知を受信するには、アプリケーションを通知サービスに登録する必要があります。登録が成功すると、通知サービスからアプリケーションにトークンが発行されます。アプリケーションでは、このトークンを(リモート・サーバー上の)プロバイダと共有します。これにより、プロバイダから、通知サービスを通じてアプリケーションに通知を送信できるようになります。「プッシュ通知の有効化」で説明されているように、アプリケーションから提供された登録構成を使用して、アプリケーションのかわりにMAFによって登録が行われます。登録は、有効なトークンを確保するため、MAFアプリケーションのすべての起動時に発生します。登録が成功すると、MAFでは、プラットフォーム固有の通知サービスから取得したトークンをプロバイダと共有します。iOSの場合、この通知サービスはApple Push Notification Service (APNs)です。Google Cloud Messaging (GCM) for Androidでは、Androidデバイスにインストールされたアプリケーション用の通知サービスが提供されます。
MAFアプリケーションでは、その状態にかかわらずプッシュ通知を受信できます。これらのメッセージは、アプリケーションがフォアグラウンドで実行されていなくても表示される場合があり、その表示形式はMAFアプリケーションの状態とユーザー設定によって異なります。表23-1では、iOSオペレーティング・システムで、MAFアプリケーションの状態に応じて、どのようにプッシュ通知が処理されるかを説明します。
表23-1 iOSデバイスにおけるプッシュ通知の処理
状態 アクション MAFアプリケーションはインストールされているが、実行されていない。
通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、MAFアプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。
MAFアプリケーションがバックグラウンドで実行されている。
通知メッセージが登録済の通知スタイル(なし、バナーまたはアラート)で表示されます。ユーザーがメッセージをタップ(バナー・スタイルの通知の場合)するか、アクション・ボタンをタッチ(メッセージがアラートとして表示される場合)すると、MAFアプリケーションが起動し、アプリケーション通知ハンドラが呼び出されます。
MAFアプリケーションがフォアグラウンドで実行されている。
通知メッセージは表示されません。アプリケーション通知ハンドラが呼び出されます。
iOSおよびAndroidプラットフォームでは、アプリケーションがフォアグラウンドで実行されていない場合、そのアプリケーションに関連付けられているすべてのプッシュ通知メッセージが、iOS Notification CenterやAndroidデバイス上の通知ドロワーなど、特定の場所に格納されます。
-
ローカル通知は、モバイル・アプリケーション内から発信され、同じアプリケーションによって受信されます。通知は、モバイル・デバイスのプラットフォームでサポートされる標準メカニズム(バナーやサウンドなど)を通じてユーザーに配信されます。
MAFに附属するローカル通知抽象化APIを使用してアプリケーションを構成し、即座に通知を起動するか、将来の日時に通知するようスケジュールできます。また、通知の繰返しパターンを設定したり(毎日や毎週など)、スケジュール済の通知を取り消すことができます。
iOSとAndroidプラットフォームの両方で、MAFアプリケーションがフォアグラウンドで実行されている場合、通知はユーザーとの対話なしでアプリケーションに直接配信されます。アプリケーションがバックグラウンドで実行されているか、まったく実行されていない場合、通知はユーザーが通知をタップした後でアプリケーションに配信されます。
ユニバーサルWindowsプラットフォーム上のMAFアプリケーションは、ローカル通知またはプッシュ通知をサポートしていません。
プッシュ通知の有効化
アプリケーションでPushPluginプラグインを有効にし、MAF提供のAPIを使用するコードを記述します。
次のタスクを実行することで、プッシュ通知を有効にできます。
注意:
iOS用MAFのデプロイメント・プロファイルには、プッシュ通知環境ドロップダウン・リストが表示されます。このドロップダウン・リストでは、Production
またはDevelopment
を選択して、デプロイ済アプリケーションをApple Push Notification Service (APNs)に登録できます。デフォルト値はProduction
です。iOSにデプロイするMAFアプリケーションに、この値を適切に設定します。プッシュ通知を有効にするためにPushPluginプラグインも選択しないと、MAFは選択した値を無視します。詳細は、「iOSビルド・オプションの定義」を参照してください。
MAFサンプル・アプリケーション(PushDemoおよびPushServer)によって、プッシュ通知の処理方法を示します。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install
/jdeveloper/jdev/extensions/oracle.maf/Samples
ディレクトリのPublicSamples.zip
ファイル内にあります。
MCSからのプッシュ通知のためのデバイスの登録方法
MAFアプリケーションでプッシュ通知を有効にし、デバイスをMCSに登録して、デバイスのMCSからプッシュ通知を受信します。
MCSからのプッシュ通知をデバイスで受信できるようにするには、デバイスをMCSに登録する必要があります。登録はアプリケーションに固有であるため、各MAFアプリケーションをMCSに登録する必要がります。これを行う前に、プッシュ通知の有効化で説明されているように、MAFアプリケーションでプッシュ通知を有効にします。
MCSPersistenceManager
内の次のメソッドを使用して、デバイスとアプリケーションの組合せをMCSに登録します。次のコードは、アプリケーションにmobile-persistence-config.properties
ファイルが含まれていることを前提にしています。このファイルは、MAFクライアント・データ・モデルの各ウィザードの使用時に生成され、MAFアプリケーションのデータ・モデルを作成します(「MAFアプリケーションでのクライアント・データ・モデルの作成」を参照)。
public String registerDevice(String token, String appId, String appVersion)
このメソッドは、プッシュ通知の有効化で説明されているように、EventListener
インタフェースを実装するプッシュ通知イベント・リスナー・クラスから呼び出すことができます。
このクラスでは、onOpen
メソッドがMAFによって自動的に呼び出され、このメソッドにより、デバイスに登録する必要があるトークンが渡されます。サンプル・コードを次に示します。
public void onOpen(String token) {
try {
String result = new MCSPersistenceManager().registerDevice(token, "com.company.MyMAFApp", "1.0");
}
catch (Exception e) {
throw new AdfException(e.getLocalizedMessage(), AdfException.ERROR);
}
}
登録が成功したかどうかを確認するには、図23-2に示すように、MCS UIでデバイス登録ボタンをクリックします。
図23-2 MCSでのデバイス登録
図23-2に示すように、登録には、MCSに対する認証に使用されたユーザー名が含まれます。これは、前述のようにデバイスを直接onOpen
メソッドで登録する場合、RESTサービスへの接続によるクライアント・データ・モデルの作成で説明されているように、登録では、「接続」ページで無名アクセス・キーを使用して指定した無名ユーザーが使用されるということです。これは、保護されている機能にユーザーがアクセスしようとすると、MAFログイン画面のみが表示されるためです。保護されている機能へのアクセスは、onOpen
メソッドの実行を次に引き起こすライフサイクル・リスナーstart
メソッドが実行されると行われます。登録済のすべてのデバイスにプッシュ通知を送信するだけの場合は、これは問題ではありません。ただし、ユーザー名に基づいてターゲット・デバイスにプッシュ通知を送信する場合は、MAFログイン後まで登録を延期する必要があります。これは、onOpen
メソッドでは、トークンをアプリケーション・スコープの変数に格納してから、保護されている最初の機能において、デバイスを登録するためのコールを行う必要があるということです。
デバイスを登録解除するには、MCSPersistenceManager
クラス内の次のメソッドを使用します。
public String deregisterDevice(String token, String appId)
プッシュ通知ペイロードに関する必知事項
JSON形式のプッシュ通知ペイロードには、alert
キー、sound
キーおよびbadge
キーが含まれています。
MAFでは、JSON形式のペイロードに対して、次のキーを尊重します。
-
alert
: 通知プロンプトに表示されるテキスト・メッセージ。 -
sound
: 通知を受信したときに再生されるサウンド。 -
badge
: iOSのアプリケーション・アイコンに表示する番号。注意:
Androidでは、ペイロードはキー値ペアを持つJSONオブジェクトである可能性があります。GCMサーバーは非文字列値をアプリケーションに送信する前に文字列に変換するため、値は常に文字列化されます。これは、値の型を保持するAPNには当てはまりません。『Google Cloud Messaging』のImplementing GCM Serverで、「data」メッセージ・パラメータの説明を参照してください。このドキュメントは、Android開発者のWebサイト(
http://developer.android.com/index.html
)またはAndroid SDKドキュメントから入手できます。
ローカル通知の管理
ローカル通知は、Java API、JavaScript APIおよびMAFが提供するDeviceFeatures
データ・コントロールのメソッドを使用して管理します。
ローカル通知は、次のものを使用して管理できます。
-
MAFの提供するJava API (「Javaを使用してローカル通知を管理する方法」を参照)。
-
MAFの提供するJavaScript API (「JavaScriptを使用してローカル通知を管理する方法」を参照)。
-
アプリケーション設計時にすべてのMAFアプリケーションで使用可能なDeviceFeaturesデータ・コントロールのメソッド(「DeviceFeaturesデータ・コントロールを使用してローカル通知を管理する方法」を参照)。
LocalNotificationDemoというMAFサンプル・アプリケーションは、ローカル通知のスケジュールおよび処理方法を示します。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install
/jdeveloper/jdev/extensions/oracle.maf/Samples
ディレクトリ内のPublicSamples.zip
ファイル内にあります。
Javaを使用したローカル通知の管理方法
oracle.adfmf.framework.api.AdfmfContainerUtilities
クラスのメソッドを使用して、ローカル通知をスケジュールします。
ローカル通知は、oracle.adfmf.framework.api.AdfmfContainerUtilities
クラスの次のメソッドを使用してスケジュールできます。
-
addLocalNotification(MafNativeLocalNotificationOptions options)
。このメソッドは、スケジュールされる通知のIDを表すString
を戻します。Javaコードでは、次のような方法でこのメソッドを使用します。
try { // Configure local notification MafNativeLocalNotificationOptions options = new MafNativeLocalNotificationOptions(); options.setTitle("some title text"); options.setAlert("some alert text"); // Set the date in UTC options.setDate(LocalDateTime.now(Clock.systemUTC()).plusSeconds(5)); // Set the notification to repeat every minute options.setRepeat(MafNativeLocalNotificationOptions.RepeatInterval.MINUTELY); // Set the application badge to be '1' everytime notification is triggered options.setBadge(1); // Play the default system sound when notification triggers options.setSound(MafNativeLocalNotificationOptions.SYSTEM_DEFAULT_SOUND); // Vibrate using default system vibration motion when notification triggers options.setVibration( MafNativeLocalNotificationOptions.SYSTEM_DEFAULT_VIBRATION); // Add custom payload that is to be delivered through the local notification HashMap<String,Object> payload = new HashMap<String, Object>(); payload.put("somenumber", 1); payload.put("somestring", "value2"); payload.put("someboolean", true); options.setPayload(payload); // Schedule local notification String notificationID = AdfmfContainerUtilities. addLocalNotification(options); System.out.println("Notification added successfully. ID is "+notificationID); } catch(Exception e) { System.err.println("There was a problem adding notification"); }
通知オプションがアプリケーションの動作に与える影響は、ターゲット・プラットフォームに応じて異なります。「ローカル通知オプションとアプリケーション動作に関する必知事項」を参照してください。
-
cancelLocalNotification(String notificationId)
。このメソッドは、正常に取り消された通知のIDを表すString
を戻します。Javaコードでは、次のような方法でこのメソッドを使用します。
try { String cancelledNotificationId = AdfmfContainerUtilities. cancelLocalNotification("a83b696d-53e7-4242-ab4d-4a771d8d178f"); System.out.println("Notification successfully canceled"); } catch(AdfException e) { System.err.println("There was a problem canceling notification"); }
Oracle Mobile Application Framework Java APIリファレンスを参照してください。
JavaScriptを使用したローカル通知の管理方法
MAFでは、adf.mf.api.localnotification
ネームスペースのJavaScript APIを使用してローカル通知を管理できます。
次のメソッドを使用できます。
-
add
: 定義は次のとおりです。/** * Schedule a local notification * * @param {Object} options - notification options * @param {string} options.title - notification title * @param {string} options.alert - notification alert * @param {Date} options.date - date at which notification is to be triggered * @param {Number} options.badge - application icon is to be badged by this * number when notification is triggered * @param {string} options.sound - set it to 'SYSTEM_DEFAULT' to play the * default system sound upon a notification * @param {string} options.vibration - set it to 'SYSTEM_DEFAULT' for default * system vibration upon a notification * @param {Object} options.payload - custom payload to be sent via notification * @param {successCallback} scb - success callback * @param {errorCallback} ecb - error callback */ adf.mf.api.localnotification.add(options,scb,ecb); {Object} options : json representing notification options { // notification title (only Android and iOS 8.2 or later) "title" : String, // notification alert text "alert" : String, // date-time at which notification should be fired (UTC time zone) "date" : Date, // either 'minutely', 'hourly', 'daily', // 'weekly', 'monthly', or 'yearly' "repeat" : String, // badge application icon with this number (iOS only) "badge" : Number, // if set, the default system sound is played "sound" : "SYSTEM_DEFAULT", // if set to "SYSTEM_DEFAULT", the default vibration is // enabled upon an incoming notification (Android only) "vibration" : String, // custom JSON data to be passed through the notification "payload" : Object, }
/** * Success Callback * * @param {Object} request - request * @param {Object} response - response * @param {string} response.id - id of the scheduled notification */ function scb(request, response) {}
/** * Error Callback * * @param {Object} request - request * @param {Object} response - response */ function fcb(request, response) {}
通知オプションがアプリケーションの動作に与える影響は、ターゲット・プラットフォームに応じて異なります。「ローカル通知オプションとアプリケーション動作に関する必知事項」を参照してください。
-
cancel
: 定義は次のとおりです。/** * Cancel a scheduled local notification * * @param {string} notificationId - id of the scheduled notification * that needs to be canceled * @param {successCallback} scb - success callback * @param {errorCallback} ecb - error callback */ adf.mf.api.localnotification.cancel(notificationId, scb, ecb); {var} notificationId : id of notification that is to be canceled.
/** * Success Callback * * @callback successCallback * @param {Object} request - request * @param {Object} response - response * @param {string} response.id - id of the notification */
/** * Error Callback * * @callback errorCallback * @param {Object} request - request * @param {Object} response - response */
詳細は、Oracle Mobile Application Framework JSDocリファレンスを参照してください。
DeviceFeaturesデータ・コントロールを使用したローカル通知の管理方法
図23-3に示すDeviceFeaturesデータ・コントロールのaddLocalNotification
およびcancelLocalNotification
メソッドを使用してローカル通知をスケジュールおよび取消しできます。
図23-3 DeviceFeaturesデータ・コントロールのメソッド
DeviceFeaturesデータ・コントロールの詳細は、「DeviceFeaturesデータ・コントロールの使用方法」を参照してください。
ローカル通知オプションとアプリケーション動作に関する必知事項
MAFアプリケーションのローカル通知動作は、通知設定によって決まります。ローカル通知オプションの表を確認してください。
表23-2に、ローカル通知オプションをリストし、各オプションに対する特定の値の設定と不適切な設定がMAFアプリケーションの通知動作に与える影響を説明します。
表23-2 ローカル通知オプション
オプション | 値 | iOSでの動作 | Androidでの動作 |
---|---|---|---|
|
次のいずれかになります。
|
アプリケーション名が通知タイトルとして表示されます。 |
通知センターの通知タイトルは、空白で表示されます。 |
|
次のいずれかになります。
|
通知に 通知の配信時にアプリケーションがフォアグラウンドで実行されている場合、通知はアプリケーションのローカル通知リスナーに配信されます。 |
通知は、タイトル付きのバナーとして表示されますが、アラート・テキストは表示されません。 |
|
次のいずれかになります。
|
通知は即座にトリガーされます。 |
通知は即座にトリガーされます。 |
|
次のいずれかになります。
|
通知は繰り返されません。 |
通知は繰り返されません。 |
|
次のいずれかになります。
|
通知では、アプリケーション・アイコンにバッジが設定されません。 既存のバッジは維持されます。 |
NA 脚注1 |
|
0 |
既存のバッジがアプリケーション・アイコンから削除されます。 |
NA 脚注2 |
|
|
エラー・メッセージが表示されます。 通知では、サウンドが再生されません。 |
エラー・メッセージが表示されます。 通知では、サウンドが再生されません。 |
|
未指定 |
通知では、サウンドが再生されません。 |
通知では、サウンドが再生されません。 |
|
|
NA 脚注3 |
エラー・メッセージが表示されます。 通知では、モバイル・デバイスのバイブレーションがトリガーされません。 |
|
未指定 |
NA 脚注4 |
通知では、モバイル・デバイスのバイブレーションがトリガーされません。 |
脚注1
アプリケーション・バッジの概念はありません。設定は無視されます。
脚注2
アプリケーション・バッジの概念はありません。設定は無視されます。
脚注3
バイブレーションは制御できません。設定は無視されます。ただし、通知の受信時にデフォルトのシステム・サウンドを再生することを指定した場合、また、エンド・ユーザーがモバイル・デバイスの「着信時のバイブレーション」設定を有効にした場合、デバイスは通知の受信時にバイブレーションも適用します。
脚注4
バイブレーションは制御できません。設定は無視されます。ただし、通知の受信時にデフォルトのシステム・サウンドを再生することを指定した場合、また、エンド・ユーザーがモバイル・デバイスの「着信時のバイブレーション」設定を有効にした場合、デバイスは通知の受信時にバイブレーションも適用します。
MAFが通知イベントをトリガーしたときのアプリケーション状態の判断
MAFには、通知イベントをリスニングするために実装する、EventListener
インタフェースがあります。この実装のonMessage
メソッドには、イベントを受信したときのMAFアプリケーションの状態に関する情報を取得できるイベント・パラメータが含まれています。この情報を取得するには、Event.getApplicationlicationState()
メソッドを使用します。
次の例(LocalNotificationDemo
MAFサンプル・アプリケーションから取得)は、通知イベントのペイロードを取得して、通知イベントを受信したときのMAFアプリケーションの状態を判断する方法を示しています。
NativeLocalNotificationListener implements EventListener { ... public void onMessage(Event event) { ... //MAF application state at the time of this notification String appState = stringifyAppState(event.getApplicationState()); String payload = event.getPayload(); ... HashMap<String, Object> payloadMap = ((NativeLocalNotificationEvent)event).getPayloadObject(); ... JSONObject jsonPayload = (JSONObject)payloadMap.get("payload"); ... AdfmfJavaUtilities.setELValue("#{applicationScope.notificationAppState}", appState); AdfmfJavaUtilities.setELValue("#{applicationScope.notificationPayload}", jsonPayload != null ? jsonPayload.toString() : ""); AdfmfContainerUtilities.gotoFeature("Notification"); } ... }
getApplicationState()
の戻り値は、次のとおりです。
-
APPLICATION_STATE_UNKNOWN (0)
。通知を受信したときにMAFアプリケーションがメモリーに常駐していても、MAFアプリケーションがフォアグラウンドまたはバックグラウンドで実行されていたかどうかを判断できない場合。このケースはiOSプラットフォームにのみ適用されます。イベント・ペイロードには、アプリケーションの正しい状態を示す追加のforeground
属性が含まれます。属性は、1
(フォアグラウンド)または0
(バックグラウンド)のいずれかに設定します。イベント・ペイロードの形式は、次のようになります。{"alert":"My message","foreground":1}
-
APPLICATION_STATE_NOT_RUNNING (1)
。MAFアプリケーションがメモリーに常駐せず、オペレーティング・システムがMAFアプリケーションを起動してイベントを処理する場合。 -
APPLICATION_STATE_BACKGROUND (2)
。通知を受信したときにMAFアプリケーションがメモリーに常駐していて、バックグランドで実行されている場合。 -
APPLICATION_STATE_FOREGROUND (3)
。通知を受信したときにMAFアプリケーションがメモリーに常駐していて、フォアグランドで実行されている場合。
前述の例に示す、NativeLocalNotificationEvent
クラスを使用します。このクラスは、oracle.adfmf.framework.event.Event
を拡張してローカル・イベントを管理します。MAFはNativePushEvent
クラスは提供します。このクラスもoracle.adfmf.framework.event.Event
を拡張しますが、ネイティブのプッシュ・イベントを管理します。
次のLocalNotificationDemo
MAFサンプル・アプリケーションの例に示すように、MAFアプリケーション・ライフサイクル・リスナーのstart()
メソッドにリスナーを追加して、ローカル通知に関連するイベントを受信します。
public class LifeCycleListenerImpl implements LifeCycleListener { ... public void start() { // Listen for local notifications EventSource evtSource = EventSourceFactory.getEventSource(EventSourceFactory.NATIVE_LOCAL_NOTIFICATION_EVENT_SOURCE_NAME); evtSource.addListener(new NativeLocalNotificationListener()); } ...
詳細は、Oracle Mobile Application Framework Java APIリファレンスと「サンプルのMAFアプリケーション」を参照してください。