由于项目需要给安卓、ios提供提送消息服务。找到了umeng这个平台,官方竟然没有提供.net版本的SDK,同时项目需要就拿出来和大家分享一下需要的同学们可以做个参考,建议官方提供.net版本。

这里就提供、单播、组播和广播模式

1.接口声明

  1. public interface IMsgService
  2. {
  3. /// <summary>
  4. /// 单播
  5. /// </summary>
  6. /// <param name="msg"></param>
  7. MsgDTO UniCast(string msg, string deviceId);
  8.  
  9. /// <summary>
  10. /// 组播
  11. /// </summary>
  12. /// <param name="msg"></param>
  13. MsgDTO GroupCast(string msg, int operatorId);
  14.  
  15. /// <summary>
  16. /// 广播
  17. /// </summary>
  18. /// <param name="msg"></param>
  19. MsgDTO BroadCast(string msg);
  20. }

2.安卓服务实现

  1. public class AndroidMsgService : MsgServiceBase, IMsgService
  2. {
  3.  
  4. protected static readonly string App_Master_Secret = AppSettingHelper.DomainSetting.GetAttribute<string>("Api/UmengMsgList/Android", "appmastersecret");
  5.  
  6. protected static readonly string App_Key = AppSettingHelper.DomainSetting.GetAttribute<string>("Api/UmengMsgList/Android", "appkey");
  7.  
  8. private AndroidMsgService()
  9. {
  10.  
  11. }
  12.  
  13. public static readonly AndroidMsgService Instance =new AndroidMsgService();
  14.  
  15. protected override string GetSign(string post_body)
  16. {
  17. return (String.Concat("POST", SendUrl, post_body, App_Master_Secret)).MD5().ToLower();
  18. }
  19.  
  20. public MsgDTO BroadCast(string msg)
  21. {
  22. var sendData = new
  23. {
  24. appkey = App_Key,
  25. timestamp = GetTimeStamp,
  26. type = "broadcast",
  27. payload = new
  28. {
  29. display_type = "notification",// 通知,notification
  30. body = new
  31. {
  32. //custom = msg
  33. ticker =msg,
  34. title = msg,
  35. text = msg,
  36. after_open = "go_custom",
  37. custom=""
  38. },
  39. extra = new
  40. {
  41. key1 = "key1",
  42. key2 = "key2"
  43. }
  44. },
  45. policy = new
  46. {
  47. // start_time = "2013-10-29 12:00:00", //定时发送
  48. expire_time = DateTime.Now.AddDays().ToString("yyyy-MM-dd HH:mm:ss")
  49. },
  50. production_mode = ProductMode,
  51. description = "测试广播通知-android"
  52. };
  53.  
  54. //var result = this.GetResult(sendData, GetSign(sendData.ToJson()));
  55. //return result;
  56.  
  57. var result = this.GetResult(sendData);
  58. return result;
  59. }
  60.  
  61. public MsgDTO GroupCast(string msg, int operatorId)
  62. {
  63. var sendData = new
  64. {
  65. appkey = App_Key,
  66. timestamp = GetTimeStamp,
  67. type = "groupcast",
  68. filter = new
  69. {
  70. where = new
  71. {
  72. and = new[]
  73. {
  74. new {tag=operatorId.ToString()}
  75. }
  76. }
  77. },
  78. payload = new
  79. {
  80. display_type = "notification", // 通知,notification
  81. body = new
  82. {
  83. //custom = msg
  84. ticker = msg,
  85. title = msg,
  86. text = msg,
  87. after_open = "go_custom",
  88. custom = ""
  89. },
  90. extra = new
  91. {
  92. key1 = "key1",
  93. key2 = "key2"
  94. }
  95. },
  96. policy = new
  97. {
  98. expire_time = DateTime.Now.AddDays().ToString("yyyy-MM-dd HH:mm:ss")
  99. },
  100. production_mode = ProductMode,
  101. description = "测试组播通知-Android"
  102. };
  103. var result = base.GetResult(sendData);
  104. return result;
  105. }
  106.  
  107. public MsgDTO UniCast(string msg, string deviceId)
  108. {
  109.  
  110. var sendData = new
  111. {
  112. appkey = App_Key,
  113. timestamp = GetTimeStamp,
  114. type = "unicast",
  115. device_tokens = deviceId,
  116. payload = new
  117. {
  118. display_type = "notification", // 消息,message
  119. body = new
  120. {
  121. //custom = msg
  122. ticker = msg,
  123. title = msg,
  124. text = msg,
  125. after_open = "go_custom",
  126. custom = ""
  127. },
  128. extra = new
  129. {
  130. key1= "key1",
  131. key2= "key2"
  132. }
  133. },
  134. production_mode= ProductMode,
  135. description = "测试单播"
  136. };
  137. var result = base.GetResult(sendData);
  138. return result;
  139.  
  140. }
  141.  
  142. }

