1.建谷歌账号

2.在console上新建应用 https://console.firebase.google.com 并下载私钥.json

3.创建测试网页应用 (或app应用)

C#服务端:

用HTTP v1 API 的方式获取OAuth2的验证,然后再发http请求到FCM发送消息通知。

1.获取Token

 public async Task<string> GetTokenAsync(string filePath)
{
var token = _redisDBManager.GetValue(filePath);
if (token != null)
return token; try
{
GoogleCredential credential = null;
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(@"https://www.googleapis.com/auth/firebase.messaging");
}
var result = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync().ConfigureAwait(false); _redisDBManager.SetValue(filePath, result, TimeSpan.FromMinutes()); return result;
}
catch (Exception e)
{
Logger.LogError($"FCMManager getTokenAsync error, filePath = {filePath}", e);
return null;
}
}

2.从json解析ProjectId

 private static string GetProjectId(string serviceAccountKeyFile)
{
var serviceAccountKeyJson = File.ReadAllText(serviceAccountKeyFile);
var serviceAccountKeyDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(serviceAccountKeyJson); if (!serviceAccountKeyDictionary.ContainsKey("project_id"))
{
throw new Exception($"Could not read Project ID from ServiceAccountKey File '{serviceAccountKeyFile}'");
} return serviceAccountKeyDictionary["project_id"];
}

3.发送消息

 public async Task<AcceptorNoticeInfo> SendAsync(FcmMessage message, string filePath)
{
try
{
var token = await GetTokenAsync(filePath).ConfigureAwait(false);
if (token == null)
{
_redisDBManager.Remove(filePath);
token = await GetTokenAsync(filePath).ConfigureAwait(false);
} var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders
.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer {token}"); StringContent content = new StringContent(JsonConvert.SerializeObject(message, new JsonSerializerSettings()
{
NullValueHandling = NullValueHandling.Ignore
}));
var projectId = GetProjectId(filePath);
var url = $"https://fcm.googleapis.com/v1/projects/{projectId}/messages:send"; var responseMessage = await httpClient.PostAsync(url, content)
.ConfigureAwait(false); if (responseMessage.StatusCode == HttpStatusCode.OK)
{ return new AcceptorNoticeInfo()
{
ErrorCode = (int)NoticeError.Success,
ErrorMessage = NoticeError.Success.ToString()
};
}
else
{
var responseContent = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
var error = JsonConvert.DeserializeObject<FcmMessageErrorResponse>(responseContent);
return new AcceptorNoticeInfo()
{
ErrorCode = (int)responseMessage.StatusCode,
ErrorMessage = error.Error["message"].ToString()
};
}
}
catch (Exception ex)
{
Logger.LogError($"FCM SendAsync error. token = {message.Message.Token}, topic = {message.Message.Token}{message.Message.Condition}", ex);
return new AcceptorNoticeInfo()
{
ErrorCode = (int)NoticeError.Failed,
ErrorMessage = NoticeError.Failed.ToString()
};
} }

使用FCM服务的更多相关文章

  1. 海外 App 的推送服务,试试 FCM 吧!!!

    > **版权声明:** > > **本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有.** > > **每周会统一更新到这里,如果喜欢,可关注公 ...

  2. Google FireBase - fcm 推送 (Cloud Messaging)

    要将 Firebase 添加到您的应用,您需要有一个 Firebase 项目以及适用于您的应用的 Firebase 配置文件. 如果您还没有 Firebase 项目,请在 Firebase 控制台中创 ...

  3. 消息服务dubbo接口性能压测性能优化案例

    最近项目中的消息服务做了运营商的改动,导致这个服务做了重新开发 压测脚本如下: 开启200线程压测: tps只有200-300之间,平均耗时在700ms左右 开启500线程压测 500并发压测,发现平 ...

  4. 轻松把你的项目升级到PWA

    什么是PWA PWA(Progressive Web Apps,渐进式网页应用)是Google在2015年推出的项目,致力于通过web app获得类似native app体验的网站. 优点 1.无需客 ...

  5. linux服务之vnc和x2go

    三种方式连接linux桌面 1.传统的vnc linux桌面上安装vncserver windows桌面上安装vncviewer 2.x2go 在linux桌面上安装x2goserver与x2gose ...

  6. 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)

    1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...

  7. ionic项目使用Google FCM插件和Google maps插件打包android报错冲突问题

    这段时间在调FCM推送服务的插件 ,原本以为去年调通过,应该很容易,没想到还是出问题了.现将问题及解决方法整理如下,仅供参考: 先看打包报错截图:         详细报错信息:Please fix ...

  8. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  9. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

随机推荐

  1. 解决Emoji存储MySQL报错问题

    在解决之前,得先说明一下为什么会出现报错,Emoji表情占用4个字节,但是MySQL数据库UTF-8编码最多只能存储3个字节,就会导致存储不进去 如何解决Emoji存储问题 mysql 的 utf8编 ...

  2. Spring框架总结(九)

    三.AOP编程 关注点代码:除了业务代码以外的代码.比如开启事务,关闭事务,异常处理核心业务代码:保存用户这一句才是重点.例子如下:// 保存一个用户public void add(User user ...

  3. MySQL查询表内重复记录并删除

    在日常业务场景中,经常会出现一个问题就是解决数据重复的问题,这里用到了一张用户表(s_user)做重复数据操作,分别包含了两个字段,id.name分别用于做唯一标示以及相同姓名的检索. 表结构以及测试 ...

  4. WPF学习资源整理

    WPF(WindowsPresentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模型 ...

  5. 学习python2

    字符串遍历 列表遍历 元组遍历 字典遍历 <1> 遍历字典的key(键) <2> 遍历字典的value(值) <3> 遍历字典的项(元素) <4> 遍历 ...

  6. Windows装python

    pycharm常用快捷键ctr+alt+shift+l可以快速格式化python安装下载地址https://www.python.org/downloads/release/python-365/ 一 ...

  7. CodeForces - 631C ——(思维题)

    Each month Blake gets the report containing main economic indicators of the company "Blake Tech ...

  8. Java50道经典习题-程序3 打印水仙花数

    题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...

  9. maven-plugins说明

    maven提供了丰富的plugins. maven是一个插件执行的框架. 核心部分的描述: clean. clean插件. goal:clean 清除构建时生成的文件,文件目录 project.bui ...

  10. 原创:各种normalize函数实现的性能和精度大比拼

    ///////////////////////////////////////////////////////////////////////// // // Performance benchmar ...