OneSignal:如何处理在 Xamarin.Forms 应用程序的 AppDelegate 中打开的通知?
OneSignal: How to Handle notificationOpened in AppDelegate of a Xamarin.Forms app?
我正致力于在 Xamarin.Forms 中实现 OneSignal 推送通知。
我需要将 OneSignal AdditionalData
返回的字符串传递给 App()
的构造函数。
所以我使用 HandleNotificationOpened(OSNotificationOpenedResult result)
处理通知点击并获取字符串,然后将其传递给 LoadApplication(new App(myData))
。
因此,为此,我在 MainActivity
中为 Android 编写了代码,在 AppDelegate
中为 iOS 编写了代码。
Android一切正常;即 HandleNotificationOpened()
获取 additionalData
并将其传递给 LoadApplication(new App(myData))
.
但是在iOS中,当我打开通知时,没有调用HandleNotificationOpened()
代码。
AppDelegate.cs
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);
}
}
}
回答
覆盖 AppDelegate
中的 DidReceivedRemoteNotification
event
。
代码
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)
}
}
我找到了解决方法。
实际上,我们无法在 AppDelegate 的 finishedLaunching() 上捕获通知点击,这就是为什么 HandleNotificationOpened(HandleNotificationOpened) 在 iOS 中无法正常工作的原因。所以我在 PCL common folder App class.
上实现了它
我正致力于在 Xamarin.Forms 中实现 OneSignal 推送通知。
我需要将 OneSignal AdditionalData
返回的字符串传递给 App()
的构造函数。
所以我使用 HandleNotificationOpened(OSNotificationOpenedResult result)
处理通知点击并获取字符串,然后将其传递给 LoadApplication(new App(myData))
。
因此,为此,我在 MainActivity
中为 Android 编写了代码,在 AppDelegate
中为 iOS 编写了代码。
Android一切正常;即 HandleNotificationOpened()
获取 additionalData
并将其传递给 LoadApplication(new App(myData))
.
但是在iOS中,当我打开通知时,没有调用HandleNotificationOpened()
代码。
AppDelegate.cs
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);
}
}
}
回答
覆盖 AppDelegate
中的 DidReceivedRemoteNotification
event
。
代码
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)
}
}
我找到了解决方法。 实际上,我们无法在 AppDelegate 的 finishedLaunching() 上捕获通知点击,这就是为什么 HandleNotificationOpened(HandleNotificationOpened) 在 iOS 中无法正常工作的原因。所以我在 PCL common folder App class.
上实现了它