Toast 通知在 Xamarin UWP Windows 应用程序中不起作用

Posted

技术标签:

【中文标题】Toast 通知在 Xamarin UWP Windows 应用程序中不起作用【英文标题】:Toast notification not working in Xamarin UWP Windows app 【发布时间】:2020-06-14 12:10:07 【问题描述】:

我有在 Xamarin.forms 下开发的 UWP Windows 应用程序。我已经实现了 Toast 通知,但我遇到了这个问题。在某些 Windows 10 系统中,它可以正常工作并正确显示 toast 通知,但在某些 Windows 10 系统(即使具有相同的 Windows 10 操作系统更新)中,它无法正常工作。

下面是我在 Native UWP 中实现的第一个代码 sn-ps。

string msg = "Toast Notification Header";
                string subMsg = "Toast Notification Title";

                var toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);

                var toastTextElements = toastXml.GetElementsByTagName("text");
                toastTextElements[0].AppendChild(toastXml.CreateTextNode(msg));
                toastTextElements[1].AppendChild(toastXml.CreateTextNode(subMsg));

                //To play the custom sound
                var toastNode = toastXml.SelectSingleNode("/toast");
                var audio = toastXml.CreateElement("audio");
                audio.SetAttribute("src", "ms-appx:///Assets/incoming_message.wav");
                audio.SetAttribute("loop", "false");
                toastNode.AppendChild(audio);

                var toast = new ToastNotification(toastXml);
                ToastNotificationManager.CreateToastNotifier().Show(toast);

下面是我在 Native UWP 中实现的第二个代码 sn-ps。

// "With Microsoft.Toolkit.Uwp.Notifications"


                // Construct the toast content
                ToastContent toastContent = new ToastContent()
                
                    Visual = new ToastVisual()
                    
                        BindingGeneric = new ToastBindingGeneric()
                        
                            Children =
                    
                        new AdaptiveText()
                        
                            Text = "Toast Notification Header"
                        ,

                        new AdaptiveText()
                        
                            Text = "Toast Notification Content"
                        
                    
                        
                    
                ;

                bool supportsCustomAudio = true;

                // If we're running on Desktop before Version 1511, do NOT include custom audio
                // since it was not supported until Version 1511, and would result in a silent toast.
                if (AnalyticsInfo.VersionInfo.DeviceFamily.Equals("Windows.Desktop")
                    && !ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 2))
                
                    supportsCustomAudio = false;
                

                if (supportsCustomAudio)
                
                    toastContent.Audio = new ToastAudio()
                    
                        Src = new Uri("ms-appx:///Assets/incoming_message.wav")                          
                    ;
                

                // And create the toast notification
                ToastNotification notification = new ToastNotification(toastContent.GetXml());
                // And then send the toast
                ToastNotificationManager.CreateToastNotifier().Show(notification);

以上代码片段在某些 Windows 10 系统中显示 Toast 通知,但在某些其他 Windows 10 系统中不起作用。 请指导我。提前致谢。

问候, 维韦克

【问题讨论】:

您好,您的意思是有些系统不支持什么系统?在不正常弹出通知的设备上,可以在Settings->System->Notifications and Action中查看是否开启了app的通知推送权限。 系统是指Windows 10系统,有的Windows 10系统显示通知,有的不显示,甚至是具有相同Windows更新版本的系统。我已经检查了通知权限,并且在所有系统中都启用了它。 对不起,我没说清楚,Windows 10有多个发布版本,你测试的是同一个系统吗?如果同一个版本有的可以推送通知,有的不能,那么这应该和代码无关,而与电脑的配置有关 我已经检查了多个具有最新且相同的 1909 版本的 Windows 10 的系统。在一个系统中它可以工作,而在另一个系统中,它不能工作。 抱歉,我无法重现此问题。或许我们可以通过测试找到问题的原因: 1、分别使用Xamarin.FormsNative UWP创建通知,并在多个系统上测试。这是看问题是否与开发框架有关。 2.创建一个简单的通知(仅包含文本)进行测试,这是为了确认问题是否与通知的创建有关。 3、如果以上都不能提供明确的信息,那么可能是系统的原因(尝试在系统中开启开发者模式) 【参考方案1】:

请按照以下步骤在 UWP 项目中添加 toast 通知。

第 1 步:- 创建一个新的 UWP 项目。

第 2 步:- 转到代码隐藏并添加命名空间。

使用 Windows.UI.Notifications; 使用 NotificationsExtensions.Toasts;

第 3 步:- 我创建了一个 Toast 通用模板,如下代码:

public static Windows.Data.Xml.Dom.XmlDocument CreateToast()    
    
   var xDoc = new XDocument(    
      new XElement("toast",    
      new XElement("visual",    
      new XElement("binding", new XAttribute("template", "ToastGeneric"),    
      new XElement("text", "C# Corner"),    
      new XElement("text", "Do you got MVP award?")    
   )    
   ),// actions    
   new XElement("actions",    
   new XElement("action", new XAttribute("activationType", "background"),    
   new XAttribute("content", "Yes"), new XAttribute("arguments", "yes")),    
   new XElement("action", new XAttribute("activationType", "background"),    
   new XAttribute("content", "No"), new XAttribute("arguments", "no"))    
   )    
   )    
   );    

   var xmlDoc = new Windows.Data.Xml.Dom.XmlDocument();    
   xmlDoc.LoadXml(xDoc.ToString());    
   return xmlDoc;    

第 4 步:- 使用 XML 文档创建一个 toast 通知对象。

var xmdock = CreateToast();    
var toast = new ToastNotification(xmdock);    
Next show the toast using ToastNotificationManager class.    
var notifi = Windows.UI.Notifications.ToastNotificationManager.CreateToastNotifier();    
notifi.Show(toast);   

第 5 步:- C# 代码隐藏:

private void showToastBtn_Click(object sender, RoutedEventArgs e)    
    
    var xmdock = CreateToast();    
    var toast = new ToastNotification(xmdock);    
    var notifi = Windows.UI.Notifications.ToastNotificationManager.CreateToastNotifier();    
    notifi.Show(toast);    

希望以上代码对你有用。

谢谢

【讨论】:

以上是关于Toast 通知在 Xamarin UWP Windows 应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

处理来自后台任务的 toast 通知动作触发器 - UWP

UWP toast

如何在UWP App中创建信息丰富的Toast通知

如何使用 UWP 应用检测由另一个应用触发的 Windows 10 Toast 通知

WPF 桌面应用程序,Windows 10 通知 Toast 2016(UWP 社区工具包)

UWP Toast 消息未出现在 Windows 11 中