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

Posted

技术标签:

【中文标题】Xamarin iOS - 推送通知 - 区分点击的推送通知与到达【英文标题】:Xamarin iOS - Push Notifications - Distinguish push notification clicked from arrived 【发布时间】:2016-04-03 10:03:43 【问题描述】:

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

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

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

但我有两种情况,

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

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

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

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

谁能帮我解决这个问题?

谢谢。

【问题讨论】:

我认为我没有看到 ReceivedRemoteNotification 在应用程序启动时通过用户点击应用程序运行时收到的通知来调用。我只在设备上发送通知时应用程序正在运行时才看到这个调用。 【参考方案1】:

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

UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
//write here...Application opened by tapping notification

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

【讨论】:

与我的回答相比,这绝对值得一试!【参考方案2】:

我认为我没有见过ReceivedRemoteNotification 在应用程序启动时通过用户点击应用程序停止时收到的通知来调用。我只在设备上传递通知时应用程序正在运行时才看到这个调用。所以我们通过传递一个名为isAppAlreadyRunning的标志来区分false如果从FinishedLaunching调用,true如果从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...
    

    ...

【讨论】:

我将尝试由@RJV Kumar 提出并由 OP 调整的方法,因为它看起来更支持 iOS。不错! 这个解决方案其实还是有帮助的,这个解决方案可以在应用没有在设备上运行的情况下工作,接受的答案只有当应用在后台时才会工作。跨度> 【参考方案3】:

非常感谢@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 - 推送通知 - 区分点击的推送通知与到达的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin 推送通知,在应用程序激活后处理远程通知

xamarin.ios 本地通知推送

Xamarin.iOS:Firebase 推送通知不起作用

Xamarin.IOS 和 Signalr 推送通知

Xamarin.iOS - 设备关闭时推送通知

为 IOS 配置和使用推送通知 - Xamarin