如何检测用户点击Xamarin IOS中的应用程序图标或远程通知图标

时间:2018-06-14 08:00:50

标签: xamarin.ios

我正在xamarion IOS中构建一个消息应用程序。我的问题是关注

应用程序位于后台,远程通知出现。现在,用户可以通过单击应用程序图标和通知图标来打开应用程序。收到通知时以及用户点击通知时,应用程序调用didReceivedRemoteNotification。在两种情况下,应用程序状态为背景 当用户点击通知我需要打开与通知相关的屏幕时 当用户点击主屏幕上的应用程序图标时,我需要打开默认屏幕。

无论是通过点击远程通知还是通过应用程序图标,我都无法识别该应用程序是否已打开。

编辑:应用程序仍在后台运行。

2)应用程序在前台,用户锁定手机。    在这种情况下,App的状态变为Background,因为调用了WillEnterBackground。现在Application处于后台并且收到远程通知,并且使用App状态触发的DidReceiveRemoteNotification事件是Background。用户点击通知,再次调用DidReceiveRemoteNotification,状态为后台。因此我无法打开与通知相关的屏幕,因为我无法识别由于收到通知或因收到通知而触发事件。

我已尝试过以下stackoverflow链接iOS push notification: how to detect if the user tapped on notification when the app is in background?

中给出的解决方案

但仍面临同样的问题。

1 个答案:

答案 0 :(得分:0)

当用户锁定屏幕时,应用程序将进入后台状态。因此,当远程通知到达时,系统将在通知中心(屏幕顶部)提醒用户,并且当应用程序处于前台状态时,DidReceiveRemoteNotification将不会自动触发。当应用处于后台状态时,只有一个状态可以触发DidReceiveRemoteNotification事件(点击顶部的通知以打开应用)。这个背景状态包括你上面提到的情况:

  

应用程序位于前台,用户可以锁定手机。

所以我认为并且我测试过:当用户锁定屏幕并且通知到来时(在此操作之前,应用程序在前台),DidReceiveRemoteNotification将不会被自动调用。

如果您在iOS 10+上部署了应用,那么实现效果的另一种方法是实施IUNUserNotificationCenterDelegate界面。在您的代理中实现以下两个事件:

[Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
public void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
{
    Console.WriteLine("Handling iOS 10 foreground notification");
    completionHandler(UNNotificationPresentationOptions.Sound | UNNotificationPresentationOptions.Alert);
}

[Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
{
    completionHandler();
}

WillPresentNotification被调用以向前台运行的应用程序发送通知。并且只有当用户点击通知时才会触发DidReceiveNotificationResponse,即使app位于前台。因此,您可以将代码从DidReceiveRemoteNotification移至DidReceiveNotificationResponse。此事件将确保仅在用户点击通知后运行代码。