FcmSharp is a .NET library for the Firebase Cloud Messaging (FCM) API.
It implements the entire Firebase Cloud Messaging HTTP Protocol and supports:
- Downstream HTTP Messages
- Notification Payloads
- Topic Messages
- Device Group Messages
FcmSharp supports .NET Core as of Version 1.0.0.
You can use NuGet to install FcmSharp. Run the following command in the Package Manager Console.
PM> Install-Package FcmSharp
The Quickstart shows you how to work with FcmSharp in C#.
// Copyright (c) Philipp Wagner. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Threading;
using FcmSharp.Model.Options;
using FcmSharp.Model.Topics;
using FcmSharp.Requests.Topics;
using FcmSharp.Settings;
namespace FcmSharp.Console
{
internal class Program
{
public static void Main(string[] args)
{
// Read the API Key from a File, which is not under Version Control:
var settings = new FileBasedFcmClientSettings("/Users/bytefish/api.key");
// Construct the Client:
using (var client = new FcmClient(settings))
{
// Construct the Data Payload to send:
var data = new
{
A = new
{
a = 1,
b = 2
},
B = 2,
};
// Options for the Message:
var options = FcmMessageOptions.Builder()
.setTimeToLive(TimeSpan.FromDays(1))
.Build();
// The Message should be sent to the News Topic:
var message = new TopicUnicastMessage<dynamic>(options, new Topic("news"), data);
// Finally send the Message and wait for the Result:
CancellationTokenSource cts = new CancellationTokenSource();
// Send the Message and wait synchronously:
var result = client.SendAsync(message, cts.Token).GetAwaiter().GetResult();
// Print the Result to the Console:
System.Console.WriteLine("Result = {0}", result);
}
}
}
}
FcmSharp uses the HttpClient
for making requests to the Firebase Cloud Messaging server. So in order to configure
a proxy for the HTTP requests, you can configure the HttpClient
used in FcmSharp. This is done by instantiating
the FcmHttpClient
with a configured HttpClient
.
The following test shows how to build the FcmClient
with a custom FcmHttpClient
.
/// <summary>
/// The WebProxy.
/// </summary>
public class WebProxy : IWebProxy
{
public Uri ProxyUri { get; set; }
public ICredentials Credentials { get; set; }
public Uri GetProxy(Uri destination)
{
return ProxyUri;
}
public bool IsBypassed(Uri host)
{
return false;
}
}
[Test, Explicit]
public void TestHttpClientWithProxy()
{
// Settings to be used:
IFcmClientSettings settings = new FileBasedFcmClientSettings("/Users/bytefish/api.key");
// The Proxy Address:
Uri proxyUri = new Uri(string.Format("{0}:{1}", "<proxy_address>", "<proxy_port>"));
// Credentials for the Proxy:
ICredentials proxyCredentials = new NetworkCredential(
"<proxy_username>",
"<proxy_password>"
);
// Define the Proxy:
IWebProxy proxy = new WebProxy
{
ProxyUri = proxyUri,
Credentials = proxyCredentials
};
// Now create a client handler with the Proxy settings:
HttpClientHandler httpClientHandler = new HttpClientHandler()
{
Proxy = proxy,
PreAuthenticate = true,
UseDefaultCredentials = false,
};
// Build the Custom FcmHttpClient:
FcmHttpClient fcmHttpClient = new FcmHttpClient(settings, new HttpClient(httpClientHandler), JsonSerializer.Default);
// Build the HttpClient:
using (var client = new FcmClient(settings, fcmHttpClient))
{
CancellationTokenSource cts = new CancellationTokenSource();
// Build the message:
var message = new TopicUnicastMessage<int>(new FcmMessageOptionsBuilder().Build(), new Topic("a"), 1);
// And send the message:
var result = client.SendAsync(message, cts.Token).GetAwaiter().GetResult();
}
}
The FcmClient
only provides an asynchronous API, and a Synchronous API won't be added. I know that
asynchronous programming can be very challenging for beginners, so here is how you can turn an async
call into a synchronous one:
var result = client.SendAsync(message, cts.Token).GetAwaiter().GetResult();