Collapse the table of content
Expand the table of content
展開 最小化

MobileOperatorNotification イベントを処理するアプリの開発

更新日: 2013年8月

適用対象: Windows 8, Windows 8.1

このトピックでは、MobileOperatorNotification イベントを処理するモバイル ブロードバンド アプリを開発する方法について説明します。

ベスト プラクティス

バックグラウンドのイベント処理には、次のベスト プラクティスを活用してください。

  • 対処できないバックグラウンド イベントは登録しないでください。このようなイベントを処理すると、不必要にアプリのクォータを消費します。

  • バックグラウンド イベントの受け取り時に大量の処理を行わないでください。

  • 次回アプリが起動するときに処理を見送ることを検討してください。

  • バックグラウンド イベントに対する応答としてトースト通知の表示やタイルの更新を検討してください。モバイル ブロードバンド アプリでは、バックグラウンド イベントのペイロードを処理できます。

バックグラウンド タスクについて詳しくは、バックグラウンド タスクの概要に関するページをご覧ください。

手順 1. バックグラウンド タスク コントラクトの宣言

モバイル ブロードバンド アプリから提供されるバックグラウンド タスク エクスペリエンスを Windows で認識するために、アプリでは、システムの機能に拡張機能を提供することを宣言する必要があります。

Visual Studio プロジェクトの package.appxmanifest ファイルで宣言するには、以下の手順を実行します。

バックグラウンド タスク コントラクトを宣言するには

  1. ソリューション エクスプローラーで、プロジェクトの package.appxmanifest ファイルをダブルクリックします。

  2. [宣言] タブの [使用可能な宣言] から [バックグラウンド タスク] を選び、[追加] をクリックします。

  3. [プロパティ] の見出しの下で、次のアプリ情報を入力します。

    • JavaScript と HTML を使ったモバイル ブロードバンド アプリの場合、[アプリの設定] の下の [スタート ページ] ボックスに、アプリでバックグラウンド タスクを処理するファイルの名前 (たとえば、backgroundtask.js) を入力します。

    • [サポートされるタスクの種類] の見出しの下で、[システム イベント] チェック ボックスをオンにします。

この操作を正常に完了すると、package.appxmanifest ファイル内に次のような拡張要素が設定されます。


<Extension Category="windows.backgroundTasks" StartPage="backgroundtask.js">
  <BackgroundTasks>
    <Task Type="systemEvent" />
  </BackgroundTasks>
</Extension>

手順 2. バックグラウンド タスク ハンドラー

アプリで移動体通信事業者の通知の宣言を提供する場合、バックグラウンド タスクのアクティブ化用にハンドラーを指定する必要があります。ハンドラーは Windows.UI.WebUI.WebUIBackgroundTaskInstance.current.triggerDetails (Windows.Networking.NetworkOperators.NetworkOperatorNotificationEventDetails) から移動体通信事業者のネットワーク アカウント ID とイベント データを取得します。

バックグラウンド タスクでサポートされる唯一の UI はトースト通知のため、バックグラウンド タスク ハンドラーはトースト通知を表示することも、NetworkOperatorNotificationEventDetails をローカル記憶域に保存することもできます。

次のコード例では、管理にかかわる新しい SMS 通知を受け取ったときに実行するように設計されたバックグラウンド タスクを示しています。

C#


using Windows.Networking.NetworkOperators;