3.IOS服务实现

  1. public class IosMsgService : MsgServiceBase, IMsgService
  2. {
  3. protected static readonly string App_Master_Secret = AppSettingHelper.DomainSetting.GetAttribute<string>("Api/UmengMsgList/IOS", "appmastersecret");
  4.  
  5. protected static readonly string App_Key =
  6. AppSettingHelper.DomainSetting.GetAttribute<string>("Api/UmengMsgList/IOS", "appkey");
  7.  
  8. public static readonly IosMsgService Instance = new IosMsgService();
  9.  
  10. private IosMsgService()
  11. {
  12.  
  13. }
  14.  
  15. protected override string GetSign(string post_body)
  16. {
  17. return (String.Concat("POST", SendUrl, post_body, App_Master_Secret)).MD5().ToLower();
  18. }
  19.  
  20. public MsgDTO BroadCast(string msg)
  21. {
  22. var sendData = new
  23. {
  24. appkey = App_Key,
  25. timestamp = GetTimeStamp,
  26. type = "broadcast",
  27. payload = new
  28. {
  29. aps = new { alert = msg } // 苹果必填字段
  30. },
  31. policy = new
  32. {
  33. // start_time = "2013-10-29 12:00:00", //定时发送
  34. expire_time = DateTime.Now.AddDays().ToString("yyyy-MM-dd HH:mm:ss")
  35. },
  36. production_mode = ProductMode,
  37. description = "测试广播通知-iOS"
  38. };
  39.  
  40. //var result = RequestHelper.HttpUtil<MsgDTO>(String.Concat(SendUrl, $"?sign={GetSign(sendData.ToJson())}"), sendData);
  41. //return result;
  42.  
  43. var result = this.GetResult(sendData);
  44. return result;
  45. }
  46.  
  47. public MsgDTO GroupCast(string msg,int operatorId)
  48. {
  49. var sendData = new
  50. {
  51. appkey = App_Key,
  52. timestamp = GetTimeStamp,
  53. type = "groupcast",
  54. filter = new
  55. {
  56. where = new
  57. {
  58. and = new []
  59. {
  60. new {tag=operatorId.ToString()}
  61. }
  62. }
  63. },
  64. payload = new
  65. {
  66. aps = new { alert = msg } // 苹果必填字段
  67. },
  68. policy = new
  69. {
  70. expire_time = DateTime.Now.AddDays().ToString("yyyy-MM-dd HH:mm:ss")
  71. },
  72. production_mode = ProductMode,
  73. description = "测试组播通知-IOS"
  74. };
  75. var result = base.GetResult(sendData);
  76. return result;
  77. //var result = RequestHelper.HttpUtil<MsgDTO>(String.Concat(SendUrl, $"?sign={GetSign(sendData.ToJson())}"), sendData);
  78. //return result;
  79. }
  80.  
  81. public MsgDTO UniCast(string msg, string deviceId)
  82. {
  83. var sendData = new
  84. {
  85. appkey = App_Key,
  86. timestamp = GetTimeStamp,
  87. type = "unicast",
  88. device_tokens = deviceId,
  89. payload = new
  90. {
  91. aps = new
  92. {
  93. alert = msg
  94. } // 苹果必填字段
  95. },
  96. policy = new
  97. {
  98. expire_time = DateTime.Now.AddDays().ToString("yyyy-MM-dd HH:mm:ss")
  99. },
  100. production_mode= ProductMode,
  101. description = "测试单播消息"
  102. };
  103. var result = base.GetResult(sendData);
  104. return result;
  105. //var result = RequestHelper.HttpUtil<MsgDTO>(String.Concat(SendUrl, $"?sign={GetSign(sendData.ToJson())}"), sendData);
  106. //return result;
  107. }
  108. }

