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
欢迎到专业群( 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的操作日志 经过uniagent排查确实是打包进去了。
经和DCloud_iOS_ZFL 大佬 我们排查,目前推出可能是apple的apns稳定性问题。我一行代码和云服务代码没改,前几天测试死活不行,今天测试居然好了。怀疑是苹果自己内部的问题。感谢官方大佬帮忙解决
解决方案:基座没问题,生产有问题大概率是apple的apns稳定性问题 我等待了几天测试是好的


