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. mongodb密码忘了怎么办

    自己电脑上mongodb好长时间没上了,密码竟然给忘了,悲剧啊! 修改auth为false,然后重新启动mongodb 这时候可以不用登陆直接进入 db.changeUserPassword('use ...

  2. Cannot change version of project facet Dynamic Web Module to 2.4.

    解决办法,找到项目目录,将.settings  target  .classpath  .project 删除 重新引入项目 原因是 web.xml 文件里<web-app 里的与.settin ...

  3. 安装并使用PICT,生成测试用例

    一.PICT简介 PICT工具是在微软公司内部使用的一款承兑组合的命令行生成工具,现在已经对外提供,可以在 http://download.microsoft.com/download/f/5/5/f ...

  4. Windows pip

    pip 最常用命令(go语言用go get) 显示版本和路径 pip --version 获取帮助 pip --help 升级 pip pip install -U pip 如果这个升级命令出现问题 ...

  5. MySQL如何查看连接数和状态

    查看连接数 命令:show processlist 如果要是root账号,能够看见当前所有用户的连接.如果是普通账号,只能看到自己占用的连接数.   show processlist只能是列出前100 ...

  6. jmeter -分布式性能测试部署

    ------------------运行环境:------------------------------------------------- 1. 安装java运行环境:要求jdk1.8(最好安装 ...

  7. [LeetCode 题解]: Interger to Roman

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given an i ...

  8. Tomcat负载均衡原理详解及配置(Apache2.2.19+Tomcat7.0.12)

    结构图 JAVA项目一般直接用Tomcat作为Web服务器.为了增加tomcat的性能和稳定性,我们一般采用balance和session同步机制. 下图列出了我们常用也是最简单的解决方案. 说明 1 ...

  9. simrank

    simrank 背景 度量相似度是许多应用的关键问题.传统方法与问题的领域相关,如文本匹配.计算交集.simrank则利用关联关系度量相似性,即"两个节点的相似性和各自邻域节点的相似度有关& ...

  10. [Erlang08] 使用Erlang application有什么好处?

    问题: 当我们把一个项目中所有的supervision tree通过一个简单的函数game: start(),会发现这个树结构特别复杂,只能有一个根节点,然后一直扩展. 那么有时,我们会需要:有些功能 ...