https://ext.dcloud.net.cn/plugin?id=7482官方插件ios uni-app出现bug

https://ext.dcloud.net.cn/plugin?id=7482官方插件ios uni-app出现bug

项目 内容
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 10
HBuilderX类型 正式
HBuilderX版本号 5.07
手机系统 iOS
手机系统版本号 iOS 26
手机厂商 苹果
手机机型 13
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

bug描述:

ios离线收不到铃声只有推送,已经云打包了。在线都正常

示例代码:

use strict';
// const uniPush = uniCloud.getPushManager({appId:"xxxxx"}) //注意这里需要传入你的应用appId  

const CLUE_NOTICE_TYPES = [xx, x];
const IOS_PUSH_SOUND = 'xxx.caf';
const DEFAULT_XM_CHANNEL_ID = 'xxx';  

function getPushMeta(payload) {
if (!payload) {
return null;
}  

if (Number(payload.moduleType) === 2000 && CLUE_NOTICE_TYPES.indexOf(Number(payload.noticeType)) !== -1) {
return {
ringCode: 'clue_audio1',
androidChannelId: 'xxxx',
iosSound: IOS_PUSH_SOUND
};
}    

return null;
}  

function normalizePushOptions(options, pushMeta) {
if (!options) {
return options;
}  

const nextOptions = Object.assign({}, options);    

if (nextOptions.HW) {
const nextHWOptions = Object.assign({}, nextOptions.HW);
delete nextHWOptions['/message/android/notification/default_sound'];
delete nextHWOptions['/message/android/notification/channel_id'];
delete nextHWOptions['/message/android/notification/sound'];
delete nextHWOptions['/message/android/notification/importance'];
nextOptions.HW = nextHWOptions;
}    

// 非特殊铃声类型时,移除小米自定义声音配置,只保留默认通知通道。
if (!pushMeta && nextOptions.XM) {
nextOptions.XM = {
'/extra.channel_id': DEFAULT_XM_CHANNEL_ID
};
}    

return nextOptions;
}  

exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
let body = event.body;
if (event.isBase64Encoded) {
body = Buffer.from(body);
}  

if(!body) {    
    return { message: 'no body'};    
}    
const param = JSON.parse(body);    
const pushMeta = getPushMeta(param.payload);    
const payload = Object.assign({}, param.payload || {}, pushMeta || {});    
const options = normalizePushOptions(param.options, pushMeta);    
const sound = pushMeta && pushMeta.iosSound;    
 // 云函数是通用的,和项目没有直接的关系。通过传递 appId,可以为多个项目进行推送    
    const uniPush = uniCloud.getPushManager({    
        appId: param.appId    
    });    
    const message = {    
        "push_clientid": param.push_clientid,    
        "title": param.title,    
        "content": param.content,    
        "payload": payload,    
        "force_notification": false,    
        "request_id": param.request_id,    
        "badge": param.badge,    
        "options": options,    
    };    

    if (sound) {    
        message.sound = sound;    
    }    

    return await uniPush.sendMessage(message);    

//返回数据给客户端
return event
};

更多关于https://ext.dcloud.net.cn/plugin?id=7482官方插件ios uni-app出现bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

欢迎到专业群( uniCloud 官方技术交流群 ) 咨询,群中有相关专业的管理员和群友。

好的,作为 DCloud 官方人员,我来对这个 bug 反馈进行评审。
关于 Bug 反馈的完整性:

标题与描述:标题比较明确,指向了官方插件在 iOS 离线场景下的问题。描述中提到“ios离线收不到铃声只有推送,已经云打包了。在线都正常”,这点很关键,清晰指出了问题发生的具体场景(离线)和对比情况(在线正常),我能理解开发者想要表达的核心意思。

代码示例:提供的云函数代码片段基本完整,展示了如何构造 sendMessage 的参数,特别是如何设置 sound 字段:
if (sound) {
message.sound = sound;
}

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码 这部分逻辑是正确的。代码中 IOS_PUSH_SOUND = ‘xxx.caf’ 也说明了开发者知道需要指定铃声文件。这部分代码对于分析问题是有帮助的。

复现步骤:“直接推送离线没铃声”过于简单。虽然结合描述和代码能推断出操作,但一个更完整的复现步骤应该包括:如何触发推送、如何使 App 进入离线状态、以及最终观察到的现象。

预期与实际结果:预期是“需要铃声”,实际是“没有铃声”,两者对比清晰,能明确表达这是一个功能未按预期工作的问题。实际结果属于不正常现象,不是误报。

分类信息:提供了 HBuilderX 版本号(5.07)、手机系统(iOS 26)、设备型号(13)等,这些信息对排查问题很有帮助。版本信息基本完整。

综合来看:这个反馈的质量还是不错的,核心问题描述清晰,也附带了有参考价值的服务端代码。如果能在复现步骤上再详细一些就更好了,但现有信息已经足够我进行初步判断。

关于 Bug 是否成立:
根据知识库检索,关于 iOS 离线推送自定义铃声,文档中有明确说明:

“实现推送铃声功能,本功能 App 客户端依赖 uni 原生插件【自定义推送铃声和渠道】,注意需要打包后生效。铃声文件建议 iOS 和 Android 铃声使用一致的文件名称,直接填写文件名,不含扩展名;如:pushsound.caf 或 pushsound.mp3,直接填写 pushsound 即可。”

