信鴿推送 C#版SDK

来源:http://www.cnblogs.com/Jimmy-pan/archive/2016/08/18/5784988.html
-Advertisement-
Play Games

信鴿推送官方sdk沒提供C#版的DEMO,考慮到應該有其他.NET的也會用到信鴿,下麵是我在使用信鴿過程中寫的demo。有什麼不對的地方,歡迎各位大牛指導。 ...


  信鴿官方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;
}
View Code

  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);
}
View Code

  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();
}
View Code

  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;
    }
}
View Code

  5.輔助校驗方法

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

  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;
}
View Code

  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;
}
View Code

  源碼下載

  註意:IOS需要區分開發和正式環境


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 源代碼如下: typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD TypeOffset[1]; } IMAGE_BASE_RELOCATION; typedef IMAGE_... ...
  • 查看文件內容 1.cat 命令 作用:查看文件內容 語法:cat 文件名 2. more 命令 作用:分頁查看文件內容 語法:more 文件名 例:more /etc/passwd 按下回車刷新一行,按下空格刷新一屏 退出:按q健 3.less 命令 作用:分頁查看文件內容 語法:less 文件名 ...
  • 1、LINQ是什麼? LINQ是Language Integrated Query的縮寫,即“語言集成查詢”的意思。LINQ的提出就是為了提供一種跨越各種數據源的統一的查詢方式,它主要包含4個組件--Linq to Objects、Linq to XML、Linq to DataSet和Linq t ...
  • 說明: 原文作者賢新 原文地址:http://www.cnblogs.com/chenxinblogs/p/4852813.html ViewData和ViewBag主要用於將數據從控制器中傳遞到視圖中去,ViewData本身就是一個字典。以KeyValue的形式存取值。ViewData的Value ...
  • 本文版權,歸博客園和作者吳雙共同所有。轉載和爬蟲請註明博客園蝸牛Redis系列文章地址 http://www.cnblogs.com/tdws/tag/NoSql/ Redis數據類型之集合(Set)。 單個集合中最多允許存儲2的三十二次方減1個元素。內部使用hash table散列表實現。 SAD ...
  • 在 ASP.NET Core 中,有多種途徑可以對應用程式狀態進行管理,取決於檢索狀態的時機和方式。本文簡要介紹幾種可選的方式,並著重介紹為 ASP.NET Core 應用程式安裝並配置會話狀態支持。 ...
  • 這幾天沒有按照計劃分享技術博文,主要是去醫院了,這裡一想到在醫院經歷的種種,我真的有話要說;醫院里的醫務人員曾經被吹捧為美麗+和藹+可親的天使,在經受5天左右相互接觸後不得不讓感慨;遇見的有些人員在掛號隊伍猶如長龍的時候坐在收費視窗玩手機,理由是自己是換班的差幾分鐘才上班呢;遇見態度極其惡劣的主任醫 ...
  • 本文使用Asp.Net (C#)調用互聯網上公開的WebServices(http://www.webxml.com.cn/WebServices/WeatherWebService.asmx)來實現天氣預報,該天氣預報 Web 服務,數據來源於中國氣象局 http://www.cma.gov.cn ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...