4.MsgServiceBase服务基类

  1. public abstract class MsgServiceBase
  2. {
  3. protected static readonly string SendUrl = AppSettingHelper.DomainSetting.GetValue("Api/UmengMsgList/RequestUrl");
  4.  
  5. protected static readonly string ProductMode = AppSettingHelper.DomainSetting.GetAttribute<string>("Api/UmengMsgList", "productmode");
  6.  
  7. protected abstract string GetSign(string sendData);
  8.  
  9. protected string GetTimeStamp => (DateTime.UtcNow - new DateTime(, , , , , , DateTimeKind.Utc)).TotalMilliseconds.ToString(
  10. "#");
  11.  
  12. protected MsgDTO GetResult(dynamic sendData)
  13. {
  14.  
  15. var result = RequestHelper.HttpUtil<MsgDTO>(String.Concat(SendUrl, $"?sign={this.GetSign(JsonConvert.SerializeObject(sendData))}"), sendData);
  16. return result;
  17. }
  18. }

5.HttpUtil

  1. public static T HttpUtil<T>(string url, dynamic data) where T :new()
  2. {
  3. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  4. request.ContentType = "application/x-www-form-urlencoded"; //设置HTTP头
  5. request.Method = "POST";
  6.  
  7. //byte[] postdata = Encoding.UTF8.GetBytes(data);
  8. byte[] postdata = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));
  9. request.ContentLength = postdata.Length;
  10.  
  11. Stream newStream = request.GetRequestStream();
  12. newStream.Write(postdata, , postdata.Length);
  13. newStream.Close();
  14.  
  15. HttpWebResponse myResponse = (HttpWebResponse)request.GetResponse();
  16. StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
  17. return (reader.ReadToEnd()).FromJson<T>();//得到结果
  18. }

贴上源码:http://files.cnblogs.com/files/zpc870921/Common.rar

