近日要开发一款APP的推送功能,鉴于前端使用的是HBuilder而IDE中集成了第三方推送服务商“个推”好吧为了方便就你了,可是开发完才发现由于MIUI的深度优化APP退到后台后APP收不到推送消息,前台运行时虽能收到消息点击通知却也没有任何反映,这是要玩我么?
与客服多方沟通无果后只能放弃了,毕竟MIUI也好大的用户量!好在看到HBuilder中同时集成了小米推送,好了自家的推送总该不会屏蔽了吧!
那么先到小米开放平台注册开发者账号吧,注册完要审核!那么我先去下载SDK看看文档什么的吧!
妈蛋,老子当时就傻眼了 竟然没有我.NET的,赤裸裸的歧视啊有木有!
罢了,好在我.NET还有IKVM.NET还可以调用JAVA。先尝试一下吧,到IKVM官网下载,下载好解压后得到以下文件
好了,话不多说 开始动真格的!
要在.NET中调用当然是要先把JAVA的JAR包转成.NET可调用的dll文件所以我们先把小米提供的JAVA版SDK下载下来
好了现在开始转换
第一步,先进入IKVM的bin目录下\ikvm-7.2.4630.5\bin,按住shift单击鼠标右键选择“在此处打开命令窗口”,或者cmd下cd到IKVM的bin目录下,其实添加系统环境变量也是可以的,但是我并不打算这么搞毕竟只用一次!
打开后输入ikvm如果看到如下信息我们就可以进行下一步了
先看看小米推送JAVA版的SDK,下载下来发现里边有两个JAR包
下面这个MiPush_SDK_Server_2_2_18.jar应该就是小米推送要使用的了,上面这个是推送服务引用的JSON包所以我们先转换这个JSON包
转换要用到命令 -target:library
使用方法:
ikvmc -target:library F:/sdk/json-simple-1.1.1.jar
好了现在看到IKVM的bin目录下已经有了转换成功的json-simple-1.1.1.dll文件
既然知道了MiPush_SDK_Server_2_2_18.jar引用了json-simple-1.1.1.jar包那么我们在转换的时候也要指定引用,下面看我操作!
在这里我们要用到刚才生成的json-simple-1.1.1.dll还是上边用到的转换指令不过要指定引用加上-r参数后边是要引用的dll所在路径
ikvmc -target:library F:\sdk\MiPush_SDK_Server_2_2_18.jar -r:F:\ikvm-7.2.4630.5\bin\json-simple-1.1.1.dll
OK提示文件已经输出,有两个警告暂且忽略
现在两个dll已经转换完成,不过却并不是只添加这两个引用就完了,我这里先用反编译工具看了一下这个DLL都引用了哪些IKVM组件
现在看到这里只有这四个,好了现在在IKVM的bin目录下找到这几个文件和前面生成的两个dll
可以看到这些就是我们要引入到项目中的
注意,这并不能确定是不是引用完了,我们先写代码到底还少不少东西咱们下边接着看!
我这里用的WebAPI,先写一个来看看吧,具体参数什么的!自己去看官方文档吧,我就不详解了!我代码有注释凑合看吧!
代码是写完了只发安卓的出来吧,毕竟我代码垃圾不想献丑,到底能不能成功发送通知呢F5走起
public HttpResponseMessage Post() { try { Constants.useOfficial();//正式环境 //Constants.useSandbox();//测试环境,只针对IOS string messagePayload = "这是一个消息"; string title = "通知标题"; string description = "通知说明"+DateTime.Now; #region 安卓发送 Sender androidSender = new Sender("HGdyO*******QnCEGA==");//你的AppSecret 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.fawei.demo")//包名 .notifyType(new java.lang.Integer(1)) //使用默认提示音提示 .notifyType(new java.lang.Integer(2)) //使用默认震动 .notifyType(new java.lang.Integer(3)) //使用默认LED灯光 .timeToLive(3600000 * 336)//服务器默认保留两周(毫秒) //.extra("key", "value")//字符数不能超过1024最多十组 .build(); com.xiaomi.xmpush.server.Result androidPushResult = androidSender.broadcastAll(androidMsg, 3); #endregion result.rows = androidPushResult; } catch (Exception exception) { result = new Result(exception.Message); } return JsonHelper.ToJson(result); }
But,没那么容易我们看到还缺少了一个IKVM.OpenJDK.Text.dll引用,好了IKVM的bin下边找到它添加引用到项目中吧!
再来一次
看到了吗,终于成功了!
其实你也可以引用IKVM的bin下所有的dll文件,但是我并不想那么做.没有为什么,就是不想!
当然你也可以用这种方法调用其他的JAVA代码,如果你也Get到了那就分享给其他人吧!