Xamarin iOS - 推送通知 - 区分点击和到达的推送通知

4
我正在创建一个包含推送通知的Xamarin.iOS应用程序。
我注意到,如果应用程序没有运行(不仅是在后台),当推送通知到达时(具有正确的负载),操作系统将接管处理通知,并向用户呈现它。如果用户在关闭通知时单击通知,则可以从FinishedLaunching方法的NSDictionary选项参数中获取此信息(查找是否包含UIApplication.LaunchOptionsRemoteNotificationKey键)。
到目前为止,一切都很好。
但是我有两种情况,
1.当应用程序正在运行时,推送通知到达。 2.用户在启动应用程序后单击先前到达的推送通知(当应用程序关闭时)。
对于这两种情况,ReceivedRemoteNotification方法都会被调用。
但是对于每种情况,我想执行不同的业务逻辑,我的问题是: 我如何知道ReceivedRemoteNotification是由场景1还是场景2调用的?
我刚开始使用Xamarin,已经在网络上搜索了它,但找不到解决方案。
有谁能帮助我吗?
谢谢。

我认为当应用程序在运行时通过用户点击接收到通知启动时,我没有看到ReceivedRemoteNotification被调用。我只看到当通知在设备上传递时应用程序正在运行时才会调用它。 - Mark Larter
3个回答

6
使用以下条件检查应用程序状态,在didReceiveRemoteNotification方法内部:
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
{//write here...Application opened by tapping notification}

请注意:上面的代码是使用Objective-c编写的。


与我的答案相比,这绝对值得一试! - Mark Larter

5
当用户在应用程序停止时通过点击收到的通知启动应用程序时,我不认为我曾看到过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...
    }

    ...
}

我将尝试由@RJV Kumar提出的方法,经过OP微调后,因为它看起来更加注重iOS。不错! - Mark Larter
这个解决方案实际上仍然有用,当应用程序未在设备上运行时,此解决方案将起作用,被接受的答案仅在应用程序处于后台时才会起作用。 - Eman

4
非常感谢您,@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)
    {
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接