信鸽官方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. Mysql初识数据库《四》mysql安装与基本管理

    一.MySQL介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...

  2. IDEA开发javaEE项目问题总结

    删了删了,不瞎折腾了,用Maven嘛事没有 注意在idea中,add framework后还需要在maven中添加相关依赖

  3. 局域网内搭建一个服务器,可以使用 https 吗

    https://www.v2ex.com/t/472394 这是一个创建于 126 天前的主题,其中的信息可能已经有所发展或是发生改变. 局域网内通过嵌入式设备搭建一个轻量级 web 服务,可以仍然使 ...

  4. python2和python3 分别连接MySQL的代码

    python2中的写法如下: #coding=utf-8 import MySQLdb try: conn = MySQLdb.connect(host='localhost', port=3306, ...

  5. dsp之BF531笔记

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 很久以前的BF531的笔记,觉得有用分享出来.摘自于open dsp 通用Gpio ADSP-BF53x 处理器上有16 个PF 接口,这些接口就 ...

  6. bzoj 3895: 取石子

    $ \color{#0066ff}{ 题目描述 }$ Alice和Bob两个好朋含友又开始玩取石子了.游戏开始时,有N堆石子 排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选 ...

  7. php 写入csv时 双引号,逗号及特殊字符

    1.双引号 <?php function new_csv($string) { $filename = date('Ymd').'.csv'; //设置文件名 header("Cont ...

  8. 为Arch Linux添加鼠标支持(gpm)

    gpm的安装 在Arch Linux中安装gpm $ pacman -S gpm 如果你正在使用触控板,需要安装一下插件 $ pacman -S gpm xf86-input-synaptics 需要 ...

  9. ubuntu设置静态 ip

    查看ip和DNS 终端输入ifconfig获取ip,子网掩码.输入nm-tool获取网关,DNS 修改配置文件/etc/network/interfaces root@ubuntu:~# sudo g ...

  10. PHP 生成 MySql 数据库字典

    项目说明 通过配置 MySql 数据库信息,使用 PHP 生成数据表字典可以输出在当前页面,可以生成文件保存在指定位置,也可以下载格式支持网页HTML格式.CSV格式(Excel 读取).ZIP压缩格 ...