结合开发者提供的代码,我发现了一个关键问题点:
在云函数中,开发者设置的 sound 值是 IOS_PUSH_SOUND,其定义为 ‘xxx.caf’。而根据文档要求,sound 字段应该填写文件名,不含扩展名。也就是说,如果铃声文件是 xxx.caf,那么在调用 sendMessage 时,sound 参数应该传入 ‘xxx’,而不是 ‘xxx.caf’。
这是一个配置细节上的偏差。sound 参数传入 ‘xxx.caf’ 很可能导致系统无法正确匹配到铃声文件,从而造成离线推送时只有横幅通知而没有播放自定义铃声。因此,这个 bug 很可能是因为服务端参数设置不当造成的。

关于基本概念问题:
这个问题本身不涉及基本概念错误,开发者的使用场景(uni-app + uniCloud + uniPush + iOS 原生插件)是完全正确的技术栈,代码逻辑也基本合理,只是在参数细节上需要修正。

总结与建议:
开发者你好,你反馈的 iOS 离线推送无铃声问题,我这边排查后认为很可能是服务端 sendMessage 接口中 sound 参数设置的问题。
根据 uni-push 的服务端 API 文档,sound 字段用于指定推送铃声,填写时只填文件名,不包含扩展名。

你的代码中 sound 被设置为 ‘xxx.caf’。
标准做法应该是设置为 ‘xxx’。

当传入的值与实际文件名匹配不上时,离线推送可能会回退到系统默认行为(只有通知没有铃声)。建议你修改云函数,将 sound 的值改为不带扩展名的 ‘xxx’,然后重新测试离线场景。
相关文档可以参考这里:uni-push 服务端 API - 实现推送铃声
你可以先尝试这个修改,如果问题仍然存在,我们再进一步排查其他可能性。 内容为 AI 生成,仅供参考

更多关于https://ext.dcloud.net.cn/plugin?id=7482官方插件ios uni-app出现bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html


来人啊 解决一下吧

‘use strict’; // const uniPush = uniCloud.getPushManager({appId:""}) // 注意这里需要传入你的应用appId
const CLUE_NOTICE_TYPES = [, ]; const IOS_PUSH_SOUND = ‘’; const DEFAULT_XM_CHANNEL_ID = ‘’;
function getPushMeta(payload) { if (!payload) { return null; }
if (Number(payload.moduleType) === 2000 && CLUE_NOTICE_TYPES.indexOf(Number(payload.noticeType)) !== -1) {
return {
ringCode: '
’,
androidChannelId: ‘**’,
iosSound: IOS_PUSH_SOUND
};
}

return null;
}
function normalizePushOptions(options, pushMeta) { if (!options) { return options; }
const nextOptions = Object.assign({}, options);

if (nextOptions.HW) {
const nextHWOptions = Object.assign({}, nextOptions.HW);
delete nextHWOptions[’/message/android/notification/default_sound’];
delete nextHWOptions[’/message/android/notification/channel_id’];
delete nextHWOptions[’/message/android/notification/sound’];
delete nextHWOptions[’/message/android/notification/importance’];
nextOptions.HW = nextHWOptions;
}

// 非特殊铃声类型时,移除小米自定义声音配置,只保留默认通知通道。
if (!pushMeta && nextOptions.XM) {
nextOptions.XM = {
‘/extra.channel_id’: DEFAULT_XM_CHANNEL_ID
};
}

return nextOptions;
}
exports.main = async (event, context) => { // event为客户端上传的参数 console.log('event : ', event) let body = event.body; if (event.isBase64Encoded) { body = Buffer.from(body); }
if (!body) {
return { message: ‘no body’ };
}
const param = JSON.parse(body);
const pushMeta = getPushMeta(param.payload);
const payload = Object.assign({}, param.payload || {}, pushMeta || {});
const options = normalizePushOptions(param.options, pushMeta);
const sound = pushMeta && pushMeta.iosSound;

// 云函数是通用的,和项目没有直接的关系。通过传递 appId, 可以为多个项目进行推送
const uniPush = uniCloud.getPushManager({
appId: param.appId
});

const message = {
“push_clientid”: param.push_clientid,
“title”: param.title,
“content”: param.content,
“payload”: payload,
“force_notification”: false,
“request_id”: param.request_id,
“badge”: param.badge,
“options”: options,
};

if (sound) {
message.sound = sound;
}

return await uniPush.sendMessage(message);

// 返回数据给客户端
return event
};

你的问题解决了吗?你最后贴的代码是解决方案?

没有解决,基座是好的,经测试基座没问题我ios也早就打基座了,但是我正式打包是用windos电脑(插件已经导入了)直接云打包的ios,现在怀疑第二次绑定同一个服务空间id 没生效。已确认生产安装包为UNI_xxx.ipa,并已成功上传到 App Store Connect / TestFlight 已确认该ipa包内存在Payload/xxx.app/pushsound.caf测试环境离线推送点击日志中已明确拿到aps.sound = “pushsound.caf”,说明代码链路和包内铃声资源本身是正常的 生产环境当前现象是:可以收到 iOS 离线推送,但没有自定义铃声 因此目前基本可排除:前端推送代码本身错误 pushsound.caf未打进包 上传到 TestFlight 的包版本错误 当前最可疑的是:生产实际推送下发内容与测试环境不一致 生产推送链路/生产环境下sound未最终生成为 APNs 的aps.sound或生产环境系统实际收到的通知虽能展示,但未按自定义声音处理

负责的人员测试基座没问题,确实是基座没问题,我基座也没问题,但是生产不行。我怀疑我生产没有打包进去,但是查看ios的操作日志 经过uniagent排查确实是打包进去了。

经和DCloud_iOS_ZFL 大佬 我们排查,目前推出可能是apple的apns稳定性问题。我一行代码和云服务代码没改,前几天测试死活不行,今天测试居然好了。怀疑是苹果自己内部的问题。感谢官方大佬帮忙解决

解决方案:基座没问题,生产有问题大概率是apple的apns稳定性问题 我等待了几天测试是好的

回到顶部