1.我是做了ANDROID的UNIPUSH,没做IOS的,且只做了通知消息没用透传。所以以下说明只针对ANDROID。PUSH功能有2种方式接入APP,一种直接集成厂商SDK,缺点是厂商太多,工作量太大,另一种是集成第三方SDK,比如UNIPUSH,个推等,在线推送可以全品牌手机推送,缺点是目前离线厂商通道推送也仅支持部分厂商,UNIPUSH暂时只支持小米,华为,VIVO,OPPO,魅族。
2.UNIPUSH的接入流程
2.1UNIPUSH需要在DCLOUD的开发者中心注册APP,然后开通才能使用,目前只有应用所有者可以操作 Uni Push。应用协作者暂不支持。
2.1.1申请DCLOUD的账号后登录,首先创建应用,在HBUILDX中创建过的应用会自动出现在开发者中心的应用列表中
2.1.2点击应用--Uni Push ,填入相关信息申请开通UNIPUSH,APP在云打包时不建议用DCLOUD公用证书(我用的公用证书),如果用自有证书,在制作证书后,输入对应的SHA1指纹签名。Android包名必须与HBuilderX中App云端打包时配置的Android包名一致。
2.1.2.1自有证书制作首先安装JDK,随便找一个下载
2.1.2.3在CMD中运行 java -version 检查安装成功
2.1.2.4制作证书,输入命令:keytool -genkey -alias tomcat -keyalg RSA -keystore D:/tomcat.keystore -keypass 123456 -storepass 123456 -dname "CN=xingming,OU=danwei,O=zuzhi,L=shi,ST=sheng,C=CN" 后回车
命令中对应信息安装下图说明填写对应信息
2.1.2.4证书制作完后,输入命令查看证书,把得到的SHA1证书指纹填入开通UNIPUSH时的Android应用签名中。
2.1.3开通UNIPUSH后,在手机上安装APP,即可在UNIPUSH自助推送页面进行推送测试
推送消息分通知消息和透传消息,通知消息就是普通消息,类似微信聊天,点击后启动APP,透传消息需要自定义接收消息后的动作(我用的通知消息)。通知消息的CID需要APP在启动时获取,一个CID对应一个手机。
2.1.4开通UNIPUSH后,HBUILDERX的打包时也需要选中推送功能
2.1.5Uni Push 集成并统一了各个手机厂商的系统级推送,目前支持魅族、OPPO、华为、小米、VIVO。如果需要使用厂商推送,需要先在各厂商开发者平台申请。申请通过后厂商会提供推送的相关参数,需要将这些参数配置到 DCloud 开发者中心后台。厂商推送是应用在后台被杀死后无法收到推送时,为能及时收到推送而配置的。
2.2UNIPUSH使用
2.2.1客户端JSAPI
https://www.html5plus.org/doc/zh_cn/push.html
PUSH模块必须条件编译,我只用通知消息,没用透传消息,所以没有太多客户端代码,我在客户端获只取了客户端信息,在用户登录时将信息保存在数据库plus.push.getClientInfo()。其中获取到的CLIENT_ID就是2.1.3中WEB自助推送测试的CID。
使用PUSH模块,在打包时需要勾选PUSH
如果用透传消息,需要加 click 和 receive两个事件的监听,在receive之后自己创建消息,或者其他操作。
2.2.2服务端
UNIPUSH本质是VIP版的个推,所以服务器是参考个推的文档,个推的C#的SDK已经停止维护了,所以用的是RestApi。个推文档很详细,照做就行了。
贴点代码,webconfig里面配置好需要用的数据
async void Run()
{
HttpResponseMessage responesMessage = await GetTokenAsyn();
if (responesMessage == null || !responesMessage.IsSuccessStatusCode)
{
return;
}
string responesContent = await responesMessage.Content.ReadAsStringAsync();
JObject json = JObject.Parse(responesContent);
string token = json["data"]["token"].ToString();
PushInfoAsyn(token);
}
async Task<HttpResponseMessage> GetTokenAsyn()
{
HttpClient client = GetTokenHttpClient();
string data = GetTokenBody();
HttpResponseMessage responesMessage = await GetTokenByPost(client, data);
return responesMessage;
}
async Task<HttpResponseMessage> GetTokenByPost(HttpClient client, string data)
{
HttpContent content = new StringContent(data);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
HttpResponseMessage msg = await client.PostAsync(auth[0], content);
return msg;
}
async void PushInfoAsyn(string token)
{
var client = GetPushInfoHttpClient(token);
DataSet ds = new DataSet();
int n = GetNotice(ref ds);
if (n != 10 || ds.Tables[0].Rows.Count == 0)
{
return;
}
//个推接口规定,msg_list数组长度不能大于200
int m = ds.Tables[0].Rows.Count / 200;
for (int i = 1; i <= m + 1; i++)
{
DataTable dt = new DataTable();
dt = ds.Tables[0].AsEnumerable().Skip((i - 1) * 200).Take(200).CopyToDataTable();
int a = dt.Rows.Count;
DataSet dss = new DataSet();
dss.Tables.Add(dt);
string data = GetPushInfoBody(dss);
if (data == null)
{
return;
}
HttpResponseMessage responesMessage = await PushInfo(client, data);
if (!responesMessage.IsSuccessStatusCode)
{
return;
}
//返回信息暂未处理
string responesContent = await responesMessage.Content.ReadAsStringAsync();
}
}
string GetPushInfoBody(DataSet ds)
{
BaseData pushData;
//创建群推,通知参数
pushData = GetCIDBatchPushData(ds);
string data = JsonConvert.SerializeObject(pushData);
return data;
}
private CIDBatchPushData GetCIDBatchPushData(DataSet ds)
{
string request_id = Guid.NewGuid().ToString("N");
List<PushData> msg_list = new List<PushData>();
foreach (DataRow dr in ds.Tables[0].Rows)
{
SinglePushData sd = new SinglePushData()
{
request_id = request_id,
settings = new Settings()
{
ttl = int.Parse(ttl[0]),
strategy = new Strategy()
{
Default = int.Parse(Default[0])
}
},
audience = new Audience()
{
cid = new string[] { dr["CLIENT_ID"].ToString() }
},
push_message = new Push_message()
{
notification = new GetuiNotification()
{
title = dr["CAPTION"].ToString(),
body = dr["CONTENT"].ToString(),
click_type = "startapp",
channel_level = 4
}
},
push_channel = new Push_channel()
{
android = new AndroidNotification()
{
ups = new UpsNotification()
{
notification = new ChangshangNotification()
{
title = dr["CAPTION"].ToString(),
body = dr["CONTENT"].ToString(),
click_type = "startapp",
channel_level = 4
}
}
}
}
};
msg_list.Add(sd);
}
CIDBatchPushData pushData = new CIDBatchPushData()
{
is_async = false,
msg_list = msg_list
};
return pushData;
}
async Task<HttpResponseMessage> PushInfo(HttpClient client, string data)
{
string[] PushUrl;
//CID群推接口地址
PushUrl = CIDBatchPushUrl;
HttpContent content = new StringContent(data);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
HttpResponseMessage msg = await client.PostAsync(PushUrl[0], content);
return msg;
}
2.2.3厂商通道的配置
所有的厂商配置都是一个套路,首先在对应厂商的开放平台创建应用,然后开通PUSH。华为需要多设置SHA256签名指纹,VIVO和OPPO需要先上架才能开通PUSH。
2.2.3.1小米
1) 首先在小米开发平台注册账号,登录后点击进入小米应用商店
2) 然后创建应用
4) 进入PUSH页面,开通小米PUSH功能
应用必须上架之后,推送权限才是正式,否则只是测试权限
点击应用信息把相关信息填入UNIPUSH厂商参数设置页面
2.2.3.5 OPPO
OPPO和VIVO一样需要应用上架才能开通PUSH,流程都差不多,但是OPPO上架审核需要软著,很麻烦,所以没弄OPPO
2.3开发过程中的一些问题
1) 厂商通道
在UNIPUSH官方文档中说,使用厂商推送必须设置INTENT,这个INTENT是透传消息的一个参数,是走厂商通道找到APP并且传递参数用的(我的理解,不知道对不对)。
然后还有
而事实上我走厂商通道并没有用透传消息,也没设置INTENT依然好用,不知道是不是因为官方文档是旧的,或者是因为不是集成个推SDK,而是用的RESTAPI。个推的客服虽然说走厂商通道建议用透传消息,但是同时也说,目前厂商通道也支持通知消息。各厂商的客服也都说厂商通道只支持通知消息,或许个推在接收透传消息后转成通知消息发给厂商?这个具体不清楚,反正我只用通知消息,没设置INTENT,并且好用。
2)所有的注册包名必须和云打包的包名一样,调试时不打包的话,用自定义基座也好用。
3)华为厂商通道
在华为手机上必须安装“华为移动服务”才能使用华为的厂商推送通道,首先确保手机上已经安装“华为移动服务”应用。
华为移动服务可以在华为手机应用市场中搜索和安装,一般不需要特意安装,因为华为手机中一些已有应用如果需要使用会自动安装华为移动服务。
如果在华为手机应用退出后无法接收到推送消息,可尝试以下操作:
* 更新“华为移动服务”到最新版本
* 进入手机“设置”,在[应用和通知]->[应用管理]->[华为移动服务]->[存储]页面选择“删除数据”。重新启动应用,退出后再下发推送消息
。
4)在UNIPUSH填写厂商设置时注意字符串不要多复制空格,我就多个空格,卡住好久
5)每次设置有更改,需要重新打包,有时候忘打包了,就一直不好用
6)厂商通道测试要用真机,模拟器不好用
7)HBUILDERX连接模拟器调试有时候检测不到,或者经常断掉,我用的夜神模拟器,在安装路径找nox文件,5555 对应的就是这台设备的端口。
在HBUILDERX安装目录找到adb.exe。在CMD中运行
adb devices 查看当前连接的设备
adb connect 127.0.0.1:62001 手动连接
设备就出现在运行到手机列表中
8)网站上的设置不是设置完立即生效,一般需要等10来分钟才生效
9)手机上应用通知权限需要开启,震动,可以打扰,重要通知,角标通知之类的设置都是在个人手机上设置。手机时间也需要正确设置。
10)VIVO通知文案中不能带 “包含测试、test字符”、“纯数字”、“纯表情”、“符号”或者“符号+数字”、“表情+数字”、“表情+符号” 。
11)官方说华为必须用自有证书,实际上我用公用证书也好用