关于uni-app 集成 uni-push1.0实现个推 IOS设备在线不推送问题【已解决】

概述

uni-app 推出了 uni-push2.0,但是2.0推送是需要收取费用,于是使用uni-push1.0版本。
测试发现 android 在线推送测试正常,ios在线推送测试接收不到,但是离线能接收到
在这里插入图片描述

API文档说明

uni-push1.0文档

前端代码

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的一天。

### Uni-app iOS 离线打包集成 uni-push 实现离线消息推送 #### 准备工作 为了成功完成iOS离线打包以及集成uni-push实现离线消息推送,开发者需先确保拥有个相应的账号配置。这是因为离线推送功能依赖于个的支持,在Xcode本地环境中需要进行特定的账户设置[^2]。 #### 创建项目与环境搭建 启动一个新的或现有的Uni-app项目,并确认该项目已经适配了iOS平台。接着安装`uni-push`插件至项目内,对于1.0版本的选择是因为考虑到成本因素而放弃免费服务有限制的2.0版[^1]。 #### Xcode配置 打开项目的`.xcworkspace`文件进入Xcode界面后,按照官方指引完成证书、描述文件等相关安全设定;同时引入必要的框架和库支持,特别是针对个SDK的部分,这一步骤至关重要以保障后续的消息传递机制能够顺利运作。 #### 修改Appdelegate.m 编辑位于`/nativeplugins/pushplugin/Classes/AppDelegate+PushPlugin.h`下的头文件,添加如下代码片段以便处理来自服务器的通知事件: ```objectivec #import <GetuiSdk/GTMessageProtocol.h> ``` 随后在对应的`.m`实现文件里加入以下内容来响应同的生命周期回调: ```objectivec - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [[GTMain sharedInstance] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; } -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ [[NSNotificationCenter defaultCenter] postNotificationName:@"kGTPushReceivedNotification" object:nil userInfo:[NSMutableDictionary dictionaryWithDictionary:userInfo]]; } ``` 以上操作使得应用程序能够在后台状态下接收到远程通知并作出适当反应。 #### 发送测试消息验证效果 最后利用云端脚本或者第三方工具模拟发送一条离线状态下的推送信息给目标设备,观察其能否正确抵达。如果一切正常,则表明整个流程设置无误[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值