处理Xamarin Forms iOS的本地通知水龙头

时间:2018-09-07 21:05:27

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

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

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

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

我找不到崩溃的问题。

这是我在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();
       }
}

2 个答案:

答案 0 :(得分:0)

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());
        }
}

答案 1 :(得分:0)

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

在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中