友盟移动开发平台.NET版本SDK的更多相关文章

  1. 友盟分享各平台URL设置

    首先,想要进项友盟分享,需要到各平台去申请ID和KEY 比如想进行微信分享,就到微信开发者平台去创建应用,拿到对应的id和appScreat,然后进行设置: 参考资料

  2. 商业创新不能等?用友低代码开发平台YonBuilder为您加速!

    随着云计算.人工智能.物联网.大数据.5G等新一代技术的快速发展,越来越多的企业希望借助技术的力量加速数智化转型,期许通过更加敏捷和强大的应用系统推动企业的商业创新速度.但传统软件开发周期长.开发成本 ...

  3. 用友低代码开发平台YonBuilder首次亮相DevRun开发者沙龙

    2020年的今天,没有人会再质疑企业上云的必要性与价值所在.从高科技行业到传统领域,大大小小的企业都希望走在变革道路前列,通过企业云加快业务数字化转型,更好地维护和管理企业数据. 然而,大多数企业都很 ...

  4. UmengAppDemo【友盟统计SDK集成以及多渠道打包配置,基于V7.5.3版本】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里只是记录下集成友盟统计SDK以及简单配置多渠道打包的步骤.所以1.该Demo不能运行:2.配置多渠道打包只是一种简单的写法,具体 ...

  5. 友盟推送 .NET (C#) 服务端 SDK rest api 调用库

    友盟推送 .NET SDK rest api 介绍 该版本是基于友盟推送2.3版本封装的,网上查询了下发现没有.NET版本的调用库,官方也没有封装.NET的版本,只有python.java.php版本 ...

  6. iOS开发-友盟分享(3)

    iOS 友盟分享 这个主要是提到如何通过友盟去自定义分享的步骤: 一.肯定要去友盟官网下载最新的SDK包,然后将SDK导入到你的工程文件夹里面去: 二.注册友盟账号,将你的APP添加到你的账号里面然后 ...

  7. android开发系列之友盟统计集成

    相比大家都遇到这种情况,当我们的app上线之后,我们想要实时的跟踪了解到app里面的bug情况.新增用户情况.用户相关的行为属性情况等.但是如果自己在app里面去开发集成这些功能,一方面开发工作量还挺 ...

  8. Android中用友盟实现QQ的第三方登录

    //首先应该去友盟的官网注册你的账号,创建一个应用,获得它的APPkey,也可以用它的API上的appkey,下载SDK,下面根据API文档一步步实现就行了. //下面是友盟的APi文档 1.  产品 ...

  9. Android 友盟分享详细集成过程及所遇问题解决

    最近项目需要针对微信.朋友圈.QQ.QQ空间集成友盟分享的功能,说实话,我也是第一次做,期间碰到过很多问题,这篇随笔就来写一下我是怎么集成友盟分享的,还有碰到哪些问题,都是怎样解决的! 其实集成友盟并 ...

随机推荐

  1. MFC:CTime类和CTimeSpan类

    CTime类 CTime类表示日期和时间,上限是3000年12月31日,下限是1970年1月1日 12:00:00 AM GMT. CTime(); 构造一个未经初始化的CTime对象.此状态的CTi ...

  2. 温习js中对象的继承

    温故而知新 XD 1. 关于原型和构造函数的几个知识要点: 使用new 操作符调用构造函数,会经历以下四个步骤: 1.1. 创建一个新对象: 1.2. 将构造函数的作用域赋给新对象(因此 this 就 ...

  3. mysql 字段为NULL的一些操作

    1. 修改字段为NULL update tableName set column1 = null where id = 1 2. 字段是否为NULL (1)字段为空 select * tableNam ...

  4. Maven -- 在进行war打包时用正式环境的配置覆盖开发环境的配置

    我们的配置文件一般都放在  src/main/resource 目录下. 假定我们的正式环境配置放在 src/main/online-resource 目录下. 那么打成war包时,我们希望用onli ...

  5. bigDecimal学习

    1.引言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果, ...

  6. Item 2---遇到构造器具有多个参数时,要考虑用构建器;Builder模式

    问题,面对这种一个构造器具备多个参数的问题,现有的做法是使用重叠构造器的方式,该方式存在的问题: public class NutritionFacts { private final int ser ...

  7. Android通知栏介绍与适配总结

    由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知栏玩法,谷歌也不得不对其进行更新迭代调整,增加新功能的同时,也在不断地改变样式,试图迎合更 ...

  8. Linux 中使用 dd 测试磁盘性能

    翻译自 : Linux I/O Performance Tests using dd 基本说明 dd 可以用来做简单的低级别复制文件. 这样做, 一般都是可一直直接访问设备文件. 需要说明的是, 错误 ...

  9. 打开Android系统安装APK的页面

    //使用隐式意图开启安装APK的Activity Intent intent = new Intent("android.intent.action.VIEW"); intent. ...

  10. Java的Integer常量池和String常量池

    1.Integer的常量池 看下面一段代码: package cn.qlq.test; public class ArrayTest { public static void main(String[ ...