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. 【转载】MYSQL模式匹配:REGEXP和like用法

    转载地址:http://www.webjx.com/database/mysql-32809.html like like要求整个数据都要匹配,而REGEXP只需要部分匹配即可. 也就是说,用Like ...

  2. strncmp用法说明

    函数原型 int strcmp(char *str1,char * str2,int n) 功能 比较字符串str1和str2的前n个字符. 头文件 #include <string.h> ...

  3. codeforces 914E Palindromes in a Tree(点分治)

    You are given a tree (a connected acyclic undirected graph) of n vertices. Vertices are numbered fro ...

  4. select2的一些隐藏功能

    select 3.5版本的说明文档里面存在 http://select2.github.io/select2/index.html option选项 sortResults query为查询字符串

  5. Nexys4 DDR MIG控制器引脚文件

    目前网上只有ucf文件,vivado不兼容ucf格式 使用c++字符串转换的xdc格式代码 set_property -dict { PACKAGE_PIN R7 IOSTANDARD SSTL18_ ...

  6. mysql 循环插入

    在mysql添加测试数据,想和mssql一样用循环实现,发现不管怎么样都执行失败 经查询发现mysql不支持匿名块,只能先创建出一个存储过程,执行,然后删除 CREATE PROCEDURE test ...

  7. 40. 组合总和 II leetcode JAVA

    题目: 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使 ...

  8. chipmunk几何算法

    /* Copyright (c) 2007 Scott Lembcke * * Permission is hereby granted, free of charge, to any person ...

  9. chipmunk 物理引擎的基本概念和基本用法

    chipmunk是一个开源2D物理引擎, 项目主页:http://code.google.com/p/chipmunk-physics/ 工作需要研究了一下,这个引擎的资料还是不多,我阅读了所有的文档 ...

  10. Mac 上安装python3

    1.安装包管理器 去包管理器官网按照提示安装包管理器 Homebrew 2.安装python3 安装完Homebrew ,输入指令安装python3 brew install python3 3.安装 ...