Xamarin Firebase iOS未收到FCM消息

问题描述

我尝试在Xamarin Forms应用程序中实现Firebase推送通知和消息。在Android中,它工作正常,而在iOS中,我收到推送通知,但没有收到仅FCM数据消息。

我正在使用Xamarin.Firebase.iOS.CloudMessaging软件包,我也遵循了this guidethis 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网站中删除并重新创建证书和置备配置文件,但是没有任何效果。另外,我认为所有配置都正确,因为我的应用程序正在接收通知

希望我能提供足够的信息,我为此一直挣扎了数周

编辑

我在PHP中使用此功能将纯数据消息发送到设备

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 (将#修改为@)