如何解决Xamarin Firebase iOS未收到FCM消息
我尝试在Xamarin Forms应用程序中实现Firebase推送通知和消息。在Android中,它工作正常,而在iOS中,我收到推送通知,但没有收到仅FCM数据消息。
我正在使用Xamarin.Firebase.iOS.CloudMessaging软件包,我也遵循了this guide和this other one。
这是我的AppDelegate.cs代码:
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate,IUNUserNotificationCenterDelegate,IMessagingDelegate
{
//
// This method is invoked when the application has loaded and is ready to run. In this
// method you should instantiate the window,load the UI into it and then make the window
// visible.
//
// You have 17 seconds to return from this method,or iOS will terminate your application.
//
public override bool FinishedLaunching(UIApplication app,NSDictionary options)
{
Forms.SetFlags("Brush_Experimental");
Rg.Plugins.Popup.Popup.Init();
//Ascetic.Plugins.Popupdecorations.iOS.PrettyPopup.Init();
global::Xamarin.Forms.Forms.Init();
SfListVieWrenderer.Init();
new Syncfusion.SfAutoComplete.XForms.iOS.SfAutoCompleteRenderer();
Syncfusion.XForms.iOS.TabView.SfTabVieWrenderer.Init();
iOSMaterialFrameRenderer.Init();
LoadApplication(new App());
// Register your app for remote notifications.
configureFirebase();
var result = base.FinishedLaunching(app,options);
app.KeyWindow.TintColor = UIColor.White;
foreach (var fs in UIFont.FamilyNames.OrderBy(c => c).ToList())
{
Console.WriteLine(" * " + fs);
foreach (var f in UIFont.FontNamesForFamilyName(fs).OrderBy(c => c).ToList())
{
Console.WriteLine(" *-- " + f);
}
}
return result;
}
private void configureFirebase()
{
Firebase.Core.App.Configure();
if (UIDevice.CurrentDevice.CheckSystemVersion(10,0))
{
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.Current.Delegate = this;
// iOS 10 or later
var authOptions = UNAuthorizationoptions.Alert | UNAuthorizationoptions.Badge | UNAuthorizationoptions.sound;
UNUserNotificationCenter.Current.RequestAuthorization(authOptions,(granted,error) =>
{
});
// For iOS 10 data message (sent via FCM)
Messaging.SharedInstance.Delegate = this;
}
else
{
// iOS 9 or before
var allNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.sound;
var settings = UIUserNotificationSettings.GetSettingsForTypes(allNotificationTypes,null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
}
UIApplication.SharedApplication.RegisterForRemoteNotifications();
}
//Firebase
[Export("messaging:didReceiveRegistrationToken:")]
public void DidReceiveRegistrationToken(Messaging messaging,string fcmToken)
{
Preferences.Set("tokenNotifica",fcmToken);
Console.WriteLine("\nValue: " + (fcmToken));
}
//APP IN BACKGROUND
public override void DidReceiveRemoteNotification(UIApplication application,NSDictionary userInfo,Action<UIBackgroundFetchResult> completionHandler)
{
handleNotification(userInfo);
completionHandler(UIBackgroundFetchResult.NewData);
}
[Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
public void WillPresentNotification(UNUserNotificationCenter center,UNNotification notification,Action<UNNotificationPresentationoptions> completionHandler)
{
handleNotification(notification.Request.Content.UserInfo);
completionHandler(UNNotificationPresentationoptions.sound | UNNotificationPresentationoptions.Alert);
}
[Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
public void DidReceiveNotificationResponse(UNUserNotificationCenter center,UNNotificationResponse response,Action
completionHandler)
{
completionHandler();
NSDictionary userInfo = response.Notification.Request.Content.UserInfo;
try
{
var Data = userInfo[new Nsstring("gcm.notification.data")] as Nsstring;
if (Data != null && Data != "")
{
string[] tokens = Data.ToString().Split(',');
string Username = tokens[0];
string Password = tokens[1];
var Title = string.IsNullOrEmpty(response.Notification.Request.Content.Title) ? "No Notification available" : response.Notification.Request.Content.Title;
var Body = string.IsNullOrEmpty(response.Notification.Request.Content.Body) ? "No Message available" : response.Notification.Request.Content.Body;
}
}
catch (Exception)
{
}
}
[Export("messaging:didReceiveMessage:")]
public void DidReceiveMessage(Messaging messaging,RemoteMessage message)
{
handleNotification(message.AppData);
}
public override void RegisteredForRemoteNotifications(UIApplication application,NSData devicetoken)
{
Messaging.SharedInstance.ApnsToken = devicetoken;
}
public void ApplicationReceivedRemoteMessage(RemoteMessage remoteMessage)
{
;
}
}
DidReceiveRegistrationToken 方法与令牌一起调用。如果我向该令牌发送通知,则将调用DidReceiveRemoteNotification方法,并且设备会成功显示该通知。但是,如果我向该令牌发送仅数据消息,则不会调用任何内容。
我尝试禁用杂乱无章的功能,将其启用,从头开始重新配置Firebase,并在Apple Dev网站中删除并重新创建证书和置备配置文件,但是没有任何效果。另外,我认为所有配置都正确,因为我的应用程序正在接收通知。
希望我能提供足够的信息,我为此一直挣扎了数周
编辑
function sendMessage($deviceKey,$data){
$curl = curl_init();
curl_setopt($curl,CURLOPT_HTTPHEADER,array(
"Content-Type: application/json","project_id: ***","Authorization: key=***"
));
// Set some options - we are passing in a useragent too here
curl_setopt_array($curl,[
CURLOPT_URL => 'https://fcm.googleapis.com/fcm/send',CURLOPT_RETURNTRANSFER => 1,CURLOPT_USERAGENT => 'Codular Sample cURL Request',CURLOPT_POST => 1,]);
$body = [
'to' => $deviceKey,"data" => $data
];
curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($body));
$res = json_decode(curl_exec($curl),true);
curl_close($curl);
return $res;
}
此函数等于发送通知的函数,但是$ body数组不包含“ notification”键。 我想做的是在应用程序中使用消息的数据有效负载而不显示通知,这在Android上很好,但在iOS上没问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。