1***@163.com
1***@163.com
  • 发布:2026-06-15 17:15
  • 更新:1 分钟前
  • 阅读:37

【报Bug】https://ext.dcloud.net.cn/plugin?id=7482官方插件ios 出现bug

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 10

HBuilderX类型: 正式

HBuilderX版本号: 5.07

手机系统: iOS

手机系统版本号: iOS 26

手机厂商: 苹果

手机机型: 13

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

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
};

操作步骤:

直接推送离线没铃声

预期结果:

需要铃声

实际结果:

没有铃声

bug描述:

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

2026-06-15 17:15 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

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

好的,作为 DCloud 官方人员,我来对这个 bug 反馈进行评审。

关于 Bug 反馈的完整性:

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

  2. 代码示例:提供的云函数代码片段基本完整,展示了如何构造 sendMessage 的参数,特别是如何设置 sound 字段:

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

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

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

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

  5. 分类信息:提供了 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 生成,仅供参考
1***@163.com

1***@163.com (作者)

来人啊 解决一下吧

1***@163.com

1***@163.com (作者)

'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  

};

要回复问题请先登录注册