namespace MNOMessageBackground
{
    public sealed class MNOBackgroundTask : IBackgroundTask
    {
       public void Run(Windows.ApplicationModel.Background.IBackgroundTaskInstance taskInstance)
       {
         NetworkOperatorNotificationEventDetails notifyData = (NetworkOperatorNotificationEventDetails)taskInstance.TriggerDetails;

         //The network account ID is stored in notifyData.NetworkAccountId

            switch (notifyData.NotificationType)
            {
                case NetworkOperatorEventMessageType.Gsm: // 0
                    break;
                case NetworkOperatorEventMessageType.Cdma: // 1
                    break;
                case NetworkOperatorEventMessageType.Ussd: // 2
                    break;
                case NetworkOperatorEventMessageType.DataPlanThresholdReached: // 3
                    break;
                case NetworkOperatorEventMessageType.DataPlanReset: //4 
                    break;
                case NetworkOperatorEventMessageType.DataPlanDeleted: //5
                    break;
                case NetworkOperatorEventMessageType.ProfileConnected: //6
                    break;
                case NetworkOperatorEventMessageType.ProfileDisconnected: //7
                    break;
                case NetworkOperatorEventMessageType.RegisteredRoaming: //8
                    break;
                case NetworkOperatorEventMessageType.RegisteredHome: ///9
                    break;
                case NetworkOperatorEventMessageType.TetheringEntitlementCheck: //10
                    break;

                default:
                    break;
             }

            // Add code to save the message to app local storage, and optionally show toast notification and tile updates.
        }
    }
}

JavaScript

