最近做的.net项目(Windows Service)需要向Android手机发送推送消息,真是有点困难,没有搞过就不停的搜文档,最后看到了一个开源项目PushSharp,可以在.net平台推送IOS,Android,Windows Phone等设备消息,大喜,然后先做了IOS的,成功了,但是做Android的时候遇到了问题,一直推送不成功,程序执行了,但是推送一直出不来,后来费劲的在网上搜,没有找到,最后放弃使用这种推送Android,另寻出路,随后找到了一种C2DM云端推送功能,但是问题又出现了,(1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;(2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;(3)不像在iPhone中,他们把硬件系统集成在一块了。所以对于我们开发者来说,如果要在我们的应用程序中使用C2DM的推送功能,因为对于不同的这种硬件厂商平台,比如摩托罗拉、华为、中兴做一个手机,他们可能会把Google的这种服务去掉,尤其像在国内就很多这种,把Google这种原生的服务去掉。买了一些像什么山寨机或者是华为这种国产机,可能Google的服务就没有了。而像在国外出的那些可能会内置。没办法了,最后转到了第三方推送服务平台,极光推送,下面将介绍怎么使用极光推送。

1,首先需要将你的app在极光官网上进行注册,获取一个ApiKey,一个APIMasterSecret(密码),将这两个值保存在配置文件(app/web.config)中,具体手机开发端需要做什么操作我们.net平台不管

<appSettings>
<add key="ApiKey" value="**********"/>
<add key="APIMasterSecret" value="*******"/>
</appSettings>

2,读取配置中的值

private readonly string ApiKey = "";
private readonly string APIMasterSecret = "";
ApiKey = ConfigurationManager.AppSettings["ApiKey"].ToString();//Android ApiKey
APIMasterSecret = ConfigurationManager.AppSettings["APIMasterSecret"].ToString();//Android密码

3,开始推送方法

        /// <summary>
/// Android极光推送
/// </summary>
/// <param name="RegistrationID">设备号</param>
public void PushAndroid(string RegistrationID)
{
try
{
Random ran = new Random();
int sendno = ran.Next(1, 2100000000);//随机生成的一个编号
string app_key = ApiKey;
string masterSecret = APIMasterSecret;
int receiver_type = 5;//接收者类型。2、指定的 tag。3、指定的 alias。4、广播:对 app_key 下的所有用户推送消息。5、根据 RegistrationID 进行推送。当前只是 Android SDK r1.6.0 版本支持
string receiver_value = RegistrationID; int msg_type = 1;//1、通知2、自定义消息(只有 Android 支持)
string msg_content = "{\"n_builder_id\":\"00\",\"n_title\":\"" + Title + "\",\"n_content\":\"" + Content + "\"}";//消息内容
string platform = "android";//目标用户终端手机的平台类型,如: android, ios 多个请使用逗号分隔。
string verification_code = GetMD5Str(sendno.ToString(), receiver_type.ToString(), receiver_value,masterSecret);//验证串,用于校验发送的合法性。MD5
string postData = "sendno=" + sendno;
postData += ("&app_key=" + app_key);
postData += ("&masterSecret=" + masterSecret);
postData += ("&receiver_type=" + receiver_type);
postData += ("&receiver_value=" + receiver_value);
postData += ("&msg_type=" + msg_type);
postData += ("&msg_content=" + msg_content);
postData += ("&platform=" + platform);
postData += ("&verification_code=" + verification_code); //byte[] data = encoding.GetBytes(postData);
byte[] data = Encoding.UTF8.GetBytes(postData);
string resCode = GetPostRequest(data);//调用极光的接口获取返回值
JpushMsg msg = Newtonsoft.Json.JsonConvert.DeserializeObject<JpushMsg>(resCode);//定义一个JpushMsg类,包含返回值信息,将返回的json格式字符串转成JpushMsg对象
}
catch (Exception ex)
{ }
}

4,MD5加密验证字符串,用于调用接口的时候,极光将做验证使用

        /// <summary>
/// MD5字符串
/// </summary>
/// <param name="paras">参数数组</param>
/// <returns>MD5字符串</returns>
public string GetMD5Str(params string [] paras)
{
string str = "";
for(int i=0;i<paras.Length;i++)
{
str += paras[i];
}
byte[] buffer = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(str));
string md5Str = string.Empty;
for (int i = 0; i < buffer.Length; i++)
{
md5Str = md5Str + buffer[i].ToString("X2");
}
return md5Str;
}

5,http Post方式调用极光的推送服务

 /// <summary>
/// Post方式请求获取返回值
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public string GetPostRequest(byte[] data)
{
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://api.jpush.cn:8800/v2/push"); myRequest.Method = "POST";//极光http请求方式为post
myRequest.ContentType = "application/x-www-form-urlencoded";//按照极光的要求
myRequest.ContentLength = data.Length;
Stream newStream = myRequest.GetRequestStream(); // Send the data.
newStream.Write(data, 0, data.Length);
newStream.Close(); // Get response
var response = (HttpWebResponse)myRequest.GetResponse();
using (var reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8")))
{
string result = reader.ReadToEnd();
reader.Close();
response.Close();
return result;
}
}

6,定义一个类,接收返回值

public class JpushMsg
{
private string sendno;//编号 public string Sendno
{
get { return sendno; }
set { sendno = value; }
}
private string msg_id;//信息编号 public string Msg_id
{
get { return msg_id; }
set { msg_id = value; }
}
private string errcode;//返回码 public string Errcode
{
get { return errcode; }
set { errcode = value; }
}
private string errmsg;//错误信息 public string Errmsg
{
get { return errmsg; }
set { errmsg = value; }
}
}

.net平台借助第三方推送服务在推送Android消息(极光推送)的更多相关文章

  1. 【FAQ】HMS Core推送服务与本地创建通知消息如何相互覆盖?

    我们知道,单独使用HMS Core推送服务或本地创建通知消息,都可以实现通知消息的覆盖,方式分别为: 1.本地创建通知消息(简称本地通知消息) 通过notificationManager.notify ...

  2. Android集成极光推送

    要说学习极光推送,个人感觉官方文档就非常好啦,但是没法,人太懒啦,为了下次能够快速的将极光推送集成到项目中,故结合之前开发的项目和官方文档记录下简单的Android集成极光推送,在这之前,先上一张简单 ...

  3. .net平台借助第三方推送服务在推送Android,IOS消息(极光推送_V3版本)最新

    最近刚从极光推送官网上看到V2版本要停用,不得不有重新写V3版本的.这里用到了 HTTP Basic Authentication http://www.cnblogs.com/pingming/p/ ...

  4. Android JPush(极光推送)的使用教程

    首先进入官网https://www.jpush.cn/,先注册一个账号. 注册号以后,创建应用 1.点击右上角进入个人中心 2.点击创建应用 3.在创建应用界面输入自己项目的应用名和应用的包名,输入后 ...

  5. Xamarin.Forms学习系列之Android集成极光推送

    一般App都会有消息推送的功能,如果是原生安卓或者IOS集成消息推送很容易,各大推送平台都有相关的Sample,但是关于Xamarin.Forms的消息推送集成的资料非常少,下面就说下Xamarin. ...

  6. Android JPush极光推送应用

    JPush纠结了5-6个小时,一直报下面的错误,纠结! [AndroidUtil] AndroidManifest.xml missing required intent filter for Pus ...

  7. Android之极光推送发送自定义消息

    Android端实现主要代码: <span style="font-size:14px;">import java.io.IOException; import jav ...

  8. android极光推送

    版权声明:本文为博主原创文章,未经博主允许不得转载. Android开发记录18-集成推送服务的一点说明 关于推送服务,国内有很多选择,笔者也对它们进行了一个详细的对比,一般我们产品选择推送服务主要考 ...

  9. java SDK服务端推送 --极光推送(JPush)

    网址:https://blog.csdn.net/duyusean/article/details/86581475 消息推送在APP应用中越来越普遍,来记录一下项目中用到的一种推送方式,对于Andr ...

随机推荐

  1. Underscore.js-精巧而强大实用功能库

    前言 从其他语言转向Javascript时,通常都会遇到一些困惑性问题.比如,Java中的HashMap在Javascript中如何实现?Javascript面向对象式编程如何实现继承?如何实现通用的 ...

  2. git使用注意点

    1. 如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字$ git clone git://github.com/schacon/grit.git mygrit 2. ...

  3. 转:gcc编译C++程序

    转:http://blog.csdn.net/liujiayu2/article/details/49864381 单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个 ...

  4. URAL 1995 Illegal spices

    构造. 前$n-k$个都是$1$,最后$k$个进行构造,首先选择填与上一个数字一样,如果不可行,那么这一格的值$+1$. #include<map> #include<set> ...

  5. scrapy抓取拉勾网职位信息(八)——使用scrapyd对爬虫进行部署

    上篇我们实现了分布式爬取,本篇来说下爬虫的部署. 分析:我们上节实现的分布式爬虫,需要把爬虫打包,上传到每个远程主机,然后解压后执行爬虫程序.这样做运行爬虫也可以,只不过如果以后爬虫有修改,需要重新修 ...

  6. snort安装--daq,dnet---ERROR! dnet header not found, go get it from...等错误解决方案

    snort源码安装过程中,需要安装daq,dnet.这里想说下如何进行安装.daq简单,源码下载直接安装就可以.dnet在安装过程中,出错后总想着在网上搜一搜,结果很失望..本篇记录的不仅仅是解决安装 ...

  7. Bakery CodeForces - 707B (最短路的思路题)

    Masha wants to open her own bakery and bake muffins in one of the n cities numbered from 1 to n. The ...

  8. POJ 1222【异或高斯消元|二进制状态枚举】

    题目链接:[http://poj.org/problem?id=1222] 题意:Light Out,给出一个5 * 6的0,1矩阵,0表示灯熄灭,反之为灯亮.输出一种方案,使得所有的等都被熄灭. 题 ...

  9. [HDU5492]Find a path

    题目大意: 一个n*m的格子,每个格子上都有一个数. 你可以向下或者向右走,从(1,1)走到(n,m),问方差*(n+m-1)最小的路径是哪个? 思路: 方差*(n+m-1)就相当于给格子里每个数乘上 ...

  10. C# -- 学习笔记之基础篇

    由于要做一个系统,需要用到搜索引擎开发的很多知识点.对于开发语言的选择,我一般不是擅长什么才选择什么的,而是通过对比之后,考虑开发时间和难易程度来选择.尽管现在的开发经验还不足,也只能凭借自己弱弱的判 ...