Xamarin Firebase iOS未收到FCM消息

时间:2020-11-04 16:13:49

标签: ios firebase xamarin firebase-cloud-messaging apple-push-notifications

我尝试在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上没问题。

0 个答案:

没有答案