gpt4 book ai didi

ios - Xamarin IOS : How to handle notification tap when the app is not in the background?(终止状态)

转载 作者:行者123 更新时间:2023-11-29 05:36:01 26 4
gpt4 key购买 nike

我已经使用 Firebase Cloud Messaging 在我的 xamarin 表单项目(聊天应用程序)上实现了推送通知。在所有状态下都会收到通知,当点击通知时,我需要显示相应的消息列表页面。

当应用程序处于前台和后台模式时,通知点击功能有效。但是,当应用程序不在后台(终止状态)时,点击不起作用。 使用 DidReceiveRemoteNotification 当应用程序处于后台状态时,我正在处理通知点击。使用 WillPresentNotificationDidReceiveNotificationResponse 我正在前台模式下显示通知并处理通知点击。添加的代码如下:

 //Notification tapping when the app is in background mode.
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<webContentList>>(userInfo[new NSString("webContentList")] as NSString);
Console.WriteLine($"myData received: {myData}");
if (UIApplication.SharedApplication.ApplicationState.Equals(UIApplicationState.Active))
{
//App is in foreground, no action
}
else
{
MessagingCenter.Send<object, List<webContentList>>(this, "messagedata", myData);
}
}

//Showing the notification when the app is in the foreground mode.
[Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
public void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification,
Action<UNNotificationPresentationOptions> completionHandler)
{
completionHandler(UNNotificationPresentationOptions.Sound | UNNotificationPresentationOptions.Alert);
}

//Notification tapping when the app is in the foreground mode.
[Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action
completionHandler)
{
completionHandler();
NSDictionary userInfo = response.Notification.Request.Content.UserInfo;
var myData = JsonConvert.DeserializeObject<List<webContentList>>(userInfo[new NSString("webContentList")] as NSString);
Console.WriteLine($"myData received: {myData}");
MessagingCenter.Send<object, List<webContentList>>(this, "messagedata", myData);
}

启动完成

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
LoadApplication(new App());

#region Push Notification
Firebase.Core.App.Configure();

// Register your app for remote notifications.
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);
}

我的通知正文: 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
}

问题

当应用程序处于终止状态时,仅加载主页,而不显示消息列表页面。但在 UI 中显示主页之前,UI 中也会出现显示进度(acr userdialogs) 的消息列表。所以我认为当应用程序处于终止状态时,FinishedLaunching 中的 LoadApplication(new App()); 在通知点击功能之后起作用。那么当应用程序处于终止状态时,如何停止执行正常的应用程序启动代码并显示消息列表页面呢?

更新

尝试如下。初始启动正常,但通过通知点击启动时崩溃。

  LoadApplication(new App());

if (options != null)
{
var myData = JsonConvert.DeserializeObject<List<webContentList>>(options[new NSString("webContentList")] as NSString);
if(myData != null)
{
MessagingCenter.Send<object, List<webContentList>>(this, "messagedata", myData);
}
}

最佳答案

您可以通过扩展App构造函数将数据传递到Forms项目。

AppDelegate in iOS

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{

var myData = JsonConvert.DeserializeObject<List<webContentList>>(options[new NSString("webContentList")] as NSString);

global::Xamarin.Forms.Forms.Init();
LoadApplication(new App(myData));

return base.FinishedLaunching(app, options);
}

App in Forms

public App(List<webContentList> list)
{
InitializeComponent();

// handle the logic
}

更新

LoadApplication(new App());
MessagingCenter.Send<object, List<webContentList>>(this, "messagedata", myData);

关于ios - Xamarin IOS : How to handle notification tap when the app is not in the background?(终止状态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57033793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com