Xamarin iOS - 推送通知 - 区分已点击的推送通知和已到达的推送通知
Xamarin iOS - Push Notifications - Distinguish push notification clicked from arrived
我正在创建一个包含推送通知的 Xamarin.iOS 应用程序。
我注意到如果应用不是 运行(不仅仅是在后台),当推送通知到达时(具有正确的负载),OS 将接管处理通知并将其呈现给用户,如果用户在通知关闭时单击通知,我将能够从 FinishedLaunching 方法的 NSDictionary 选项参数中获取此信息(查找它是否包含 UIApplication.LaunchOptionsRemoteNotificationKey 键)
到目前为止,一切都很好。
但我有两种情况,
1) 推送通知在应用程序 运行 时到达。
2) 用户在启动应用程序后点击了较早到达的推送通知(应用程序关闭时)
对于这两种情况,都会调用 ReceivedRemoteNotification 方法。
但是对于每个场景我想做不同的业务逻辑,我的问题是:
我如何知道 ReceivedRemoteNotification 是由场景 1 还是场景 2 调用的?
我是 Xamarin 的新手,我在网上搜索过它,但找不到解决方案。
谁能帮我解决这个问题?
谢谢。
我认为我没有看到 ReceivedRemoteNotification
当应用程序通过用户点击应用程序停止时收到的通知启动时调用。当通知在设备上传送时,我只看到如果应用程序是 运行 时调用。因此,我们通过传递一个名为 isAppAlreadyRunning
的标志来区分,如果从 FinishedLaunching
调用,则设置 false
,如果从 ReceivedRemoteNotification
调用,则设置 true
。
这似乎在 Xamarin.iOS 应用程序中运行良好。所有代码都在 AppDelegate.cs
:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
...
// Initialize Xamarin Forms and load the application.
Xamarin.Forms.Forms.Init();
LoadApplication(new Forms.App(0));
// Check if App was opened by Push Notification.
var keyName = new NSString("UIApplicationLaunchOptionsRemoteNotificationKey");
if (options != null && options.Keys != null && options.Keys.Length != 0 && options.ContainsKey(keyName))
{
NSDictionary pushOptions = options.ObjectForKey(keyName) as NSDictionary;
ProcessPushNotification(pushOptions, false);
}
return base.FinishedLaunching(app, options);
}
public override void ReceivedRemoteNotification(UIApplication app, NSDictionary userInfo)
{
Debug.WriteLine("ReceivedRemoteNotification entered.");
ProcessPushNotification(userInfo, true);
}
protected void ProcessPushNotification(NSDictionary userInfo, bool isAppAlreadyRunning)
{
if (userInfo == null) return;
if (isAppAlreadyRunning)
{
// do something with this knowledge...
}
...
}
在 didReceiveRemoteNotification 方法中使用以下条件检查应用程序状态,
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
{//write here...Application opened by tapping notification}
仅供参考-上面的代码在Objective-c
非常感谢@RJVKumar,这就是我要找的!
为了帮助其他人,这是 C# 中的代码:
public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
{
if (application.ApplicationState == UIApplicationState.Active)
{
}
else if (application.ApplicationState == UIApplicationState.Background)
{
}
else if (application.ApplicationState == UIApplicationState.Inactive)
{
}
}
我正在创建一个包含推送通知的 Xamarin.iOS 应用程序。
我注意到如果应用不是 运行(不仅仅是在后台),当推送通知到达时(具有正确的负载),OS 将接管处理通知并将其呈现给用户,如果用户在通知关闭时单击通知,我将能够从 FinishedLaunching 方法的 NSDictionary 选项参数中获取此信息(查找它是否包含 UIApplication.LaunchOptionsRemoteNotificationKey 键)
到目前为止,一切都很好。
但我有两种情况,
1) 推送通知在应用程序 运行 时到达。 2) 用户在启动应用程序后点击了较早到达的推送通知(应用程序关闭时)
对于这两种情况,都会调用 ReceivedRemoteNotification 方法。
但是对于每个场景我想做不同的业务逻辑,我的问题是: 我如何知道 ReceivedRemoteNotification 是由场景 1 还是场景 2 调用的?
我是 Xamarin 的新手,我在网上搜索过它,但找不到解决方案。
谁能帮我解决这个问题?
谢谢。
我认为我没有看到 ReceivedRemoteNotification
当应用程序通过用户点击应用程序停止时收到的通知启动时调用。当通知在设备上传送时,我只看到如果应用程序是 运行 时调用。因此,我们通过传递一个名为 isAppAlreadyRunning
的标志来区分,如果从 FinishedLaunching
调用,则设置 false
,如果从 ReceivedRemoteNotification
调用,则设置 true
。
这似乎在 Xamarin.iOS 应用程序中运行良好。所有代码都在 AppDelegate.cs
:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
...
// Initialize Xamarin Forms and load the application.
Xamarin.Forms.Forms.Init();
LoadApplication(new Forms.App(0));
// Check if App was opened by Push Notification.
var keyName = new NSString("UIApplicationLaunchOptionsRemoteNotificationKey");
if (options != null && options.Keys != null && options.Keys.Length != 0 && options.ContainsKey(keyName))
{
NSDictionary pushOptions = options.ObjectForKey(keyName) as NSDictionary;
ProcessPushNotification(pushOptions, false);
}
return base.FinishedLaunching(app, options);
}
public override void ReceivedRemoteNotification(UIApplication app, NSDictionary userInfo)
{
Debug.WriteLine("ReceivedRemoteNotification entered.");
ProcessPushNotification(userInfo, true);
}
protected void ProcessPushNotification(NSDictionary userInfo, bool isAppAlreadyRunning)
{
if (userInfo == null) return;
if (isAppAlreadyRunning)
{
// do something with this knowledge...
}
...
}
在 didReceiveRemoteNotification 方法中使用以下条件检查应用程序状态,
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
{//write here...Application opened by tapping notification}
仅供参考-上面的代码在Objective-c
非常感谢@RJVKumar,这就是我要找的!
为了帮助其他人,这是 C# 中的代码:
public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
{
if (application.ApplicationState == UIApplicationState.Active)
{
}
else if (application.ApplicationState == UIApplicationState.Background)
{
}
else if (application.ApplicationState == UIApplicationState.Inactive)
{
}
}