信鸽官方sdk没提供C#版的DEMO,考虑到应该有其他.NET的也会用到信鸽,下面是我在使用信鸽过程中写的demo。有什么不对的地方,欢迎各位大牛指导。
  使用过程中主要是有2个问题:
  1.参数组装,本demo使用Dictionary进行组装和排序;
  2.生成 sign(签名)

  下文贴出单个设备推送的代码(忽略大多数辅组实体的代码,下面会贴上源代码)
  1.Android 消息实体类 Message
  

  

public class Message
{
public Message()
{
this.title = "";
this.content = "";
this.sendTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
this.accept_time = new List<TimeInterval>();
this.multiPkg = ;
this.raw = "";
this.loopInterval = -;
this.loopTimes = -;
this.action = new ClickAction();
this.style = new Style();
this.type = Message.TYPE_MESSAGE;
}
public bool isValid()
{
if (!string.IsNullOrWhiteSpace(raw))
{
return true;
}
if (type < TYPE_NOTIFICATION || type > TYPE_MESSAGE)
return false;
if (multiPkg < || multiPkg > )
return false;
if (type == TYPE_NOTIFICATION)
{
if (!style.isValid()) return false;
if (!action.isValid()) return false;
}
if (expireTime < || expireTime > * * * )
return false;
try
{
DateTime.Parse(sendTime);
}
catch (Exception e)
{
return false;
}
foreach (var item in accept_time)
{
if (!item.isValid()) return false;
}
if (loopInterval > && loopTimes >
&& ((loopTimes - ) * loopInterval + ) > )
{
return false;
} return true;
}
public string ToJosnByType()
{
if (type == TYPE_MESSAGE)
{
var obj = new { title = title, content = content, accept_time = accept_time.ToJson() };
return obj.ToJson();
}
return this.ToJson();
}
/// <summary>
/// 1:通知
/// </summary>
public static readonly int TYPE_NOTIFICATION = ;
/// <summary>
/// 2:透传消息
/// </summary>
public static readonly int TYPE_MESSAGE = ;
public String title;
public String content;
public int expireTime;
public String sendTime;
private List<TimeInterval> accept_time;
public int type;
public int multiPkg;
private Style style;
private ClickAction action;
/// <summary>
/// 自定义参数,所有的系统app操作参数放这里
/// </summary>
public string custom_content;
public String raw;
public int loopInterval;
public int loopTimes;
}

  2.组装参数函数

  

/// <summary>
/// Android单个设备 推送信息
/// </summary>
/// <param name="deviceToken">针对某一设备推送,token是设备的唯一识别 ID</param>
/// <param name="message"></param>
/// <returns></returns>
public string pushSingleDevice(String deviceToken, Message message)
{
if (!ValidateMessageType(message))
{
return "";
}
if (!message.isValid())
{
return "";
}
Dictionary<String, Object> dic = new Dictionary<String, Object>();
dic.Add("access_id", this.m_accessId);
dic.Add("expire_time", message.expireTime);
dic.Add("send_time", message.sendTime);
dic.Add("multi_pkg", message.multiPkg);
dic.Add("device_token", deviceToken);
dic.Add("message_type", message.type);
dic.Add("message", message.ToJson());
dic.Add("timestamp", DateTime.Now.DateTimeToUTCTicks()); return CallRestful(XinGeAPIUrl.RESTAPI_PUSHSINGLEDEVICE, dic);
}

  3.生成签名

  

