使用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框架是加拿大一个创业团队开发 ...
随机推荐
- OpenCV 4 Android
OpenCV4Android Want a Quick Start link? Use this tutorial: “OpenCV for Android SDK”. 想要快速开始吗?使用这个教程: ...
- 编写高质量代码改善C#程序的157个建议——建议103:区分组合和继承的应用场合
建议103:区分组合和继承的应用场合 继承所带来的多态性虽然是面向对象的一个重要特性,但这种特性不能在所有的场合中滥用.继承应该被当做设计架构的有用补充,而不是全部. 组合不能用于多态,但组合使用的频 ...
- ubuntu 跑.net core 2.0
安装.net core参考地址:http://www.microsoft.com/net/core/preview#linuxubuntu 服务器版本 UBbuntu 16.04 执行命令 ...
- 关于人脸识别引擎FaceRecognitionDotNet的实例
根据我上篇文章的分享,我提到了FaceRecognitionDotNet,它是python语言开发的一个项目face_recognition移植.结果真是有喜有忧,喜的是很多去关注了,进行了下载,我看 ...
- MongoDB高级知识-易使用
MongoDB高级知识-易使用 mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系模型主要是为了获取更好的扩展性.当然还有其他的一些好处. 与关系型数据库相比,面向文档的数据库不再有 ...
- JDK安装目录分析-两个jre和三个lib
安装JDK后,Java目录下有jdk和jre两个目录,但jdk下还有一个jre目录,而且这个jre比前面那个jre在bin目录下少了个server文件夹(Server端的Java虚拟机)!前一个jre ...
- python urllib2 对 http 的 get,put,post,delete
#GET: #!/usr/bin/env python# -*- coding:utf-8 -*-import urllib2def get(): URL = 'www.baidu.com' ...
- collections中的defaultdict
用类型 用函数返回值 嵌套的dict from collections import defaultdict def tree(): return defaultdict(tree) c = defa ...
- DatagridView 控件列顺序与设置的不一样
解决方案如下 : 1. dataGridView1.AutoGenerateColumns = false; 2. 绑定的dataSource 中所有的列都要写进去(列一定是绑定的模型中属性) 先在界 ...
- 【OCP-12c】CUUG最新考试原题整理及答案(071-11)
11.(5-8) choose the best answer: Examine the structure of the BOOKS_TRANSACTIONS table. You want to ...