信鸽推送 C#版SDK

  信鸽官方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 = 0;
        this.raw = "";
        this.loopInterval = -1;
        this.loopTimes = -1;
        this.action = new ClickAction();
        this.style = new Style(0);
        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 < 0 || multiPkg > 1)
            return false;
        if (type == TYPE_NOTIFICATION)
        {
            if (!style.isValid()) return false;
            if (!action.isValid()) return false;
        }
        if (expireTime < 0 || expireTime > 3 * 24 * 60 * 60)
            return false;
        try
        {
            DateTime.Parse(sendTime);
        }
        catch (Exception e)
        {
            return false;
        }
        foreach (var item in accept_time)
        {
            if (!item.isValid()) return false;
        }
        if (loopInterval > 0 && loopTimes > 0
                && ((loopTimes - 1) * loopInterval + 1) > 15)
        {
            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 = 1;
    /// <summary>
    /// 2:透传消息
    /// </summary>
    public static readonly int TYPE_MESSAGE = 2;
    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 = 0; 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 = -1, 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 = 5)
{
    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, 0, bytes.Length);
                reqStream.Close();
            }
        }
        request.Timeout = timeOut * 1000;
        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 > 0)
            {
                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需要区分开发和正式环境

时间: 2024-11-03 22:06:14

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

信鸽推送.NET SDK 开源

腾讯信鸽.NET SDK github 地址 https://github.com/yeanzhi/XinGePushSDK.NET 传送门 如何安装 建议使用nuget安装包,搜索"信鸽"即可 可以通过clone源码编译出dll文件后引入.注意项目使用vs2013 Restful api接口说明 详细说明请浏览信鸽官方wiki[传送门][1] 使用教程 1,初始化信鸽推送 XingeApp xinge = new XingeApp("accessId", &quo

解决iOS 使用腾讯信鸽推送sdk编译链接不能通过的问题

默认demo,在64bit模拟器上会link不过: target 中的 architectures 的valid architectrues里面,去掉 arm64, build active architecture only: 改为no 解决iOS 使用腾讯信鸽推送sdk编译链接不能通过的问题

android app 集成 信鸽推送

推送其实挺中意小米推送的,并经用户群占比还是比较大的,奈何拗不过php后端哥们的选型,就只好用信鸽推送了,期间接入过程中也是遇到不少问题,所以记录下来,以后如果还是用信鸽推送的话,估计看看以前的博客,也能少踩点坑. 因为最新版本是2.43,所以按照2.43的引入为准 1,导入jar包和so文件: 文件夹为信鸽推送必须的so文件: 2,针对so文件,gradle文件进行配置,生成第一张图里面的native_libs2的jar文件: 3,AndroidManifest.xml文件的配置,这个基本按照

iOS学习笔记5-推送(信鸽推送)

今天博主有一个集成信鸽推送的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 推送分为用户推送,本地推送,远程推送和地理位置推送,其中最常用的就是远程推送,远程推送可以直接编写代码实现功能,也可以使用第三方的SDK,常用的第三方SDK有信鸽推送,极光推送和个推.今天和大家分享一下集成信鸽推送的过程. 1.下载腾讯信鸽SDK 它下面有两个版本:基础版和Pro版 下载地址:http://xg.qq.com/xg/ctr_index/download 注:信鸽ProiOS SDK是信鸽iOS

苹果开发者中心 - 信鸽推送

一.苹果开发者账号分类 从价格分类: 1.$99 (1).个人账号 (2).公司账号:需要法人信息,营业执照,邓白氏编码 使用:用于上传App到AppStore 2.$299 企业账号:需要邓白氏编码 使用:用于公司内部测试,不用于盈利 3.免费 (1).个人申请账号:仅可以用于真机调试 (2).院校账号:仅可以用于真机调试,通过苹果认证的高校,可以使用 二.关于账号的使用 1.证书 (1).测试证书 每个账号最多能创建2个,生成证书需要使用创建CSR文件[1.通过钥匙串生成 2.文件包含:当前

如何快速体验腾迅信鸽推送

作者:zhanhailiang 日期:2014-10-13 信鸽是什么 腾讯信鸽(XG Push)是一款专业的免费移动App推送平台,支持百亿级的通知/消息推送,秒级触达移动用户,现已全面支持Android和iOS两大主流平台.开发者可以方便地通过嵌入SDK,通过API调用或者Web端可视化操作,实现对特定用户推送,大幅提升用户活跃度,有效唤醒沉睡用户,并实时查看推送效果. 详情请见:官方介绍文档 其包含两款产品: 信鸽:百亿级的通知/消息推送,秒级触达移动用户,弹无虚发,百发百中 信鸽Pro:

信鸽推送步骤(ios)

这两天研究了ios的推送机制,下面介绍下信鸽推送: 应用配置 首先进入信鸽,创建一个应用,然后在控制台点击应用列表:如下图: 点击应用配置,出现应用配置界面: 在开发环境下,添加个测试设备: 鼠标移动到测试设备上的时候回出现修改按钮,点击按钮,出现添加设备界面:(设备的token:udid) 添加发布和测试证书 参考信鸽的开发者文档,设置证书,如果还有疑问的话可以参考这个链接,也是推送证书的创建,写的比较好:http://blog.sina.com.cn/s/blog_6afb7d800101f

android 使用信鸽推送通知栏不显示推送的通知?

跟往常一样使用信鸽推送,不过这次却怎么也没反应.经过查看log发现确实是收到了推送过来的消息了,其中有这么一行: W/dalvikvm(23255): VFY: unable to resolve virtual method 1345: Landroid/support/v4/app/NotificationCompat$Builder;.build ()Landroid/app/Notification; 貌似c调用android的构造通知的那些函数调用不到,导致通知不能正常显示.看来问题出

QtAndroid详解(6):集成信鸽推送

推送是我们开发移动应用经常用到的功能,Qt on Android 应用也会用到,之前也有朋友问过,这次我们来看看怎么在 Qt on Android 应用中来集成来自腾讯的信鸽推送. 有关信鸽的 SDK 和集成指南,请到这里(http://xg.qq.com/)查看.本文是参考腾讯信鸽的在线帮助完成的.信鸽的 WIKI 和文档已经做得很好了,照着做就是,这里只讲 Qt 中集成信鸽时的步骤和注意事项. 这次我们要写一点点 Java 代码,就几行,如何做,可以参考<Qt on Android核心编程>