信鸽官方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