【问题标题】:Handle local notification tap Xamarin Forms iOS处理本地通知点击 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();
       }
}

【问题讨论】:

    标签: ios xamarin.forms xamarin.ios nsuserdefaults localnotification


    【解决方案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 中

    【讨论】:

      猜你喜欢
      • 2018-04-30
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多