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)
    {
    }
}