简体   繁体   English

FCM Xamarin.Forms,iOS背景通知不显示

[英]FCM Xamarin.Forms, iOS background Notification doesnt show

Platform: iOS 10.2+ 平台: iOS 10.2+

Xamarin Plugin: Firebase iOS cloud messaging https://components.xamarin.com/view/firebaseioscloudmessaging Xamarin插件: Firebase iOS云消息传递https://components.xamarin.com/view/firebaseioscloudmessaging

Problem: When I send a notification from FireBase console or from my code calling FireBase. 问题:从FireBase控制台或调用FireBase的代码发送通知时。 My iPhones don't receive the background notifications(as a bubble). 我的iPhone没有收到后台通知(显示为气泡)。 But, if I had the application in foreground, I received the notification as a "DisplayAlert" from the function ApplicationReceivedRemoteMessage(RemoteMessage remoteMessage). 但是,如果我的应用程序位于前台,那么我会从函数ApplicationReceivedRemoteMessage(RemoteMessage remoteMessage)收到作为“ DisplayAlert”的通知。

So, the device is registered on FCM, the device have the token, the device can receive the notifications, but the device didnt receive the notifications on background. 因此,该设备已在FCM上注册,该设备具有令牌,该设备可以接收通知,但是该设备未在后台接收通知。

** In VisualStudio 2017 at .iOS project manifest I have the Background mode activated and the remote notifications activated too ** **在.iOS项目清单的VisualStudio 2017中,我激活了后台模式,并且也激活了远程通知**

¿It's this a common issue? 这是一个常见的问题吗? ¿Can I solve for working at my project? ¿我可以解决在我的项目中工作吗?

Code of AppDelegate AppDelegate的代码

