Pushsharp 4.0 с Firebase

Прочитав много сообщений, я не смог найти полный пример того, как отправлять push-уведомления GCM с помощью Pushsharp 4.0 с Firebase. Во многих примерах с PushSharp используется старый облачный обмен сообщениями Google, а не Firebase и/или старая версия PushSharp.

Есть ли у кого-нибудь пример стабильного и рабочего кода для отправки push-уведомлений GCM с использованием PushSharp 4.0 с Firebase?


person Stefano    schedule 06.11.2016    source источник
comment
Вы нашли свой ответ? мне бы тоже было интересно. Спасибо   -  person Daniel    schedule 07.03.2017


Ответы (3)



Мне удалось заставить PushSharp работать с FCM относительно легко. Я думал, что это будет намного сложнее. Вот шаги, которые я предпринял:

  1. Я создал новый проект на console.firebase.google.com.
  2. Затем я зашел в настройки => Облачные сообщения. Я использовал этот идентификатор отправителя в качестве своего идентификатора отправителя PushSharp и устаревший ключ сервера в качестве ключа аутентификации PushSharp.
  3. Далее я зашел в консоль google play, выбрал проект, затем Инструменты разработки => Сервисы и API.
  4. Затем я связал проект приложения с новым проектом FCM, введя идентификатор отправителя в поле «Идентификатор связанного отправителя».

Это все, что вам нужно сделать, чтобы сервер заработал.

Теперь мне нужно было подключить приложение к этому новому SenderID. Я думаю, что обычно это делается путем ввода файла google-services.json, как показано в настройках Firebase. Однако я использую плагин PhoneGap/Cordova для отправки уведомлений. Итак, я делаю это:

  1. Измените GCM_SENDER_ID на SenderID выше.

К сожалению, мне пришлось распространять новую версию приложения, чтобы заставить его работать. Но это сработало.

Надеюсь, это поможет кому-то еще.

person Dicer    schedule 19.04.2018
comment
на шаге 3 вы имели в виду Google Cloud Console? Если это так, то после активации FCM на консоли я вижу только ту обычную панель мониторинга, которую мы видим для всех сервисов Google Cloud Api, с вкладкой учетных данных, квот и показателей. Я не могу найти связанный идентификатор отправителя. Не могли бы вы помочь мне найти его? Спасибо. - person Rodrigo Lira; 14.05.2019
comment
Ну, глядя на это, я больше не вижу SenderID в консоли Google Play. Исходя из этого: stackoverflow.com/questions/39392627/, похоже, вы просто берете идентификатор отправителя и помещаете его в файл google-services.json приложения. Я мог бы поклясться, что раньше он был там. - person Dicer; 15.05.2019
comment
Ах я вижу. Спасибо за проверку его. Я попробую это. - person Rodrigo Lira; 15.05.2019

Эта консольная программа отлично работала для меня.

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string token = "putYourSecretTokenHere";
            using (var s = new FcmPushNotificationService())
            {
                s.SendPushNotification(token);
                Console.ReadLine();
            }

        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            Console.ReadLine();
        }
    }
    public sealed class FcmPushNotificationService : IDisposable
    {
        #region Constructors

        public FcmPushNotificationService()
        {
            string serverKey = "Legacy server key";
            this.Config = new GcmConfiguration(serverKey);
            this.Config.GcmUrl = "https://fcm.googleapis.com/fcm/send";

            this.Broker = this.InitializeBroker();
        }

        #endregion


        #region Properties

        private GcmServiceBroker Broker { get; }

        private GcmConfiguration Config { get; }

        #endregion


        #region Private Methods

        private GcmServiceBroker InitializeBroker()
        {
            var gcmServiceBroker = new GcmServiceBroker(this.Config);
            gcmServiceBroker.OnNotificationSucceeded += this.OnNotificationSucceeded;
            gcmServiceBroker.OnNotificationFailed += this.OnNotificationFailed;

            gcmServiceBroker.Start();

            return gcmServiceBroker;
        }

        #endregion


        #region Event Handlers

        private void OnNotificationFailed(GcmNotification gcmNotification, AggregateException aggregateEx)
        {
            aggregateEx.Handle(ex =>
            {
                // See what kind of exception it was to further diagnose
                if (ex is GcmNotificationException notificationException)
                {
                    Console.WriteLine($"Notification of {string.Join(", ", notificationException.Notification.RegistrationIds)} failed: {notificationException.Message}");
                }
                else if (ex is GcmMulticastResultException multicastException)
                {
                    Console.WriteLine($"Notification of {string.Join(", ", multicastException.Succeeded.SelectMany(n => n.RegistrationIds))} succeeded.");
                    Console.WriteLine($"Notification of {string.Join(", ", multicastException.Failed.SelectMany(n => n.Key.RegistrationIds))} failed: {multicastException.Message}");
                }
                else if (ex is DeviceSubscriptionExpiredException expiredException)
                {
                    Console.WriteLine($"Device registration id expired: {expiredException.OldSubscriptionId}. Device registration id changed to {expiredException.NewSubscriptionId}");
                }
                else if (ex is RetryAfterException retryException)
                {
                    Console.WriteLine($"FCM rate limited, don't send more until after {retryException.RetryAfterUtc}");
                }
                else
                {
                    Console.WriteLine($"Failed to send notification {ex}");
                }

                // Mark it as handled
                return true;
            });
        }

        private void OnNotificationSucceeded(GcmNotification gcmNotification)
        {
            Console.WriteLine($"Notification sent to {string.Join(", ", gcmNotification.RegistrationIds)}. Data: {gcmNotification.Data}, Notification: {gcmNotification.Notification}");
        }

        #endregion


        #region IDisposable Members

        /// <inheritdoc cref="IDisposable"/>
        public void Dispose()
        {
            this.Broker?.Stop();
        }

        #endregion


        #region IPushNotificationService Members

        ///<inheritdoc/>
        public void SendPushNotification(string token)
        {
            var notification = JObject.Parse("{\"title\": \"Test\",\"body\": \"Success!\"}");

            this.Broker.QueueNotification(new GcmNotification
            {
                RegistrationIds = new List<string> { token },
                Notification = notification
            });
        }

        #endregion
    }
}
person u boot    schedule 08.11.2018