/// <summary>
/// 生成 sign(签名)
/// </summary>
/// <param name="method"></param>
/// <param name="url"></param>
/// <param name="dic"></param>
/// <returns></returns>
protected String GenerateSign(String method, String url, Dictionary<String, Object> dic)
{
var str = method;
Uri address = new Uri(url);
str += address.Host;
str += address.AbsolutePath;
var dic2 = dic.OrderBy(d => d.Key);
foreach (var item in dic2)
{
str += (item.Key + "=" + (item.Value == null ? "" : item.Value.ToString()));
}
str += this.m_secretKey;
var s_byte = Encoding.UTF8.GetBytes(str);
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(s_byte);
StringBuilder sBuilder = new StringBuilder();
for (int i = ; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}

  4.生成请求的地址和调用请求

  

/// <summary>
/// 生成请求的地址和调用请求
/// </summary>
/// <param name="url"></param>
/// <param name="dic"></param>
/// <returns></returns>
protected string CallRestful(String url, Dictionary<String, Object> dic)
{
String sign = GenerateSign("POST", url, dic);
if (string.IsNullOrWhiteSpace(sign))
{
return (new { ret_code = -, err_msg = "generateSign error" }).ToJson();
}
dic.Add("sign", sign);
try
{
var param = "";
foreach (var item in dic)
{
var key = item.Key;
var value = HttpUtility.UrlEncode(item.Value == null ? "" : item.Value.ToString(), Encoding.UTF8);
param = string.IsNullOrWhiteSpace(param) ? string.Format("{0}={1}", key, value) : string.Format("{0}&{1}={2}", param, key, value);
}
return Request(url, "POST", param); }
catch (Exception e)
{ return e.Message;
}
}

  5.辅助校验方法

  

protected bool ValidateMessageType(Message message)
{
if (this.m_accessId < XinGeAPIUrl.IOS_MIN_ID)
return true;
else
return false;
}

  6.Http请求

  

public string Request(string _address, string method = "GET", string jsonData = null, int timeOut = )
{
string resultJson = string.Empty;
if (string.IsNullOrEmpty(_address))
return resultJson;
try
{
Uri address = new Uri(_address); // 创建网络请求
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
//System.Net.ServicePointManager.DefaultConnectionLimit = 50;
// 构建Head
request.Method = method;
request.KeepAlive = false;
Encoding myEncoding = Encoding.GetEncoding("utf-8");
if (!string.IsNullOrWhiteSpace(jsonData))
{
byte[] bytes = Encoding.UTF8.GetBytes(jsonData);
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bytes, , bytes.Length);
reqStream.Close();
}
}
request.Timeout = timeOut * ;
request.ContentType = "application/x-www-form-urlencoded";
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(response.GetResponseStream());
string responseStr = reader.ReadToEnd();
if (responseStr != null && responseStr.Length > )
{
resultJson = responseStr;
}
}
}
catch (Exception ex)
{
resultJson = ex.Message;
}
return resultJson;
}

  7.发送一个推送

  

public bool pushSingleDevice(String deviceToken, string account, string title, string content, Dictionary<string, object> custom, out string returnStr)
{
content = content.Replace("\r", "").Replace("\n", ""); Message android = new Message();
android.title = title;
android.content = content;
android.custom_content = custom.ToJson();
returnStr = pushSingleDevice(deviceToken, android);
return true;
}

  源码下载

  注意:IOS需要区分开发和正式环境