(function () {
    "use strict";

    //
    // The background task instance's activation parameters are available via
    // Windows.UI.WebUI.WebUIBackgroundTaskInstance.current.
    //
    var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current,
        networkOperatorEventType = Windows.Networking.NetworkOperators.NetworkOperatorEventMessageType,
        key = null,
        settings = Windows.Storage.ApplicationData.current.localSettings;

    try {

        
        var details = backgroundTaskInstance.triggerDetails;

// The network account ID is stored in details.networkAccountId.

        switch (details.notificationType) {
            case networkOperatorEventType.gsm:
                showToast("Mobile Broadband message", details.message);
                break;
            case networkOperatorEventType.cdma:
                showToast("Mobile Broadband message", details.message);
                break;
            case networkOperatorEventType.ussd:
                showToast("Mobile Broadband message", details.message);
                break;
            case networkOperatorEventType.dataPlanThresholdReached:
                showToast("Mobile Broadband message", "Data plan threshold reached");
                break;
            case networkOperatorEventType.dataPlanReset:
                showToast("Mobile Broadband message", "Data plan reset");
                break;
            case networkOperatorEventType.dataPlanDeleted:
                showToast("Mobile Broadband message", "Data plan deleted");
                break;
            case networkOperatorEventType.profileConnected:
                showToast("Mobile Broadband message", "Profile connected");
                break;
            case networkOperatorEventType.profileDisconnected:
                showToast("Mobile Broadband message", "Profile disconnected");
                break;
            case networkOperatorEventType.registeredRoaming:
                showToast("Mobile Broadband message", "Registered roaming");
                break;
            case networkOperatorEventType.registeredHome:
                showToast("Mobile Broadband message", "Registered home");
                break;
            case networkOperatorEventType.tetheringEntitlementCheck:
                showToast("Mobile Broadband message", "Entitlement check completed");
                break;
            default:
                showToast("Mobile Broadband message", "Unknown message");
                break;
        }

        //
        // A JavaScript background task must call close when it is done.
        //
 close();
    }
    catch (exception) {
// Display error message.
close();
    }

タイルとトースト通知の表示

トースト通知は表示が一時的でユーザーが見逃す可能性があるため、モバイル ブロードバンド アプリではトースト通知とタイル通知の両方を表示することをお勧めします。トースト通知とタイル更新エクスペリエンス設計ガイドラインについては、「モバイル ブロードバンド アプリのユーザー エクスペリエンスの設計」をご覧ください。

トースト通知を有効にするには

  1. ソリューション エクスプローラーで、プロジェクトの package.appxmanifest ファイルをダブルクリックします。

  2. [アプリケーション UI] タブの [通知] 見出しの下で、[トースト対応][はい] に設定します。

この操作を正常に完了すると、package.appxmanifest ファイル内に次のような拡張要素が設定されます。


<VisualElements … ToastCapable="true"… />

次のコードは、バックグラウンド タスク ハンドルでトースト通知を表示する方法を示します。

JavaScript

function showToast(title, body) {
        var notifications = Windows.UI.Notifications;
        var toastNotificationManager = Windows.UI.Notifications.ToastNotificationManager;
        var toastXml = toastNotificationManager.getTemplateContent(notifications.ToastTemplateType.toastText02);

        var temp = "the parameter will pass to app when app activated from tap Toast ";
        toastXml.selectSingleNode("/toast").setAttribute("launch", temp);

        var textNodes = toastXml.getElementsByTagName("text");
        textNodes[0].appendChild(toastXml.createTextNode(title));
        textNodes[1].appendChild(toastXml.createTextNode(body));

        var toast = new notifications.ToastNotification(toastXml);
        toastNotificationManager.createToastNotifier().show(toast);
    }

SMS テキスト メッセージの取得

着信 SMS メッセージのためにバックグラウンド タスクがトリガーされた場合、バックグラウンド タスクの詳細にそのペイロードの SMS オブジェクトが保持されます。

JavaScript

(function () {
    "use strict";

    //
    // The background task instance's activation parameters are available via
    // Windows.UI.WebUI.WebUIBackgroundTaskInstance.current.
    //
    var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current,

    try {
        
        var details = backgroundTaskInstance.triggerDetails;
        if (details.notificationType === networkOperatorEventType.gsm
        || details.notificationType === networkOperatorEventType.cdma)
        {
     var textMessage = new Windows.Devices.Sms.SmsTextMessage.fromBinaryMessage(details.smsMessage);
            
         // textMessage can be used to get other SmsMessage properties    
         // like sender number, timestamp, message part count etc.
         showToast("From: " + textMessage.from + "; TimeStamp: " + textMessage.timestamp, details.message);
        }

ローカル記憶域の使用

バックグラウンド タスクでは、ローカル記憶域を使って、バックグラウンド イベントから取得したメッセージを保存できます。そのため、アプリでは、保存した情報を後で使用できます。

JavaScript

    //
    // Save the message 
    //
    var settings = Windows.Storage.ApplicationData.current.localSettings;
    var keyMessage = "BA5857FA-DE2C-4A4A-BEF2-49D8B4130A39";


    //
    // The background task instance's activation parameters are available via
    // Windows.UI.WebUI.WebUIBackgroundTaskInstance.current
    //
    var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;

    var details = backgroundTaskInstance.triggerDetails;
    settings.values[keyMessage] = details.message;

次のコードでは、アプリのバックグラウンド タスク ハンドラーによって保存されたメッセージを取得する方法を示します。

JavaScript

var settings = Windows.Storage.ApplicationData.current.localSettings;
    var keyMessage = "BA5857FA-DE2C-4A4A-BEF2-49D8B4130A39";
    var operatorMessage = settings.values[keyMessage];

ステップ 3: アクティブ化イベントの処理

トースト通知がパラメーターを設定する場合は、detail.arguments を通じてアプリにパラメーターが渡されます。

JavaScript または C# では、WinJS.Application.activated イベントを処理し、イベント ハンドラーに渡されるイベント引数をチェックします。トースト通知からのアクティブ化では、Windows.UI.WebUI.WebUILaunchActivatedEventArgs 型のイベント引数が渡されます。イベント引数の detail.kind プロパティが Windows.ApplicationModel.Activation.ActivationKind.launch の場合、アプリは、イベント引数の detail.argument プロパティが null に設定されているかどうかに応じて、スタート エクスペリエンスまたは通知エクスペリエンスを提供します。

JavaScript


WinJS.Application.addEventListener("activated", activated; false);

function activated(eventArgs)
{
  if (eventArgs.detail.kind == Windows.ApplicationModel.Activation.ActivationKind.launch)
  {
    if (!eventArgs.detail.arguments)
    {
      // Initialize logic for the Start experience here.
    }
    else
    {
      // Initialize logic for the Notification experience here.
    }
  }
}

手順 4. バックグラウンド タスク完了ハンドラーの処理

フォアグラウンド アプリは、バックグラウンド タスクの完了時に通知を受け取る完了ハンドラーを登録することもできます。バックグラウンド タスクの Run メソッドで発生する完了状態または例外は、フォアグラウンド アプリの完了ハンドラーに渡されます。タスク完了時にアプリが一時停止状態だった場合は、次にアプリが再開するときに完了通知を受け取ります。アプリが終了状態だった場合、アプリは完了通知を受け取りません。バックグラウンド タスクで、実行が成功した旨の情報を保存する必要がある場合は、状態マネージャーや別の手段 (アプリが実行状態に戻ったときに読み取り可能なファイルなど) を利用して情報を保持してください。

Important重要
移動体通信事業者のバックグラウンド イベントはシステムによって自動的にアプリに登録されますが、バックグラウンド完了ハンドラーまたは進行状況ハンドラーへの登録が必要な場合は、アプリを 1 回以上実行する必要があります。

C#


foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
   if(cur.Value.Name == “MobileOperatorNotificationHandler”)
   {
       cur.Value.Progress += new BackgroundTaskProgressEventHandler(OnProgress);
       cur.Value.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
   }
}

//
// Handle background task completion.
private void OnCompleted(IBackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs e)
{
   var taskCompletion = task as IBackgroundTaskRegistration;
   var completionArgs = args.Context as BackgroundTaskCompletedEventArgs;
   
  //
  // If the background task threw an exception, display the exception in the error text box.
  if (completionArgs.Status != null)
  {
    throw completionArgs.Status;
  }
}

// Handle background task progress.
private void OnProgress(IBackgroundTaskRegistration sender, BackgroundTaskProgressEventArgs e)
{
  var taskRegistration = task as IBackgroundTaskRegistration;
  var progressArgs = args.Context as BackgroundTaskProgressEventArgs;
  // progressArgs.Progress has the progress percentage
}

JavaScript


var iter = Windows.ApplicationModel.Background.BackgroundTaskRegistration.allTasks.first();
var hascur = iter.hasCurrent;
while (hascur) {
    var cur = iter.current.value;
    if (cur.name === “MobileOperatorNotificationHandler”) {
        cur.addEventListener("progress", new ProgressHandler(cur).onProgress);
        cur.addEventListener("completed", new CompleteHandler(cur).onCompleted);
    }
    hascur = iter.moveNext();
}

//
// Handle background task progress.
//
function ProgressHandler(task) {
    this.onProgress = function (args) {
       try {
           var progress = "Progress: " + args.progress + "%";
       } catch (ex) {
           displayError(ex);
       }
   };
}

//
// Handle background task completion.
//
function CompleteHandler(task) {
    this.onCompleted = function (args) {
        try {
            var key = task.taskId;
        } catch (ex) {
            displayError(ex);
        }
    };
}

トラブルシューティング

以降のセクションでは、発生する可能性がある問題のトラブルシューティングに役立つ情報を提供します。

メタデータ解析をトリガーしてバックグラウンド タスクを登録する

ユーザーがモバイル ブロードバンド デバイスを接続すると、Windows 8 と Windows 8.1 によって、モバイル ブロードバンド アプリと関連付けられたサービス メタデータが自動的にインストールされ、サービス メタデータで定義されているバックグラウンド タスクが登録されます。ただし、Windows 8.1 では、アプリは自動的にはスタート画面にピン留めされません。

開発者は、デスクトップの [デバイスとプリンター] ウィンドウで F5 キーを押して (または右クリックして [更新] を選んで)、Windows 8 と Windows 8.1 でサービス メタデータを解析し、バックグラウンド タスクを登録するように手動でトリガーすることができます。サービス メタデータの解析によるバックグラウンド タスクの登録は、アプリが展開されている場合にのみ成功します。

バックグランド タスクが正しく登録されていることを確かめる

開発者は、Application and Services Logs\Microsoft\Windows\DeviceSetupManager のイベント ログを参照して、デバイス セットアップ マネージャー (DSM) でサービス メタデータが正しく解析されていることを確かめることができます。

  1. イベント ビューアーを開きます。

  2. [メニュー] タブで、[表示][分析およびデバッグ ログの表示] を選びます。

  3. アプリケーションとサービス ログ\Microsoft\Windows\DeviceSetupManager に移動します。

注目するイベントとして、DSM で MobileOperatorNotification イベントのバックグランド タスクが正常に登録されたことを示すイベント ID 220 や、メタデータ パッケージで見つかったエラーを示すイベント ID 7900 があります。

プロビジョニング メタデータが正常に適用されていることを確かめる

プロビジョニング メタデータを適用するときに、ProvisionFromXmlDocumentResults.AllElementsProvisioned が true になっていることを確認します。true になっていない場合、ProvisionResultsXml でエラーの詳しい情報を確認します。一般的なモバイル ブロードバンド エラーには、次のエラーがあります。

  • PC の SIM とプロビジョニング ファイルの不一致 (プロファイルが ERROR_NOT_FOUND で失敗する)

  • プロビジョニング ファイルの CarrierId とエクスペリエンス メタデータのサービス番号の不一致

バックグラウンド タスクがシステム イベント ブローカーで実行されていることを確かめる

イベント ビューアーをチェックして、Windows で MobileOperatorNotification イベントが生成されていることと、アプリのバックグランド タスクがイベント ブローカーで実行されていることを確認できます。これらのイベントのログは既定では無効になっていますが、次の手順を実行して有効にすることができます。

  1. イベント ビューアーを開きます。

  2. [メニュー] タブで、[表示][分析およびデバッグ ログの表示] を選びます。

  3. アプリケーションとサービス ログ\Microsoft\Windows\BackgroundTaskInfrastructure に移動します。

  4. 診断ログを右クリックし、[ログの有効化] を選択します。

ログを有効にして、バックグラウンド タスクが正常に実行されると、イベント ID = 1 のイベントが生成され、"エントリ ポイントが <background_task_namespace_name>.<background_task_class_name> で名前が MobileOperatorNotificationHandler のバックグラウンド タスクのインスタンスがセッション 1 で作成され、ID {11111111-1111-1111-1111-111111111111}" が設定されました" という説明が示されます。

バックグラウンド タスクが実行されていない場合は、まず、サービス メタデータで指定されているバックグラウンド タスクが、パッケージの AppXManifest.xml ファイルの名前と一致していることを確かめます。アプリを展開してモバイル ブロードバンド デバイスを挿入した後にサービス メタデータの解析がトリガーされていることを確かめます。

Windows が SMS 通知や USSD 通知を受け取ることを確かめる

イベント ビューアーで SmsRouter イベントをチェックして、Windows で SMS 通知と USSD 通知が受信されていることを確認できます。

イベント ビューアーのアプリケーションとサービス ログ\Microsoft\Windows \Mobile-Broadband-Experience-SmsRouter\Microsoft-Windows-SMSRouter には、"SMSRouter で SMS オペレーター通知メッセージを受信しました" や "SMSRouter でテキスト メッセージを受信しました" などのエントリがあります。アプリケーションとサービス ログ\Microsoft\Windows \Mobile-Broadband-Experience-SmsApi\SMSApi には、"アプリ: Microsoft.SDKSamples.SmsSendReceive は、モバイル ブロードバンド デバイスで SMS テキスト メッセージを送信しました: {11111111-1111-1111-1111-111111111111}" などのエントリがあります。

受信した SMS メッセージは事業者の通知として検出されません

受信した SMS が事業者の通知として検出されていない場合、アカウント プロビジョニング メタデータで管理にかかわる SMS 通知のカスタムのフィルタリング規則を確かめます。プロビジョニング メタデータについて詳しくは、「アカウント プロビジョニング」をご覧ください。

特に、アカウント プロビジョニング メタデータで送信者の電話番号を指定している場合、指定した番号形式が、SMS API を使って受信したメッセージの番号形式と一致しているかことを確かめます。一致が正しいことを確認するには、Pattern を一時的に [^]* に変更し、この送信者からのすべてのメッセージを照合します。

backgroundtask.js のサンプル ファイル

//
// A JavaScript background task runs a specified JavaScript file.
//
(function () {
    "use strict";

    //
    // The background task instance's activation parameters are available via Windows.UI.WebUI.WebUIBackgroundTaskInstance.current.
    //
    var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current,
        networkOperatorEventType = Windows.Networking.NetworkOperators.NetworkOperatorEventMessageType,
        key = null,
        settings = Windows.Storage.ApplicationData.current.localSettings;

    try {       
        var details = backgroundTaskInstance.triggerDetails;

        switch (details.notificationType) {
            case networkOperatorEventType.gsm:
                var textMessage = new Windows.Devices.Sms.SmsTextMessage.fromBinaryMessage(details.smsMessage);
                showToast("Gsm Msg From: " + textMessage.from + "; TimeStamp: " + textMessage.timestamp, details.message);
                
                break;
            case networkOperatorEventType.cdma:
                showToast("Mobile Broadband message", details.message);
                break;
            case networkOperatorEventType.ussd:
                showToast("Mobile Broadband message", details.message);
                break;
            case networkOperatorEventType.dataPlanThresholdReached:
                showToast("Mobile Broadband message", "Data plan threshold reached");
                break;
            case networkOperatorEventType.dataPlanReset:
                showToast("Mobile Broadband message", "Data plan reset");
                break;
            case networkOperatorEventType.dataPlanDeleted:
                showToast("Mobile Broadband message", "Data plan deleted");
                break;
            case networkOperatorEventType.profileConnected:
                showToast("Mobile Broadband message", "Profile connected");
                break;
            case networkOperatorEventType.profileDisconnected:
                showToast("Mobile Broadband message", "Profile disconnected");
                break;
            case networkOperatorEventType.registeredRoaming:
                showToast("Mobile Broadband message", "Registered roaming");
                break;
            case networkOperatorEventType.registeredHome:
                showToast("Mobile Broadband message", "Registered home");
                break;
            case networkOperatorEventType.tetheringEntitlementCheck:
                showToast("Mobile Broadband message", "Entitlement check completed");
                break;
            default:
                showToast("Mobile Broadband message", "Unknown message");
                break;
        }
        taskSucceeded();
    }
    catch (exception) {
        taskFailed();
    }

    function showToast(title, body) {

        var notifications = Windows.UI.Notifications;
        var toastNotificationManager = Windows.UI.Notifications.ToastNotificationManager;
        var toastXml = toastNotificationManager.getTemplateContent(notifications.ToastTemplateType.toastText02);

        //
        // Pass to app through eventArguments.arguments.
        //
        var temp = "\"Title\"" + ":" + "\"" + title + "\"" + "," + "\"Message\"" + ":" + "\"" + body + "\"";
        if (temp.length > 251) {
            temp = temp.substring(0, 251);
        }
        toastXml.selectSingleNode("/toast").setAttribute("launch", "'{" + temp + "}'");

        var textNodes = toastXml.getElementsByTagName("text");
        textNodes[0].appendChild(toastXml.createTextNode(title));
        textNodes[1].appendChild(toastXml.createTextNode(body));

        var toast = new notifications.ToastNotification(toastXml);
        toastNotificationManager.createToastNotifier().show(toast);        
    }

    //
    // This function is called when the background task is completed successfully.
    //
    function taskSucceeded() {
        //
        // Use the succeeded property to indicate that this background task completed successfully.
        //
        backgroundTaskInstance.succeeded = true;
        backgroundTask.taskInstance.progress = 100;
        console.log("Background " + backgroundTask.taskInstance.task.name + " Completed");

        //
        // Write to localSettings to indicate that this background task completed.
        //
        key = backgroundTaskInstance.task.taskId.toString();
        settings.values[key] = "Completed";

        //
        // A JavaScript background task must call close when it is done.
        //
        close();
    }

    //
    // If the task was canceled or failed, stop the background task.
    //
    function taskFailed() {
        console.log("Background " + backgroundTask.taskInstance.task.name + " Failed");
        backgroundTaskInstance.succeeded = false;

        key = backgroundTaskInstance.task.taskId.toString();
        settings.values[key] = "Failed";

        close();
    }
})();

関連項目

表示:
© 2015 Microsoft