app需要一款推送,纵览市场各种第三方推送,最终选择了小米push,然后去小米官方寻找服务端sdk, 找了很久,没看到.net的sdk。网上百度一圈,看到有人用ikvm将java的jar转成.net的dll,用C#调用java的方法,实现推送。一共就是6个主要的dll文件,代码如下:
Constants.useOfficial();//正式环境
Sender androidSender = new Sender(accsssionandroidSecret);
com.xiaomi.xmpush.server.Message androidMsg = new com.xiaomi.xmpush.server.Message.Builder()
.title(title)
.description(description)//通知栏展示的通知描述
.payload(messagepayload)//透传消息
.passThrough(0)//设置是否透传1:透传, 0通知栏消息
.notifyId(new java.lang.Integer(Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds)))//取时间戳,避免通知覆盖
.restrictedPackageName("com.dashu.blockchain")//包名
.notifyType(new java.lang.Integer(1)) //使用默认提示音提示
.notifyType(new java.lang.Integer(2)) //使用默认震动
.notifyType(new java.lang.Integer(3)) //使用默认LED灯光
.timeToLive(3600000 * 336)//服务器默认保留两周(毫秒)
//.extra("data", "测试extra11111")//字符数不能超过1024最多十组
.extra(Constants.EXTRA_PARAM_INTENT_URI, "intent:#Intent;component=com.dashu.blockchain/.activity.FlashActivity;end")
.extra(Constants.EXTRA_PARAM_NOTIFY_EFFECT, Constants.NOTIFY_ACTIVITY)
.extra("data", org.json.simple.JSONObject.toJSONString(map))
.extra("PushType",PushType)
//.extra("Type","1")
.extra("flow_control", "4000") // 设置平滑推送, 推送速度4000每秒(qps=4000)
.build();
//广播 retries 重试次数
com.xiaomi.xmpush.server.Result androidPushResult1 = androidSender.sendToUserAccount(androidMsg, UserId, 1);
string value = androidPushResult1.getErrorCode().getName();
集成过程非常简单,主要说一下需要注意的几个问题:
1. 因为ios和android的accessKeySecret不一样,需要分开实例化sender,这样就导致如果需要账号在多设备同步,需要同时像ios发送一个推送和android 发送推送。
2.推送的时候,android里面的title,description是不能为空的,ios的body不能为空字符串;
3.在本地测试完美通过,在服务器上面,会报错,主要是因为小米是https的服务器,报证书安全问题,解决方案是信任一切ssl证书,代码如下:
public static void SetCertificatePolicy()
{
ServicePointManager.ServerCertificateValidationCallback
+= RemoteCertificateValidate;
}
/// <summary>
/// Remotes the certificate validate.
/// </summary>
private static bool RemoteCertificateValidate(
object sender, X509Certificate cert,
X509Chain chain, SslPolicyErrors error)
{
// trust any certificate!!!
System.Console.WriteLine("Warning, trust any certificate");
return true;
}
在发送消息之前,加上这个就行了,之前在网上找了一圈答案,也找了信任ssl的代码,但就是不行,一直报错,结果第二天自己就好了,我也是醉了,同样的代码,好了也就没继续深究了。坑。