Xamarin C#中的IOS应用程序的FCM背景通知无效

时间:2017-10-09 11:10:46

标签: c# ios xamarin notifications firebase-cloud-messaging

该团队正在c#中开发一个关于Xamarin的IOS应用程序。现在我们想使用fcm的推送通知服务。尝试部署应用程序,但问题是:如果应用程序在后台,则不会在ios上收到通知。做了一些研究,但发现应用程序在后台进行时与fcm断开连接。虽然尝试不通过不调用该功能而断开它但仍未收到通知。只是想知道在应用程序处于后台时是否可以在ios上收到通知。 共享相关链接以及背景代码,以便在应用程序进入后台时将应用程序与fcm断开连接。还删除了函数调用,但它没有工作。

public override void DidEnterBackground (UIApplication application)
{
    // Use this method to release shared resources, save user data, 
    //invalidate timers and store the application state.
    // If your application supports background exection this method is 
    //called instead of WillTerminate when the user quits.
    Messaging.SharedInstance.Disconnect ();
    Console.WriteLine (“Disconnected from FCM”);
}

链接: https://components.xamarin.com/gettingstarted/firebaseioscloudmessaging/true

1 个答案:

答案 0 :(得分:0)

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
        App.Configure ();

        // Register your app for remote notifications.
        if (UIDevice.CurrentDevice.CheckSystemVersion (10, 0)) {
            // For iOS 10 display notification (sent via APNS)
            UNUserNotificationCenter.Current.Delegate = this;

            var authOptions = UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound;
            UNUserNotificationCenter.Current.RequestAuthorization (authOptions, (granted, error) => {
                Console.WriteLine (granted);
            });
        } 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 ();

        Messaging.SharedInstance.Delegate = this;

        // 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;
    }

接下来将它放在AppDelegate.cs

[Export("messaging:didReceiveRegistrationToken:")]
    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)
    {
        // Handle Notification messages in the background and foreground.
        // Handle Data messages for iOS 9 and below.
        // If you are receiving a notification message while your app is in the background,
        // this callback will not be fired till the user taps on the notification launching the application.
        // TODO: Handle data of notification
        // With swizzling disabled you must let Messaging know about the message, for Analytics
        //Messaging.SharedInstance.AppDidReceiveMessage (userInfo);

        if(ConnectionClass.CompanyID != null)
        {
            SyncData.SyncDataDB();
        }
        //FirebasePushNotificationManager.CurrentNotificationPresentationOption = UNNotificationPresentationOptions.Alert;
        FirebasePushNotificationManager.DidReceiveMessage(userInfo);
        //HandleMessage(userInfo);

        // Print full message.
        //LogInformation(nameof(DidReceiveRemoteNotification), userInfo);

        //completionHandler(UIBackgroundFetchResult.NewData);
    }

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

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

    void HandleMessage(NSDictionary message)
    {
        if (MessageReceived == null)
            return;

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

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

    public static void ShowMessage(string title, string message, UIViewController fromViewController, Action actionForOk = null)
    {
        if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
        {
            var alert = UIAlertController.Create(title, message, UIAlertControllerStyle.Alert);
            alert.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, (obj) => actionForOk?.Invoke()));
            fromViewController.PresentViewController(alert, true, null);
        }
        else
        {
            var alert = new UIAlertView(title, message, null, "Ok", null);
            alert.Clicked += (sender, e) => actionForOk?.Invoke();
            alert.Show();
        }
    }

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