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 - 适用于 iOS 和 Android 的推送通知