[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IUNUserNotificationCenterDelegate, IMessagingDelegate
{
    protected SQLiteAsyncConnection conn;
    //
    // 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)
    {
        global::Xamarin.Forms.Forms.Init();
        global::Xamarin.FormsMaps.Init();
        CachedImageRenderer.Init();
        LoadApplication(new App());

        UITabBar.Appearance.SelectedImageTintColor = UIColor.FromRGB(139, 194, 77);
        UINavigationBar.Appearance.TintColor = UIColor.FromRGB(139,194,77);

        CrossVersionTracking.Current.Track();

        // Firebase component initialize
        Firebase.Analytics.App.Configure();

        // Register your app for remote notifications.
        if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
        {
            // iOS 10 or later
            var authOptions = UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound;
            UNUserNotificationCenter.Current.RequestAuthorization(authOptions, (granted, error) => {
                Console.WriteLine(granted);
            });

            // For iOS 10 display notification (sent via APNS)
            UNUserNotificationCenter.Current.Delegate = this;

            // For iOS 10 data message (sent via FCM)
            Messaging.SharedInstance.RemoteMessageDelegate = 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.InstanceID.InstanceId.Notifications.ObserveTokenRefresh((sender, e) =>
                    {

                        newToken = Firebase.InstanceID.InstanceId.SharedInstance.Token;

                        //Conectamos con la base de datos.
                        database = new SQLiteClient();
                        conn = database.GetConnection();

                   usuario = null;
                        try
                        {
                            var task = Task.Run(async () =>
                            {
                                usuario = await conn.Table<Usuario>()
                                   .FirstOrDefaultAsync();
                            });
                            task.Wait();
                            if (usuario != null)
                            {
                                usuario.token = newToken;
                                task = Task.Run(async () =>
                                {
                                    await conn.InsertOrReplaceAsync(usuario);
                                });
                                task.Wait();
                            }
                        }
                        catch (Exception ex)
                        {
                            System.Diagnostics.Debug.WriteLine("TOKEN ERROR\tNo se ha podido Guardar el Token" + ex.Message);
                        }


                        System.Diagnostics.Debug.WriteLine("TOKEN\t" + newToken);

                        connectFCM();
                    });

        #endregion
        return base.FinishedLaunching(app, options);
    }

    public override void DidEnterBackground(UIApplication uiApplication)
    {
        Messaging.SharedInstance.Disconnect();
        Console.WriteLine("Disconnected from FCM");
    }

    public override void OnActivated(UIApplication uiApplication)
    {
        connectFCM();
        base.OnActivated(uiApplication);
    }

    public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
    {
        #if DEBUG
        Firebase.InstanceID.InstanceId.SharedInstance.SetApnsToken(deviceToken, Firebase.InstanceID.ApnsTokenType.Sandbox);
        #endif
        #if RELEASE
        Firebase.InstanceID.InstanceId.SharedInstance.SetApnsToken(deviceToken, Firebase.InstanceID.ApnsTokenType.Prod);
        #endif
    }
    // iOS 9 <=, fire when recieve notification foreground
    public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
    {
        Messaging.SharedInstance.AppDidReceiveMessage(userInfo);

        // Generate custom event

        NSString[] keys = { new NSString("Event_type") };
        NSObject[] values = { new NSString("Recieve_Notification") };
        var parameters = NSDictionary<NSString, NSObject>.FromObjectsAndKeys(keys, values, keys.Length);

        // Send custom event
        Firebase.Analytics.Analytics.LogEvent("CustomEvent", parameters);

        if (application.ApplicationState == UIApplicationState.Active)
        {
            System.Diagnostics.Debug.WriteLine(userInfo);
            var aps_d = userInfo["aps"] as NSDictionary;
            var alert_d = aps_d["alert"] as NSDictionary;
            var body = alert_d["body"] as NSString;
            var title = alert_d["title"] as NSString;
            debugAlert(title, body);
        }

    }

    // iOS 10, fire when recieve notification foreground
    [Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
    public void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
    {
        System.Console.WriteLine(notification.Request.Content.UserInfo);
        var title = notification.Request.Content.Title;
        var body = notification.Request.Content.Body;
        debugAlert(title, body);
    }

    private void connectFCM()
    {
        Console.WriteLine("connectFCM\tEjecutandose la función.");
        Messaging.SharedInstance.Connect((error) =>
        {
            if (error == null)
            {
                //TODO: Change Topic to what is required
                Messaging.SharedInstance.Subscribe("/topics/all");
            }
            //System.Diagnostics.Debug.WriteLine("connectFCM\t" + (error != null ? "error occured" : "connect success"));
            Console.WriteLine("connectFCM\t" + (error != null ? "error occured" + error.DebugDescription : "connect success"));

        });
    }
    private void debugAlert(string title, string message)
    {
        var alert = new UIAlertView(title ?? "Title", message ?? "Message", null, "Cancel", "OK");
        alert.Show();
    }

    public void ApplicationReceivedRemoteMessage(RemoteMessage remoteMessage)
    {
        Console.WriteLine("\n*******************************************");
        Console.WriteLine("AplicationReceivedRemoteMessage\t" + remoteMessage.AppData);
        Console.WriteLine("\n*******************************************");
        var title = remoteMessage.AppData.ValueForKey(new NSString("title"));
        var text = remoteMessage.AppData.ValueForKey(new NSString("text"));
        debugAlert("" + title,  "" + text);
    }

    [Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
    public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
    {
        debugAlert("DidreceiveNotificationResponse", response + ""  );
    }

For more info, my info.plist contais the key: 有关更多信息,我的info.plist包含密钥:

    <key>UIBackgroundModes</key>
<array>
    <string>location</string>
    <string>bluetooth-central</string>
    <string>bluetooth-peripheral</string>
    <string>fetch</string>
    <string>remote-notification</string>
</array>

After a long investigation I solve it. 经过长时间的调查,我解决了。

It is necesary to add that key to Entile.plist file. 有必要将该密钥添加到Entile.plist文件中。

<dict>
    <key>aps-environment</key>
  <string>development</string>
</dict>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM