Xamarin Forms iOS 远程通知不显示

Posted

技术标签:

【中文标题】Xamarin Forms iOS 远程通知不显示【英文标题】:Xamarin Forms iOS Remote Notifications Not Displaying 【发布时间】:2020-11-30 18:56:44 【问题描述】:

远程通知未显示在设备上。

我们使用的是 ios 11.2 和 Twilio。 我们已经在 Apple Developer Portal 中生成了 APN 并导出了 Twilio 的证书和密钥。 Twilio 说消息已“发送”,但它从未显示在 设备。

目标是发送带有简单标题和正文的消息,并将其显示为设备上的远程推送通知。

Xamarin 文档似乎不完整,我找不到有关如何处理显示通知的明确说明。我查看了 Xamarin 示例,但它们大多涵盖本地通知。

问题在下面的 cmets 中。缺少什么?

using Foundation;
using UserNotifications;
using UIKit;

namespace MyNotifications.iOS

    
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    

        protected UIWindow window;
        protected string deviceToken = string.Empty;
        public string DeviceToken  get  return deviceToken;  

        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        
            global::Xamarin.Forms.Forms.Init();
            LoadApplication(new App());  

            // check for a notification while running
            if (options != null)
            

                if (options.ContainsKey(UIApplication.LaunchOptionsRemoteNotificationKey))
                
                    NSDictionary remoteNotification = options[UIApplication.LaunchOptionsRemoteNotificationKey] as NSDictionary;
                    if (remoteNotification != null)
                    
                        //1) is this necessary to handle??? if so, how to display? what are the properties from the remoteNotification object that contain the text?
                    
                


            

            //this prompts for permissions, which are set
            if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
            
                var notificationSettings = UIUserNotificationSettings.GetSettingsForTypes(
                                               UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, null
                                           );

                app.RegisterUserNotificationSettings(notificationSettings);
                app.RegisterForRemoteNotifications();
            
            else
            
                UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge;
                UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
            

            UNUserNotificationCenter.Current.GetNotificationSettings((settings) =>
            
                var alertsAllowed = (settings.AlertSetting == UNNotificationSetting.Enabled);
            );

            // Request notification permissions from the user
            UNUserNotificationCenter.Current.RequestAuthorization(UNAuthorizationOptions.Alert, (approved, err) =>
            
                // 2) how do we handle this??? what comes next?
            );

            return base.FinishedLaunching(app, options);
        

    
        // 3) does this override need to do anything???
        public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
        
            // 4) should all of these trigger a notification? does that have to happen manually?
            if (application.ApplicationState == UIApplicationState.Active)
            
                ProcessPushNotification(userInfo, true);
            
            else if (application.ApplicationState == UIApplicationState.Background)
            
                ProcessPushNotification(userInfo, true);
            
            else if (application.ApplicationState == UIApplicationState.Inactive)
            
                ProcessPushNotification(userInfo, true);
            
        

        protected void ProcessPushNotification(NSDictionary userInfo, bool isAppAlreadyRunning)
        
            if (userInfo == null) return;
            if (isAppAlreadyRunning)
            
                // 5) do we need to generate our own view???
            
            else
            
                // 6) how to handle in the background???
            

        

        // APNS background
        public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
        
            deviceToken = deviceToken.ToString();
        

        // Handle errors and offline
        public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
        
            // 7) what to do here???
        
    

【问题讨论】:

一般情况下,显示远程通知是由iOS系统处理的,您不需要添加任何代码来显示它们。如果您想自定义通知显示样式,可以阅读此document。所以我想你需要检查的是消息是否发送成功,你的设备是否正确注册? 【参考方案1】:

Microsoft Docs 提供了一些关于如何在 iOS 和 android 两个平台上处理推送通知的指南。他们中的大多数是从 Azure 通知中心发送通知,但在这种情况下,它应该没有任何区别,因为您的问题是关于显示推送通知,而不是发送它们。

send and receive notifications in a Xamarin.Forms app 指南让您了解完整的端到端设置。还有两个略有不同的指南,重点关注 Azure here 和 here

对于在 iOS 上呈现消息,如果应用程序是后台的,则通知由 iOS 呈现而无需任何自定义代码,因此如果应用程序配置和签名正确,您应该能够在没有任何额外客户端的情况下看到推送通知 -辅助代码,只需确保您在设备上进行测试(sims 不支持推送)和启用推送的有效配置文件。

【讨论】:

我将尝试从头开始创建一个新的配置文件,看看是否是问题所在。至少,我需要包含 app.RegisterUserNotificationSettings(notificationSettings);和 app.RegisterForRemoteNotifications();请求权限,对吗? 是的,您需要申请权限。 如何将令牌注册到服务器? 我没有使用 Twilio 推送通知,但通常的流程是您在客户端获取一个令牌,然后调用 API 将该令牌发送到您的服务器 (API)。服务器将来会使用该令牌通过 Apple 服务器发送通知。对于 Twilio SDK,您很可能希望调用一些 SDK 方法来向其后端提交令牌,而不是调用某些 API。

以上是关于Xamarin Forms iOS 远程通知不显示的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms Android推送通知不会出现

Xamarin.Forms - 适用于 iOS 和 Android 的推送通知

如何在 Xamarin Forms iOS 中的特定页面上导航?

在 Xamarin.Forms 中打开通知

处理本地通知点击 Xamarin Forms iOS

xamarin.forms 中的推送通知