iOS应用程序在后台时无法接收FCM推送通知

问题描述 投票:0回答:1

[目前,我正在开发xamarin ios应用程序,并且我正在尝试使用Firebase云消息传递来实现推送通知,我已经更新了info.plist,Entitlement.plist并还添加了GoogleService-Info.plist,即

enter image description here

enter image description here

enter image description here

这是我在AppDelegate.cs中所做的

using Foundation;
using UIKit;
using UserNotifications;
using Firebase.Core;
using Firebase.CloudMessaging;
using System;
using TrendSurveyApp.iOS;
using Newtonsoft.Json;
using System.Collections.Generic;
using AudioToolbox;

namespace CloudMessagingSample
{
    // The UIApplicationDelegate for the application. This class is responsible for launching the
    // User Interface of the application, as well as listening (and optionally responding) to application events from iOS.
    [Register("AppDelegate")]
    public class AppDelegate : UIApplicationDelegate, IUNUserNotificationCenterDelegate, IMessagingDelegate
    {



        public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
        {
            // Override point for customization after application launch.
            // If not required for your application you can safely delete this method

            //(Window.RootViewController as UINavigationController).PushViewController(new DialogViewController1(this), true);


            App.Configure();
            Messaging.SharedInstance.Delegate = this;

            UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;

            if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
            {
                UNUserNotificationCenter.Current.Delegate = this;
                UNUserNotificationCenter.Current.RequestAuthorization(UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound,
                (granted, error) =>
                {
                    if (granted)
                    {
                        InvokeOnMainThread(UIApplication.SharedApplication.RegisterForRemoteNotifications);
                    }
                });
            }
            else if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
            {
                var pushSettings = UIUserNotificationSettings.GetSettingsForTypes(
                        UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
                        new NSSet());

                UIApplication.SharedApplication.RegisterUserNotificationSettings(pushSettings);
                UIApplication.SharedApplication.RegisterForRemoteNotifications();
            }
            else
            {

                UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
            }




            // To connect with FCM. FCM manages the connection, closing it
            // when your app goes into the background and reopening it 
            // whenever the app is foregrounded.
            Messaging.SharedInstance.ShouldEstablishDirectChannel = true;

            return true;
        }



        public void DidReceiveRegistrationToken(Messaging messaging, string fcmToken)
        {
            // Monitor token generation: To be notified whenever the token is updated.

            LogInformation(nameof(DidReceiveRegistrationToken), $"Firebase registration token: {fcmToken}");

            // TODO: If necessary send token to application server.
            // Note: This callback is fired at each app startup and whenever a new token is generated.
        }

        // You'll need this method if you set "FirebaseAppDelegateProxyEnabled": NO in GoogleService-Info.plist
        public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
        {
            Messaging.SharedInstance.ApnsToken = deviceToken;

        }


        public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
        {

            Messaging.SharedInstance.AppDidReceiveMessage(userInfo);

            LogInformation(nameof(DidReceiveRemoteNotification), userInfo);
            completionHandler(UIBackgroundFetchResult.NewData);

            var myData = JsonConvert.DeserializeObject<List<string>>(userInfo[new NSString("webContentList")] as NSString);



        }


        [Export("messaging:didReceiveMessage:")]
        public void DidReceiveMessage(Messaging messaging, RemoteMessage remoteMessage)
        {
            // Handle Data messages for iOS 10 and above.
            HandleMessage(remoteMessage.AppData);
            var fcmToken = Messaging.SharedInstance.FcmToken;

            LogInformation(nameof(DidReceiveMessage), remoteMessage.AppData);
        }


        [Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
        public void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
        {
            SystemSound.Vibrate.PlayAlertSound();
            SystemSound.Vibrate.PlaySystemSound();
            completionHandler(UNNotificationPresentationOptions.Alert);
        }
        void HandleMessage(NSDictionary message)
        {

            if (message == null)
                return;

            MessageType messageType;
            if (message.ContainsKey(new NSString("aps")))
                messageType = MessageType.Notification;
            else
                messageType = MessageType.Data;


            var e = new UserInfoEventArgs(message, messageType);
        }

        void LogInformation(string methodName, object information) => Console.WriteLine($"\nMethod name: {methodName}\nInformation: {information}");
    }
}

现在的问题是,当应用程序在后台运行时,我没有收到任何通知,也没有触发任何回调函数(例如didReceivedNotification,而如果我在前台打开了应用程序,则可以收到通知!!需要帮助

ios xamarin.forms xamarin.ios firebase-cloud-messaging
1个回答
0
投票

尝试一下:

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
            {        

                LoadApplication(new App());

                Firebase.Core.App.Configure();

                if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
                {
                    // iOS => 10
                    var authOptions = UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound;
                    UNUserNotificationCenter.Current.RequestAuthorization(authOptions, (granted, error) =>
                    {
                        //request authorization method
                        Console.WriteLine(granted);
                    });

                    // For iOS 10+ display notification (sent via APNS)
                    UNUserNotificationCenter.Current.Delegate = this;
                }
                else
                {
                    // iOS 9 <=
                    var allNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
                    var settings = UIUserNotificationSettings.GetSettingsForTypes(allNotificationTypes, null);
                    UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
                }

            UIApplication.SharedApplication.RegisterForRemoteNotifications();

            return base.FinishedLaunching(application, launchOptions);
    }
© www.soinside.com 2019 - 2024. All rights reserved.