处理本地通知点击 Xamarin Forms iOS

Posted

技术标签:

【中文标题】处理本地通知点击 Xamarin Forms iOS【英文标题】:Handle local notification tap Xamarin Forms iOS 【发布时间】:2019-02-13 05:24:50 【问题描述】:

我在 Xamarin Forms 上创建了一个应用程序,我在其中通过名为 Plugin.Notifications 的插件在 PCL 中安排本地通知。但是我想知道用户是否通过通知进入应用程序。

我尝试检查 UIApplication.LaunchOptionsLocalNotificationKey 是否存在于启动“选项”字典中,但启动选项字典始终为空。

然后我尝试通过 ReceivedLocalNotification 委托方法来处理它,并且我能够获取点击事件,当应用程序处于前台或后台时它工作正常,但是当应用程序被杀死并通过点击打开时通知,它正在崩溃。

我无法找到崩溃的问题。

这是我在 ReceivedLocalNotification 方法中所做的。 我正在通过 DependencyService 设置布尔值。

 public override void ReceivedLocalNotification(UIApplication application, UILocalNotification notification)
    
        NSUserDefaults.StandardUserDefaults.Init();
        DependencyService.Get<INotificationTap>().SetNoitificationTap(true);
    

依赖服务的处理

[assembly: Xamarin.Forms.Dependency(typeof(NotificationTapios))]
namespace abc.iOS

    public class NotificationTapIOS:NSObject,INotificationTap
    
        public bool GetNotificationTap()
       
           return NSUserDefaults.StandardUserDefaults.BoolForKey("notificationTapKey");
       

       public void SetNoitificationTap(bool isNotificationTapped)
       
     NSUserDefaults.StandardUserDefaults.SetBool(isNotificationTapped,"notificationTapKey");
        NSUserDefaults.StandardUserDefaults.Synchronize();
       

【问题讨论】:

【参考方案1】:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)



if (options != null)
        
            // check for a local notification
            if (options.ContainsKey(UIApplication.LaunchOptionsLocalNotificationKey))
            
                var localNotification = options[UIApplication.LaunchOptionsLocalNotificationKey] as UILocalNotification;
                if (localNotification != null)
                
                    LoadApplication(new App());
                    UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0;// reset our badge
                
            
        
else
        
            LoadApplication(new App());
        

【讨论】:

options 值总是为 'null',所以我无法使用它进行验证,我已经尝试过了,然后必须使用 RecieveLocalNotification 方法。 我有一个解决方法,在命名类似于基类的参数(即应用程序到 uiApplication 和选项到 launchOptions )之后,在这种情况下,launchOption 有密钥。【参考方案2】:

我找到了解决此问题的方法,我不知道这是否是正确的方法,但它对我有用。

在 Xamarin.iOS 中,当应用启动时,首先调用基类方法(即 applicationDidFinishLaunching),然后调用 Xamarin 部分(即 FinishedLaunching)。

所以我更改了 FinishedLaunching 参数名称,类似于基类参数(即 'app' 到 'uiApplication' 和 'options' 到 'launchOptions' ),我在 launchOptions 字典中得到了密钥。

 public override bool FinishedLaunching(UIApplication uiApplication, NSDictionary launchOptions)
    
        global::Xamarin.Forms.Forms.Init();

        isNotificationTapped = false;

        if (launchOptions != null) 
            if (launchOptions.ContainsKey(UIApplication.LaunchOptionsLocalNotificationKey))
               isNotificationTapped = true;
        

        LoadApplication(new App());
        return base.FinishedLaunching(uiApplication, launchOptions);
    

当用户通过通知点击启动应用时,AppDelegate 的 FinishedLaunching 方法被执行,我们可以验证 launchOptions 字典找到点击事件,如果应用处于后台或运行阶段,用户点击通知然后调用 AppDelegate 的 RecieveLocalNotification 方法。

  public override void ReceivedLocalNotification(UIApplication application, UILocalNotification notification)
    
        isNotificationTapped = true;
    

初始化值后,我使用 DependencyService 将其保存在 UserDefaults 中

【讨论】:

以上是关于处理本地通知点击 Xamarin Forms iOS的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 Xamarin Forms 中推送通知中的点击事件?

Xamarin.Forms - 适用于 iOS 和 Android 的推送通知

用户关闭应用程序时如何处理用户在 Xamarin iOS 上单击本地通知?

Xamarin Forms iOS 远程通知不显示

如何在 Xamarin Forms iOS 中的特定页面上导航?

Xamarin.Forms 无法更改本地设备上 Xamarin.iOS 中的应用程序图标