信鸽推送 C#版SDK的更多相关文章

  1. 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)

    信鸽推送 .NET  服务端 SDK rest api 调用库-介绍 该版本是基于信鸽推送v2版本的时候封装的,先拿出来与大家分享,封装还还凑合,不依赖其他http调用件,唯一依赖json序列化dll ...

  2. 信鸽推送.NET SDK 开源

    github 地址 https://github.com/yeanzhi/XinGePushSDK.NET 传送门如何安装    建议使用nuget安装包,搜索"信鸽"即可    ...

  3. android app 集成 信鸽推送

    推送其实挺中意小米推送的,并经用户群占比还是比较大的,奈何拗不过php后端哥们的选型,就只好用信鸽推送了,期间接入过程中也是遇到不少问题,所以记录下来,以后如果还是用信鸽推送的话,估计看看以前的博客, ...

  4. 信鸽推送 10004,os文件配置出错,解决办法

    信鸽推送注册失败 返回码 10004 是 os  配置出现问题 经过询问客服,得到以下解决办法 将SDK中的so文件复制下来 新建文件夹jniLibs,并将 so 配置文件粘贴进去 便可完成注册

  5. QtAndroid具体解释(6):集成信鸽推送

    推送是我们开发移动应用经经常使用到的功能,Qt on Android 应用也会用到,之前也有朋友问过,这次我们来看看怎么在 Qt on Android 应用中来集成来自腾讯的信鸽推送. 有关信鸽的 S ...

  6. Android 信鸽推送通知栏不显示推送的通知

    使用信鸽推送,却怎么也没反应.经过查看log发现确实是收到了推送过来的消息了,其中有这么一行: W/dalvikvm(23255): VFY: unable to resolve virtual me ...

  7. QQ信鸽推送

    闲来无事,看看腾讯的信鸽推送! 优点: 1.毕竟大腿出的东西,不会太差 2.集成快 3.推送效率高,功能强,APP后台被杀的情况下同样能接受到推送. 废话少说,直接上代码: 源代码.zip

  8. iOS 关于信鸽推送点击推送通知的处理

    最近的项目中使用了推送模块,使用的是企鹅帝国的信鸽推送服务,关于具体怎么推送的,证书如何设置,我不再赘述,一来开发文档中已经讲的非常清楚,二来在网上一搜的话也能搜到一大堆:在这里主要写下关于推送的通知 ...

  9. 李洪强iOS之集成极光推送一iOS SDK概述

    李洪强iOS之集成极光推送一iOS SDK概述 JPush iOS 从上图可以看出,JPush iOS Push 包括 2 个部分,APNs 推送(代理),与 JPush 应用内消息. 红色部分是 A ...

随机推荐

  1. linux 改变系统时间

    date  查看系统时间 date -s 04/05/16  日期设置成2016年4月5日 date -s 15:03:32  日期设置成2016年4月5日15:03:32 上述两步可以直接写成这样一 ...

  2. 使用C/C++代码编写Python模块

    假如我们要用C语言实现下面的python脚本bird.py import os def fly(name): print(name + " is flying.\n") 调用脚本m ...

  3. 离线安装 python 第三方库

     离线安装 python 第三方库 首先你需要在联网的服务器上已经安装了一个第三方库,比如是paramiko,也就是说你已经执行了 pip install paramiko    ,小提示: 如果在安 ...

  4. 【leetcode 94. 二叉树的中序遍历】解题报告

    前往二叉树的:前序,中序,后序 遍历算法 方法一:递归 vector<int> res; vector<int> inorderTraversal(TreeNode* root ...

  5. Error creating bean with name 'dateSource' defined in file 错误信息

    问题的原因: 在web项目中搭建SSM框架,启动Tomcat时出现错误信息 有配置文件:applicationContext-mybatis.xml (Spring配置) spring-servlet ...

  6. CBoard 看板参数管理

    看板设计采用简单Row+Column布局模式,每行总长度为12,每列对应一个图表,行高度可以调节,列高度集成行高 左边栏看板分类中,我的看板为当前用户创建的看板,普通看板分类通过分类管理维护,保存看板 ...

  7. Macaca,Maven,MVC框架

    Macaca:Macaca是阿里开源的一套完整的自动化测试解决方案.同时支持PC和移动端测试,支持的语言有JS,Java,Python. Maven:java,Maven项目对象模型(POM),可以通 ...

  8. Kibana6.x.x源码结构分析笔记

  9. HihoCoder - 1048 状压DP 经典题

    hihocoder题解说的十分清晰了,这份代码就是从讲解里学习的 方案数就是不断枚举合法状态下横放竖放或两者均可 合法判断的依据是记录当前行和下一行的状态 防止重复枚举的方法是先按行后按列 递归基瞎写 ...

  10. QQ互联 网站应用接入

    1.准备工作 接入qq登陆前,网站需要先进行申请,获得对应的appid和appkey, 以保证后续流程中可正确对网站与用户进行授权. 2.放置qq登陆按钮. 在网站页面上放置“qq登录”按钮,并为按钮 ...