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

Sua*_*ave 4 push-notification xamarin.ios apple-push-notifications ios xamarin

我正在创建一个包含推送通知的 Xamarin.iOS 应用程序。

我注意到,如果应用程序没有运行(不仅仅是在后台运行),当推送通知到达(带有正确的负载)时,操作系统将接管处理通知并将其呈现给用户,如果用户在关闭时单击通知,我将能够从 FinishedLaunching 方法的 NSDictionary 选项参数中获取此信息(查找它是否包含 UIApplication.LaunchOptionsRemoteNotificationKey 键)

到目前为止,一切都很好。

但我有两种情况,

1) 推送通知在应用程序运行时到达。2) 用户在启动应用程序后点击了较早到达的推送通知(应用程序关闭时)

对于这两种情况,都会调用 ReceivedRemoteNotification 方法。

但是对于每个场景我想做不同的业务逻辑,我的问题是:我怎么知道 ReceivedRemoteNotification 是由场景 1 还是场景 2 调用的?

我是 Xamarin 的新手,我在网上搜索过它,但找不到解决方案。

谁能帮我这个?

谢谢。

RJV*_*mar 6

使用以下条件检查应用程序状态,在 didReceiveRemoteNotification 方法中,

UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
{//write here...Application opened by tapping notification}
Run Code Online (Sandbox Code Playgroud)

仅供参考-以上代码在Objective-c中


Mar*_*ter 5

我认为我没有ReceivedRemoteNotification在应用程序停止时通过用户点击收到的通知来启动应用程序时看到调用。我只看到当通知在设备上传递时应用程序正在运行时调用此函数。因此,我们通过传递一个名为isAppAlreadyRunningset falseif Called fromFinishedLaunchingtrueif Called from 的标志来区分ReceivedRemoteNotification

这似乎在已发布的 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...
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)