Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OneSignal:如何处理在Xamarin.Forms应用程序的AppDelegate中打开的通知?_C#_Xamarin_Xamarin.ios_Xamarin.forms_Onesignal - Fatal编程技术网

C# OneSignal:如何处理在Xamarin.Forms应用程序的AppDelegate中打开的通知?

C# OneSignal:如何处理在Xamarin.Forms应用程序的AppDelegate中打开的通知?,c#,xamarin,xamarin.ios,xamarin.forms,onesignal,C#,Xamarin,Xamarin.ios,Xamarin.forms,Onesignal,我正在Xamarin.Forms中实现OneSignal推送通知 我需要将OneSignalAdditionalData返回的字符串传递到App()的构造函数中 因此,我使用handleNotificationOpenedResult(OSNotificationOpenedResult)处理通知点击并获取字符串,然后将其传递给LoadApplication(新应用程序(myData)) 为此,我在Android的MainActivity和iOS的AppDelegate中编写了代码 Androi

我正在Xamarin.Forms中实现OneSignal推送通知

我需要将OneSignal
AdditionalData
返回的字符串传递到
App()
的构造函数中

因此,我使用
handleNotificationOpenedResult(OSNotificationOpenedResult)
处理通知点击并获取字符串,然后将其传递给
LoadApplication(新应用程序(myData))

为此,我在Android的
MainActivity
和iOS的
AppDelegate
中编写了代码

Android的一切都很好;i、 e.
HandleNotificationOpened()
获取
附加数据
并将其传递给
LoadApplication(新应用程序(myData))

但是在iOS中,当我打开通知时,不会调用
HandleNotificationOpened()
代码

AppDelegate.cs
静态字符串s=null;
公共覆盖bool FinishedLaunching(UIApplication应用程序、NSDictionary选项)
{
OneSignal.Current.StartInit(“MyKey”).HandleNotificationOpened(HandleNotificationOpened.EndInit();
如果(s!=null)
{
加载应用程序(新应用程序);
}
其他的
{
LoadApplication(新应用程序(“myUrl.lasso”);
}
返回基地。完成发射(应用程序,选项);
}
已打开私有静态无效句柄通知(OSNotificationOpenedResult结果)
{
OSNotificationPayload有效载荷=result.notification.payload;
Dictionary additionalData=有效负载。additionalData;
如果(附加数据!=null)
{
if(additionalData.ContainsKey(“url_direct”))
{
s=附加数据[“url_direct”]。ToString();
System.Diagnostics.Debug.WriteLine(“我们需要将其重定向到:”+s);
}
}
}
答案 覆盖
AppDelegate
中的
DidReceivedRemoteNotification
事件

代码
public override void didReceiveMemoteNotification(UIApplication应用程序、NSDictionary用户信息、System.Action completionHandler)
{
base.didReceiveMemotentification(应用程序、用户信息、完成处理程序);
NSDictionary aps=userInfo.ObjectForKey(新NSString(“aps”))作为NSDictionary;
字符串警报=string.Empty;
如果(aps.ContainsKey(新NSString(“警报”))
警报=(aps[新NSString(“警报”)]作为NSString.ToString();
if(application.ApplicationState==UIApplicationState.Active)
{
//应用程序当前处于活动状态,您可以在此处获取有效负载(userInfo)数据
}
else if(application.ApplicationState==UIApplicationState.Background)
{
//应用程序位于后台,您可以获取有效负载(userInfo)
}
else if(application.ApplicationState==UIApplicationState.Inactive)
{
//应用程序正在从后台过渡到前台(用户点击通知),当用户点击此处时,做您需要的事情,您可以获得您的有效负载(用户信息)
}
}

我找到了一个解决办法。 实际上,我们无法在AppDelegate的finishedLaunching()上捕捉到通知点击,这就是为什么HandleNotificationOpened(HandleNotificationOpened)在iOS中无法正常工作的原因。所以我在PCL公共文件夹应用程序类上实现了它

static string s = null;

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    OneSignal.Current.StartInit("MyKey").HandleNotificationOpened(HandleNotificationOpened).EndInit();
    
    if(s!=null)
    {
        LoadApplication(new App(s));
    }
    else
    {
        LoadApplication(new App("myUrl.lasso")); 
    }

    return base.FinishedLaunching(app, options);
}

private static void HandleNotificationOpened(OSNotificationOpenedResult result)
{
    OSNotificationPayload payload = result.notification.payload;
    Dictionary<string, object> additionalData = payload.additionalData;

    if (additionalData != null)
    {
        if (additionalData.ContainsKey("url_direct"))
        {
            s = additionalData["url_direct"].ToString();
            System.Diagnostics.Debug.WriteLine("We need to redirect it to: " + s);
        }
    }
}
public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, System.Action<UIBackgroundFetchResult> completionHandler)
{
    base.DidReceiveRemoteNotification(application, userInfo, completionHandler);

    NSDictionary aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary;
            
    string alert = string.Empty;
    if (aps.ContainsKey(new NSString("alert")))
        alert = (aps [new NSString("alert")] as NSString).ToString();

    if (application.ApplicationState == UIApplicationState.Active)
    {
        //app is currently active, you can get your payload (userInfo) data here
    }
    else if (application.ApplicationState == UIApplicationState.Background)
    {
        //app is in background, you can get your payload (userInfo)
    }
    else if (application.ApplicationState == UIApplicationState.Inactive)
    {
        //app is transitioning from background to foreground (user taps notification), do what you need when user taps here, you can get your payload (userInfo)
    }
}