- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用 Firebase Cloud Messaging 在我的 xamarin 表单项目(聊天应用程序)上实现了推送通知。在所有状态下都会收到通知,当点击通知时,我需要显示相应的消息列表页面。
当应用程序处于前台和后台模式时,通知点击功能有效。但是,当应用程序不在后台(终止状态)时,点击不起作用。 使用 DidReceiveRemoteNotification
当应用程序处于后台状态时,我正在处理通知点击。使用 WillPresentNotification
和 DidReceiveNotificationResponse
我正在前台模式下显示通知并处理通知点击。添加的代码如下:
//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/
如果我终止应用程序,我在尝试保持我的功能运行时卡住了。 是否可以在应用程序未运行时保持核心位置(地理围栏/地理定位)和核心蓝牙运行?如果可能如何解决我的问题?我已经检查了背景模式,并实现了核心定位方法
该程序要求用户输入一个数字,然后从列表中返回详细信息。我该怎么做? do { Scanner in = new Scanner(System.in);
我正在开发一个内部分发的 iOS 应用程序(即,没有应用程序商店),我希望能够以恒定的 10 分钟间隔报告设备的位置。 无论如何,我在我的 plist 中包含了 location 作为字段 UIBac
我的 mongodb 服务器突然收到信号 15(终止)。我不知道为什么 mongodb 崩溃了。以下是日志消息。 Mon Jun 27 07:33:31.701 [signalProcessingTh
我按顺序运行了一堆malloc,并且每次都检查以确保它是成功的。像这样: typedef struct { int *aray; char *string; } mystruct; m
这个问题已经有答案了: How to stop a running pthread thread? (4 个回答) 已关闭 8 年前。 可以使用 pthread_join() 停止线程。但让我们想象一
#include #include #include struct node{ char data; int p; struct node *ptr; }; struct node *st
这个问题已经有答案了: Why should I use a semicolon after every function in javascript? (9 个回答) 已关闭 8 年前。 好吧,我问
我有一个启动多个工作线程的函数。每个工作线程都由一个对象封装,该对象的析构函数将尝试加入线程,即调用if (thrd_.joinable()) thrd_.join();。但是,每个 worker 必
我正在实现一个应用程序,当用户摇动手机时,该应用程序会监听并采取行动。 所以我实现了以下服务: public class ShakeMonitorService extends Service {
我在使用 Xcode 时遇到问题,其中弹出错误“Source Kit Service Terminated”,并且所有语法突出显示和代码完成在 Swift 中都消失了。我怎样才能解决这个问题? 这是一
我想为我的控制台应用程序安全退出,该应用程序将使用单声道在 linux 上运行,但我找不到解决方案来检测信号是否发送到它或用户是否按下了 ctrl+c。 在 Windows 上有内核函数 SetCon
关键: pthread_cancel函数发送终止信号pthread_setcancelstate函数设置终止方式pthread_testcancel函数取消线程(另一功能是:设置取消点) 1 线程取消
下面的程序在不同的选项级别下有不同的行为。当我用 -O3 编译它时,它永远不会终止。当我用 -O0 编译它时,它总是很快就会终止。 #include #include void *f(void *
我有 3 个节点的 K8S 集群,我创建了 3 个副本 pod,应用程序 app1 在所有 pod 上运行,我通过运行 service yaml 文件建立了服务,我可以看到通过运行 kubectl g
我打算使用 nginx 来代理 websocket。在执行 nginx reload/HUP 时,我知道 nginx 等待旧的工作进程停止处理所有请求。然而,在 websocket 连接中,这可能不会
在 Ubuntu 9.10 上使用 PVM 3.4.5-12(使用 apt-get 时的 PVM 包) 添加主机后程序终止。 laptop> pvm pvm> add bowtie-slave add
我编写了一个应用程序来从 iPhone 录制视频。它工作正常,但有一个大问题。当 AVCaptureSession 开始运行并且用户尝试从其库(iPod)播放音频时。此操作将使 AVCaptureSe
我将如何使用NSRunningApplication?我有与启动应用程序相反的东西: [[NSWorkspace sharedWorkspace] launchApplication:appName]
我正在使用 NSTask 执行一系列长时间运行的命令,如下所示: commandToRun = @"command 1;command2"; NSArray *arguments = [NSArray
我是一名优秀的程序员,十分优秀!