Pushsharp 4.0 with Firebase

7 浏览
0 Comments

Pushsharp 4.0 with Firebase

阅读了很多帖子后,我发现没有找到一个完整的示例来说明如何使用PushSharp 4.0和Firebase发送GCM推送通知。很多示例都使用旧的Google云消息服务,而不是Firebase和/或旧版本的PushSharp。有没有人有一个稳定且可行的代码示例,可以使用PushSharp 4.0和Firebase发送GCM推送通知?

0
0 Comments

这个问题的出现的原因是在使用PushSharp 4.0和Firebase时遇到了一些困难。根据上述帖子中的评论,人们在做了建议的更改后成功地使用PushSharp和Firebase。

解决方法是在GitHub上查找相关评论,尤其是GcmConfiguration设置和QueueNotification的代码实现。问题提出者在网络上找到了不同的实现方式,但不确定哪个是正确的。

以下是一种可能的解决方法,可以尝试使用以下代码片段:

using PushSharp;
using PushSharp.Android;
using PushSharp.Core;
using PushSharp.Google;
// ...
var config = new GcmConfiguration("YOUR_API_KEY");
config.GcmUrl = "https://fcm.googleapis.com/fcm/send";
var broker = new PushBroker();
broker.RegisterGcmService(config);
// ...
var notification = new GcmNotification()
    .ForDeviceRegistrationId("DEVICE_REGISTRATION_ID")
    .WithJson("{\"alert\":\"Hello World!\",\"badge\":7,\"sound\":\"sound.caf\"}");
broker.QueueNotification(notification);
// ...

以上代码片段展示了如何使用PushSharp和Firebase进行推送通知。在代码中,需要替换"YOUR_API_KEY"和"DEVICE_REGISTRATION_ID"为实际的API密钥和设备注册ID。

希望这个解决方法能够帮助到你解决PushSharp 4.0和Firebase的问题。

0
0 Comments

这个问题的出现原因是使用的Pushsharp库版本为4.0,而该版本不再支持Firebase(FCM)推送服务。解决方法是升级到最新版本的Pushsharp,新版本已经添加了对Firebase的支持。

以下是解决方法的代码示例:

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 FcmConfiguration(serverKey);
            this.Config.FcmUrl = "https://fcm.googleapis.com/fcm/send";
            this.Broker = this.InitializeBroker();
        }
        #endregion
        #region Properties
        private FcmServiceBroker Broker { get; }
        private FcmConfiguration Config { get; }
        #endregion
        #region Private Methods
        private FcmServiceBroker InitializeBroker()
        {
            var fcmServiceBroker = new FcmServiceBroker(this.Config);
            fcmServiceBroker.OnNotificationSucceeded += this.OnNotificationSucceeded;
            fcmServiceBroker.OnNotificationFailed += this.OnNotificationFailed;
            fcmServiceBroker.Start();
            return fcmServiceBroker;
        }
        #endregion
        #region Event Handlers
        private void OnNotificationFailed(FcmNotification fcmNotification, AggregateException aggregateEx)
        {
            aggregateEx.Handle(ex =>
            {
                // See what kind of exception it was to further diagnose
                if (ex is FcmNotificationException notificationException)
                {
                    Console.WriteLine($"Notification of {string.Join(", ", notificationException.Notification.RegistrationIds)} failed: {notificationException.Message}");
                }
                else if (ex is FcmMulticastResultException 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(FcmNotification fcmNotification)
        {
            Console.WriteLine($"Notification sent to {string.Join(", ", fcmNotification.RegistrationIds)}. Data: {fcmNotification.Data}, Notification: {fcmNotification.Notification}");
        }
        #endregion
        #region IDisposable Members
        /// 
        public void Dispose()
        {
            this.Broker?.Stop();
        }
        #endregion
        #region IPushNotificationService Members
        /// 
        public void SendPushNotification(string token)
        {
            var notification = JObject.Parse("{\"title\": \"Test\",\"body\": \"Success!\"}");
            this.Broker.QueueNotification(new FcmNotification
            {
                RegistrationIds = new List { token },
                Notification = notification
            });
        }
        #endregion
    }
}

现在,通过升级到最新版本的Pushsharp,应该可以成功使用Firebase(FCM)推送服务了。

0
0 Comments

Pushsharp 4.0与Firebase的问题出现的原因是Google Play控制台中的“Linked Sender ID”选项不再可用,因此无法直接在控制台中找到SenderID。解决方法是将SenderID手动添加到应用的google-services.json文件中。

步骤如下:

1. 在console.firebase.google.com上创建一个新项目。

2. 进入设置->云消息传递。将该SenderID作为PushSharp的Sender ID,并将Legacy Server Key作为PushSharp的Authentication Key。

3. 进入Google Play控制台,选择项目,然后进入开发工具->服务和API。

4. 在"Linked Sender ID"字段中输入SenderID,将App项目与新的FCM项目链接起来。

至此,服务器的配置就完成了。

然后,需要将App与新的SenderID连接起来。通常情况下,可以通过将google-services.json文件添加到Firebase设置中来完成。但是,由于使用了PhoneGap/Cordova插件来发送通知,所以需要进行如下操作:

1. 将GCM_SENDER_ID更改为上述的SenderID。

不幸的是,为了使其正常工作,必须重新分发应用的新版本。但它确实可以正常工作。

希望这对其他人有所帮助。

0