.net集成小米推送

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

        /// 
        /// Remotes the certificate validate.
        /// 
        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的代码,但就是不行,一直报错,结果第二天自己就好了,我也是醉了,同样的代码,好了也就没继续深究了。坑。

你可能感兴趣的:(ASP.Net,MVC,C#)