Windowsストアアプリ:トーストのローカル通知

火曜日 , 23, 10月 2012 Leave a comment

ローカル通知の概要

 

 トースト通知の方法でローカル通知は一番シンプルで実装しやすい方法です。

 ローカル通知ではアプリが起動中に自身の処理の中で通知を表示させます。

 

 アプリ自身が起動しているので、トースト通知の意味はあまりなく、アプリ内でポップアップさせるほうが柔軟は実装が可能なケースもあるかもしれません。

 

ローカル通知の実装

 

 トースト通知を起動するためにはマニフェストファイルへの記述が必要です。

 これを忘れるとエラーも無くトースト通知が表示されず戸惑うことになります。

 

 Package.appxmanifestファイルのアプリケーションUIタグの「トースト対応」項目を「はい」に変更します。

「アプリケーションUI」タグのトースト対応を「はい」に変更

 トースト通知を行うためのボタンコントロールを設置します。

 

<Button Content="シンプルなトースト通知" HorizontalAlignment="Left" Margin="176,187,0,0" VerticalAlignment="Top" Command="{Binding startToast}"/>

 

 Commandを利用していますが、onClickイベントハンドラーでももちろん構いません。

 続いてバインドされたターゲットにstartToastコマンドを記述します(ファイルの構成等はGitHubにサンプルをアップロードしてありますので参考にしてください)。

 

ライブラリを利用しないコード

 

 タイル同様トースト通知でもNotificationExtentionsライブラリが利用可能です。

 ですが、まずはライブラリを利用しないプレーンなコードを見てみましょう。

 

        public ICommand startToast
        {
            get
            {
                return new RelayCommand<string>(async (p) =>
                {
                    // トースト用のテンプレートを選択
                    ToastTemplateType toastTemplate = ToastTemplateType.ToastImageAndText01;
                    XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);

                    // テンプレートの各要素を指定
                    XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
                    toastTextElements[0].AppendChild(toastXml.CreateTextNode("ローカルトースト通知(ノーマル)"));

                    XmlNodeList toastImageAttributes = toastXml.GetElementsByTagName("image");
                    ((XmlElement)toastImageAttributes[0]).SetAttribute("src", "https://si0.twimg.com/profile_images/2508237913/rctgk6cpgea29ejboclt.png");
                    ((XmlElement)toastImageAttributes[0]).SetAttribute("alt", "profile icon");

                    // 表示間隔をロングに(デフォルトはショート)
                    IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
                    ((XmlElement)toastNode).SetAttribute("duration", "long");

                    // トースト表示時の音声をオフに
                    toastNode = toastXml.SelectSingleNode("/toast");
                    XmlElement audio = toastXml.CreateElement("audio");
                    audio.SetAttribute("silent", "true");

                    toastNode.AppendChild(audio);

                    // トーストをクリックした場合にアプリを起動する
                    // ローカル通知の場合はあまり関係ない
                    // 下記のようにパラメーターを渡すこともできる
                    ((XmlElement)toastNode).SetAttribute("launch", "{\"type\":\"toast\",\"param1\":\"12345\",\"param2\":\"67890\"}");

                    // 表示
                    ToastNotification toast = new ToastNotification(toastXml);
                    ToastNotificationManager.CreateToastNotifier().Show(toast);
                });
            }
        }

 

 まずトーストのテンプレートからどの表示形式を利用するか選択します。

 トーストのテンプレートについては「トースト テンプレート カタログ」を参考に選択してください。

 

 トーストのテンプレートはXML形式で取得できますので、各ノードを設定します。

 

                    // テンプレートの各要素を指定
                    XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
                    toastTextElements[0].AppendChild(toastXml.CreateTextNode("ローカルトースト通知(ノーマル)"));

                    XmlNodeList toastImageAttributes = toastXml.GetElementsByTagName("image");
                    ((XmlElement)toastImageAttributes[0]).SetAttribute("src", "https://si0.twimg.com/profile_images/2508237913/rctgk6cpgea29ejboclt.png");
                    ((XmlElement)toastImageAttributes[0]).SetAttribute("alt", "profile icon");

 

 画像とイメージを指定します。

 この辺はタイルの指定ともほぼ同じですね。

 

                    // 表示間隔をロングに(デフォルトはショート)
                    IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
                    ((XmlElement)toastNode).SetAttribute("duration", "long");

 

 トーストの表示時間を指定します。longは25秒間表示したままとどまりますが、longを利用するのはその間着信を鳴らし続けるなどのシナリオ上必要な場合にとどめることが推奨されています。

 デフォルトはshort(7秒)です。

 

                    // トースト表示時の音声をオフに
                    toastNode = toastXml.SelectSingleNode("/toast");
                    XmlElement audio = toastXml.CreateElement("audio");
                    audio.SetAttribute("silent", "true");

                    toastNode.AppendChild(audio);

 

 トーストが表示される際に鳴らされる音を指定します。

 この場合は消音です。

 

                    // トーストをクリックした場合にアプリを起動する
                    // ローカル通知の場合はあまり関係ない
                    // 下記のようにパラメーターを渡すこともできる
                    ((XmlElement)toastNode).SetAttribute("launch", "{\"type\":\"toast\",\"param1\":\"12345\",\"param2\":\"67890\"}");

 

 トーストをクリックした際にアプリを起動する設定です。

 その場合にパラメーターも指定することができます。

 

                    // 表示
                    ToastNotification toast = new ToastNotification(toastXml);
                    ToastNotificationManager.CreateToastNotifier().Show(toast);

 

 トーストを表示します。

 

NotificationExtensionsを利用した場合

 

 NotificationExtensionsを利用したい場合XMLではなくて型付けされたクラスを用いて定義ができるので処理が書きやすくなります。

 NotificationExtensionsの導入についてはWindowsストアアプリ:タイルのローカル更新を参考にしください。

 

 ここではNotificationExtensionsを利用したコードを参考に記載します。

 

        public ICommand startExtensionToast
        {
            get
            {
                return new RelayCommand<string>(async (p) =>
                {
                    var toastContent = NotificationsExtensions.ToastContent.ToastContentFactory.CreateToastImageAndText01();
                    toastContent.TextBodyWrap.Text = "ローカルトースト通知(Extention)";
                    
                    toastContent.Image.Src = "https://si0.twimg.com/profile_images/2508237913/rctgk6cpgea29ejboclt.png";
                    toastContent.Image.Alt = "profile icon";

                    toastContent.Duration = NotificationsExtensions.ToastContent.ToastDuration.Long;
                    toastContent.Audio.Content = NotificationsExtensions.ToastContent.ToastAudioContent.Silent;

                    toastContent.Launch = "{\"type\":\"toast\",\"param1\":\"12345\",\"param2\":\"67890\"}";

                    var toast = toastContent.CreateNotification();
                    ToastNotificationManager.CreateToastNotifier().Show(toast);
                });
            }
        }

 

 同じトーストの設定ですが、こちらのほうがすっきりしますね。

 

 (本ページのサンプルコードはGitHubからダウンロードできます。)

 


Please give us your valuable comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です