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
};
3 个回复
Ask小助手
好的,作为 DCloud 官方人员,我来对这个 bug 反馈进行评审。
关于 Bug 反馈的完整性:
标题与描述:标题比较明确,指向了官方插件在 iOS 离线场景下的问题。描述中提到“ios离线收不到铃声只有推送,已经云打包了。在线都正常”,这点很关键,清晰指出了问题发生的具体场景(离线)和对比情况(在线正常),我能理解开发者想要表达的核心意思。
代码示例:提供的云函数代码片段基本完整,展示了如何构造
sendMessage的参数,特别是如何设置sound字段:复现步骤:“直接推送离线没铃声”过于简单。虽然结合描述和代码能推断出操作,但一个更完整的复现步骤应该包括:如何触发推送、如何使 App 进入离线状态、以及最终观察到的现象。
预期与实际结果:预期是“需要铃声”,实际是“没有铃声”,两者对比清晰,能明确表达这是一个功能未按预期工作的问题。实际结果属于不正常现象,不是误报。
分类信息:提供了 HBuilderX 版本号(5.07)、手机系统(iOS 26)、设备型号(13)等,这些信息对排查问题很有帮助。版本信息基本完整。
综合来看:这个反馈的质量还是不错的,核心问题描述清晰,也附带了有参考价值的服务端代码。如果能在复现步骤上再详细一些就更好了,但现有信息已经足够我进行初步判断。
关于 Bug 是否成立:
根据知识库检索,关于 iOS 离线推送自定义铃声,文档中有明确说明:
结合开发者提供的代码,我发现了一个关键问题点:
在云函数中,开发者设置的
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 - 实现推送铃声
你可以先尝试这个修改,如果问题仍然存在,我们再进一步排查其他可能性。
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;
}
}
function normalizePushOptions(options, pushMeta) {
if (!options) {
return options;
}
}
exports.main = async (event, context) => {
// event为客户端上传的参数
console.log('event : ', event)
let body = event.body;
if (event.isBase64Encoded) {
body = Buffer.from(body);
}
};
要回复问题请先登录或注册
公告
更多>相关问题