使用FCM服务
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服务的更多相关文章
- 海外 App 的推送服务,试试 FCM 吧!!!
> **版权声明:** > > **本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有.** > > **每周会统一更新到这里,如果喜欢,可关注公 ...
- Google FireBase - fcm 推送 (Cloud Messaging)
要将 Firebase 添加到您的应用,您需要有一个 Firebase 项目以及适用于您的应用的 Firebase 配置文件. 如果您还没有 Firebase 项目,请在 Firebase 控制台中创 ...
- 消息服务dubbo接口性能压测性能优化案例
最近项目中的消息服务做了运营商的改动,导致这个服务做了重新开发 压测脚本如下: 开启200线程压测: tps只有200-300之间,平均耗时在700ms左右 开启500线程压测 500并发压测,发现平 ...
- 轻松把你的项目升级到PWA
什么是PWA PWA(Progressive Web Apps,渐进式网页应用)是Google在2015年推出的项目,致力于通过web app获得类似native app体验的网站. 优点 1.无需客 ...
- linux服务之vnc和x2go
三种方式连接linux桌面 1.传统的vnc linux桌面上安装vncserver windows桌面上安装vncviewer 2.x2go 在linux桌面上安装x2goserver与x2gose ...
- 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)
1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...
- ionic项目使用Google FCM插件和Google maps插件打包android报错冲突问题
这段时间在调FCM推送服务的插件 ,原本以为去年调通过,应该很容易,没想到还是出问题了.现将问题及解决方法整理如下,仅供参考: 先看打包报错截图: 详细报错信息:Please fix ...
- solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件
昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
随机推荐
- 解决Emoji存储MySQL报错问题
在解决之前,得先说明一下为什么会出现报错,Emoji表情占用4个字节,但是MySQL数据库UTF-8编码最多只能存储3个字节,就会导致存储不进去 如何解决Emoji存储问题 mysql 的 utf8编 ...
- Spring框架总结(九)
三.AOP编程 关注点代码:除了业务代码以外的代码.比如开启事务,关闭事务,异常处理核心业务代码:保存用户这一句才是重点.例子如下:// 保存一个用户public void add(User user ...
- MySQL查询表内重复记录并删除
在日常业务场景中,经常会出现一个问题就是解决数据重复的问题,这里用到了一张用户表(s_user)做重复数据操作,分别包含了两个字段,id.name分别用于做唯一标示以及相同姓名的检索. 表结构以及测试 ...
- WPF学习资源整理
WPF(WindowsPresentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供了统一的编程模型 ...
- 学习python2
字符串遍历 列表遍历 元组遍历 字典遍历 <1> 遍历字典的key(键) <2> 遍历字典的value(值) <3> 遍历字典的项(元素) <4> 遍历 ...
- Windows装python
pycharm常用快捷键ctr+alt+shift+l可以快速格式化python安装下载地址https://www.python.org/downloads/release/python-365/ 一 ...
- CodeForces - 631C ——(思维题)
Each month Blake gets the report containing main economic indicators of the company "Blake Tech ...
- Java50道经典习题-程序3 打印水仙花数
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...
- maven-plugins说明
maven提供了丰富的plugins. maven是一个插件执行的框架. 核心部分的描述: clean. clean插件. goal:clean 清除构建时生成的文件,文件目录 project.bui ...
- 原创:各种normalize函数实现的性能和精度大比拼
///////////////////////////////////////////////////////////////////////// // // Performance benchmar ...