概述
uni-app 推出了 uni-push2.0,但是2.0推送是需要收取费用,于是使用uni-push1.0版本。
测试发现 android 在线推送测试正常,ios在线推送测试接收不到,但是离线能接收到。
API文档说明
前端代码
ios不能直接弹出通知消息,所以需要在App.vue页面的onLaunch调用以下代码
//显示本地通知
plus.push.addEventListener("receive", function(msg) {
plus.push.createMessage(msg.content, msg.payload, {
title: msg.title
});
})
//点击事件
plus.push.addEventListener("click", (payload) => {
uni.reLaunch({
url: '/pages/index'
})
});
SDK集成
个推服务端 SDK 的主要目标是提升开发者在服务端集成个推推送服务的开发效率。 开发者不需要进行复杂编程即可使用个推推送服务的各项常用功能,SDK 可以自动帮您满足调用过程中所需的鉴权、组装参数、发送HTTP请求等非功能性要求,目前仅支持 Java 和 PHP 语言。
在使用以下代码前请先查看 个推服务端 Java SDK ,配置使用最新版 SDK 。若您想查看详细的字段描述,或者想集成 PHP SDK 可查看:服务端 RestAPI V2 。
后端使用java 这里是API提供的文档示例
import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.GtApiConfiguration;
import com.getui.push.v2.sdk.api.PushApi;
import com.getui.push.v2.sdk.common.ApiResult;
import com.getui.push.v2.sdk.dto.req.Audience;
import com.getui.push.v2.sdk.dto.req.Settings;
import com.getui.push.v2.sdk.dto.req.message.PushChannel;
import com.getui.push.v2.sdk.dto.req.message.PushDTO;
import com.getui.push.v2.sdk.dto.req.message.PushMessage;
import com.getui.push.v2.sdk.dto.req.message.android.AndroidDTO;
import com.getui.push.v2.sdk.dto.req.message.android.ThirdNotification;
import com.getui.push.v2.sdk.dto.req.message.android.Ups;
import com.getui.push.v2.sdk.dto.req.message.ios.Alert;
import com.getui.push.v2.sdk.dto.req.message.ios.Aps;
import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO;
import java.util.Map;
public class UnipushTest {
public static void main(String[] args) {
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
//填写应用配置,参数在“Uni Push”下的“应用配置”页面中获取
apiConfiguration.setAppId("请填写AppId");
apiConfiguration.setAppKey("请填写AppKey");
apiConfiguration.setMasterSecret("请填写MasterSecret");
apiConfiguration.setDomain("https://restapi.getui.com/v2/");
// 实例化ApiHelper对象,用于创建接口对象
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
// 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
PushApi pushApi = apiHelper.creatApi(PushApi.class);
//根据cid进行单推
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
// 设置推送参数,requestid需要每次变化唯一
pushDTO.setRequestId(System.currentTimeMillis() + "");
Settings settings = new Settings();
pushDTO.setSettings(settings);
//消息有效期,走厂商消息必须设置该值
settings.setTtl(3600000);
//在线走个推通道时推送的消息体
PushMessage pushMessage = new PushMessage();
pushDTO.setPushMessage(pushMessage);
//此格式的透传消息由 unipush 做了特殊处理,会自动展示通知栏。开发者也可自定义其它格式,在客户端自己处理。
pushMessage.setTransmission(" {title:\"标题\",content:\"内容\",payload:\"自定义数据\"}");
// 设置接收人信息
Audience audience = new Audience();
pushDTO.setAudience(audience);
audience.addCid("请填写cid");
//设置离线推送时的消息体
PushChannel pushChannel = new PushChannel();
//安卓离线厂商通道推送的消息体
AndroidDTO androidDTO = new AndroidDTO();
Ups ups = new Ups();
ThirdNotification thirdNotification = new ThirdNotification();
ups.setNotification(thirdNotification);
thirdNotification.setTitle("安卓离线展示的标题");
thirdNotification.setBody("安卓离线展示的内容");
thirdNotification.setClickType("intent");
//注意:intent参数必须按下方文档(特殊参数说明)要求的固定格式传值,intent错误会导致客户端无法收到消息
thirdNotification.setIntent("请填写固定格式的intent");
androidDTO.setUps(ups);
pushChannel.setAndroid(androidDTO);
//ios离线apn通道推送的消息体
Alert alert = new Alert();
alert.setTitle("苹果离线通知栏标题");
alert.setBody("苹果离线通知栏内容");
Aps aps = new Aps();
aps.setContentAvailable(0);
aps.setSound("default");
aps.setAlert(alert);
IosDTO iosDTO = new IosDTO();
iosDTO.setAps(aps);
iosDTO.setType("notify");
pushChannel.setIos(iosDTO);
pushDTO.setPushChannel(pushChannel);
// 进行cid单推
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
if (apiResult.isSuccess()) {
// success
System.out.println(apiResult.getData());
} else {
// failed
System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
}
}
}
== 经过真机调试发现 是这部分代码有问题 ==
pushMessage.setTransmission(" {title:\"标题\",content:\"内容\",payload:\"自定义数据\"}");
解决方法
修改示例代码
pushMessage.setTransmission("{\"title\":\"标题\",\"content\":\"内容\",\"payload\":\"自定义数据\"}");
保存后推送IOS设备在线时能接收到推送了。
又是找BUG的一天。