【问题标题】:FCM Xamarin.Forms, iOS background Notification doesnt showFCM Xamarin.Forms,iOS 背景通知不显示
【发布时间】:2018-01-30 18:01:50
【问题描述】:

平台: iOS 10.2+

Xamarin 插件: Firebase iOS 云消息https://components.xamarin.com/view/firebaseioscloudmessaging

问题:当我从 FireBase 控制台或调用 FireBase 的代码发送通知时。我的 iPhone 没有收到背景通知(作为气泡)。但是,如果我在前台有应用程序,我会从 ApplicationReceivedRemoteMessage(RemoteMessage remoteMessage) 函数收到“DisplayAlert”通知。

所以,设备在 FCM 上注册,设备有令牌,设备可以接收通知,但设备在后台没有收到通知。

** 在 .iOS 项目清单中的 VisualStudio 2017 中,我激活了后台模式并激活了远程通知 **

¿这是一个常见问题吗? ¿ 我可以解决在我的项目中工作的问题吗?

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 + ""  );
    }

有关更多信息,我的 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>

【问题讨论】:

    标签: ios firebase xamarin xamarin.ios firebase-cloud-messaging


    【解决方案1】:

    经过长时间的调查,我解决了它。

    需要将该密钥添加到 Entile.plist 文件中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2021-08-25
      • 1970-01-01
      • 2014-02-07
      • 2016-10-27
      • 2020-11-19
      • 1970-01-01
      相关资源
      最近更新 更多