ios - Xamarin 表单:如何处理 ios 中的通知点击
问题描述
我已经在我的 xamarin forms ios 项目上实现了推送通知。现在我可以在我的 iPhone 上接收邮递员推送的通知。但是当点击通知时,如何从通知中读取我的模型数据并加载 PCL App.xaml.cs?
在 ios 设备中单击通知时,我需要在我的 PCL 项目上打开一个内容页面(消息列表页面)。我已经在我的 PCL 项目 App.xaml.cs 上实现了这一点。为此,我需要使用从通知接收到的模型数据从 AppDelegate.cs 加载 App.xaml.cs。
按照我App.xaml.cs
从Android加载的方式MainActivity
LoadApplication(new App(notificationdata));
在 iosDidReceiveRemoteNotification
中,在接收到后台和前台模式的通知时调用,但在点击通知时不调用。
我的通知正文: webContentList
是我的模型数据。
{
"to" : "dmtfiSvBBM0:APA91bFnHkamMSYgxPuiSfdvKnU8hD_mOqrWijnENNgXVSkSgo1ILH3-uKVCU7Ez2PXXOhtDoobIyKBf5UshVfTmvjSqHgXMRTsqguKCSTjIfGnXrVP-_cNFq2sisshZO-BcfkwKTl-I",
"collapse_key" : "type_a",
"notification" : {
"body" : "This is body",
"title": "Tech Team",
"priority":"high",
"content_available":true
},
"data" : {
"webContentList": [
{
"webContentDefinitionId": 818084,
"pageTitle": "CCD Grade 3-4",
"pageKwd": "CCD Grade 3-4",
"pageDesc": "CCD Grade 3-4",
"siteId": 45,
"pageCreatedTime": 1555145959428,
"pageUpdatedDate": 1555927274279,
"modifier": {
"userId": 12944,
"applicationId": 32,
"username": "robert.downey",
"email": "robert@master-mail.net",
"firstName": "Robert",
"lastName": "Downey"
},
"creator": {
"userId": 12944,
"applicationId": 32,
"username": "robert.downey",
"email": "robert@master-mail.net",
"firstName": "Robert",
"lastName": "Downey"
}
}
]
},
"ttl": 3600
}
我的 AppDelegate.cs
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IUNUserNotificationCenterDelegate, IMessagingDelegate
{
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
Rg.Plugins.Popup.Popup.Init();
global::Xamarin.Forms.Forms.Init();
ImageCircleRenderer.Init();
LoadApplication(new App("", ""));
#region Push Notification
Firebase.Core.App.Configure();
if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
{
// iOS 10 or later
var authOptions = UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound;
UNUserNotificationCenter.Current.RequestAuthorization(authOptions, (granted, error) => {
Console.WriteLine(granted);
});
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.Current.Delegate = this;
// For iOS 10 data message (sent via FCM)
//Messaging.SharedInstance.RemoteMessageDelegate = this;
}
else
{
// iOS 9 or before
var allNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
var settings = UIUserNotificationSettings.GetSettingsForTypes(allNotificationTypes, null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
}
UIApplication.SharedApplication.RegisterForRemoteNotifications();
Messaging.SharedInstance.Delegate = this;
Messaging.SharedInstance.ShouldEstablishDirectChannel = true;
#endregion
return base.FinishedLaunching(app, options);
}
[Export("messaging:didReceiveRegistrationToken:")]
public void DidReceiveRegistrationToken(Messaging messaging, string fcmToken)
{
LogInformation(nameof(DidReceiveRegistrationToken), $"Firebase registration token: {fcmToken}"
MessagingCenter.Send<object, string>(this, "fcmtoken", fcmToken.ToString());
Console.WriteLine($"fcmtoken received: {fcmToken}");
}
public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
HandleMessage(userInfo);
// Print full message.
LogInformation(nameof(DidReceiveRemoteNotification), userInfo);
completionHandler(UIBackgroundFetchResult.NewData);
}
[Export("messaging:didReceiveMessage:")]
public void DidReceiveMessage(Messaging messaging, RemoteMessage remoteMessage)
{
// Handle Data messages for iOS 10 and above.
HandleMessage(remoteMessage.AppData);
LogInformation(nameof(DidReceiveMessage), remoteMessage.AppData);
}
void HandleMessage(NSDictionary message)
{
//if (MessageReceived == null)
// return;
//MessageType messageType;
//if (message.ContainsKey(new NSString("aps")))
// messageType = MessageType.Notification;
//else
// messageType = MessageType.Data;
//var e = new UserInfoEventArgs(message, messageType);
//MessageReceived(this, e);
}
public static void ShowMessage(string title, string message, UIViewController fromViewController, Action actionForOk = null)
{
var alert = UIAlertController.Create(title, message, UIAlertControllerStyle.Alert);
alert.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, (obj) => actionForOk?.Invoke()));
fromViewController.PresentViewController(alert, true, null);
}
void LogInformation(string methodName, object information) => Console.WriteLine($"\nMethod name: {methodName}\nInformation: {information}");
async Task RequestPushPermissionAsync()
{
// iOS10 and later (https://developer.xamarin.com/guides/ios/platform_features/user-notifications/enhanced-user-notifications/#Preparing_for_Notification_Delivery)
// Register for ANY type of notification (local or remote):
var requestResult = await UNUserNotificationCenter.Current.RequestAuthorizationAsync(
UNAuthorizationOptions.Alert
| UNAuthorizationOptions.Badge
| UNAuthorizationOptions.Sound);
// Item1 = approved boolean
bool approved = requestResult.Item1;
NSError error = requestResult.Item2;
if (error == null)
{
// Handle approval
if (!approved)
{
Console.Write("Permission to receive notifications was not granted.");
return;
}
var currentSettings = await UNUserNotificationCenter.Current.GetNotificationSettingsAsync();
if (currentSettings.AuthorizationStatus != UNAuthorizationStatus.Authorized)
{
Console.WriteLine("Permissions were requested in the past but have been revoked (-> Settings app).");
return;
}
UIApplication.SharedApplication.RegisterForRemoteNotifications();
}
else
{
Console.Write($"Error requesting permissions: {error}.");
}
}
}
}
收到通知时记录数据:
Method name: DidReceiveRemoteNotification
Information: {
aps = {
alert = {
body = "This is body";
title = "Tech Team";
};
"content-available" = 1;
};
"gcm.message_id" = 1562648547588794;
"gcm.notification.priority" = high;
"google.c.a.e" = 1;
webContentList = "[{\"swcmMessage\":null,\"pageTitle\":\"CCD Grade 3-4\",\"modifier\":{\"lastname\":\"downey\",\"zipcode\":null,\"parentemail\":null,\"address2\":null,\"city\":null,\"address1\":null,\"phone2\":null,\"userid\":12944,\"enabled\":true,\"phone1\":null,\"firstname\":\"robert\",\"state\":null,\"usertype\":null,\"applicationid\":32,\"profileimageurl\":null,\"profileimagetype\":null,\"email\":\"robert@master-mail.net\",\"username\":\"robert.downey\"},\"deletable\":true,\"pagecontenttype\":\"tweets.topics\",\"previewuuid\":null,\"webcontentdefinitionid\":818084,\"pagecreatedtime\":1555145959428,\"usercreated\":12944,\"pagestatus\":\"on\",\"thumbnailimageurl\":null,\"videourl\":null,\"imageurl\":\"\",\"webcontentid\":65059,\"creator\":{\"lastname\":\"downey\",\"zipcode\":null,\"parentemail\":null,\"address2\":null,\"city\":null,\"address1\":null,\"phone2\":null,\"userid\":12944,\"enabled\":true,\"phone1\":null,\"firstname\":\"robert\",\"state\":null,\"usertype\":null,\"applicationid\":32,\"profileimageurl\":null,\"profileimagetype\":null,\"email\":\"robert\"},\"contentTemplateId\":null,\"appName\":\"services\",\"customHTML\":\"\",\"processedTime\":null,\"pageDesc\":\"CCD Grade 3-4\",\"editUrl\":\"\\/module\\/tweets-topics\\/edit-tweets-topics?webcontentid=818084\",\"pageKwd\":\"CCD Grade 3-4\",\"staticContent\":true,\"siteId\":45,\"pageUrl\":\"\\/tweets-topics\\/818084\\/1\\/ccd-grade-3-4\",\"linkType\":null,\"pageUpdatedDate\":1555927274279,\"swcmStatus\":null,\"userModified\":12944}]";
}
webContentList
是我的模型数据,我在加载 App.xaml.cs 时需要该数据。如何从DidReceiveRemoteNotification userInfo
App.xaml.cs 解析该数据并加载?
解决方案
用于Newtonsoft.Json
反序列化 json 并Messaging Center
传递数据。
AppDelegate.cs
public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
HandleMessage(userInfo);
// Print full message.
LogInformation(nameof(DidReceiveRemoteNotification), userInfo);
completionHandler(UIBackgroundFetchResult.NewData);
var myData = JsonConvert.DeserializeObject<List<YourModel>>(userInfo[new NSString("webContentList")] as NSString);
MessagingCenter.Send<object,List<YourModel>>(this,"PassData",myData);
}
应用程序.cs
MessagingCenter.Subscribe<object, List<YourModel>>(this, "PassData", (object obj , List<YourModel> list)=>{
});
推荐阅读
- flutter - Flutter - 从头开始实施 lex?
- angular - 上传多个文件角度和springboot
- angular - 离子。ionic 错误。目标入口点“@ionic-native/geolocation”缺少依赖项:[ng] - @ionic-native/core
- azure - scriptrunconfig、runconfig 和 estimator 的区别
- css - Bootstrap 性能不佳 - custom-select resp select.form-control 冻结了几秒钟
- python-3.x - PySpark 读取子文件夹/目录中的所有 json 文件(使用通配符)并添加文件/文件夹名称
- ios - iOS webview http post到另一个新窗口不起作用
- ios - iphone 和 ipad 问题 - 引导卡底部的空白
- c# - 尝试通过代码创建递归索引时在 RavenDB 中获取 IndexCompilationException
- flutter - Flutter - 使用 AndroidAlarmManager 和 Location 获取位置