1***@163.com
1***@163.com
  • 发布:2026-06-15 16:58
  • 更新:2026-06-15 17:00
  • 阅读:23

官方的自定义铃声插件ios 离线无效,官方插件地址。

分类:uni-app

有没有大哥接过的,求求了云函数是这样,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  

};

2026-06-15 16:58 负责人:无 分享
已邀请:
1***@163.com

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

在线可以离线就是不行

Ask小助手

Ask小助手

看到你的代码和问题,iOS 离线推送自定义铃声不生效,这是个常见问题。我们来逐步排查。

核心问题定位

你的云函数代码逻辑看起来是正确的,问题很可能出在 iOS 端的配置 上。

iOS 离线推送自定义铃声的必要条件

1. 插件配置检查

你使用的是官方的 自定义推送铃声和渠道 插件,iOS 端需要特别注意:

  • 铃声文件必须放在正确位置:在项目根目录的 nativeplugins/DCloud-PushSound/ios/ 目录下,放入铃声文件
  • 铃声文件必须是 .caf 格式,且时长不超过 30 秒
  • 如果使用云端插件方式,默认铃声文件名必须是 pushsound.caf

2. 音频文件转换(仅 Mac 系统)

如果你在 Windows 上开发,需要找工具将音频转为 caf 格式。Mac 系统终端命令:

afconvert 提示音.m4r pushsound.caf -d ima4 -f caff -v

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

3. 多个音频文件配置

如果你需要使用多个不同的铃声文件(如你的代码中有 ringCode 逻辑),需要:

  • 下载插件离线包
  • 将多个音频文件放到 nativeplugins/DCloud-PushSound/ios/ 目录
  • 编辑插件目录中的 package.json,在 resource 节点中填写音频文件名称
  • 使用本地插件方式勾选

4. 云函数中 sound 字段

你的云函数中 iosSound 的值是 xxx.caf,确保:

  • 这个文件名与实际放入插件的音频文件名完全一致(包括扩展名 .caf
  • 推送时 sound 字段的值应该是完整的文件名,如 "sound": "xxx.caf"

你的代码检查

看你的云函数逻辑:

const sound = pushMeta && pushMeta.iosSound;  
if (sound) {  
    message.sound = sound;  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

这部分逻辑没问题,会正确设置 sound 字段。但请确认:

  1. IOS_PUSH_SOUND = 'xxx.caf' 这个文件名与实际放入插件的文件名完全一致
  2. CLUE_NOTICE_TYPESmoduleType 的判断逻辑是否正确触发

排查步骤

  1. 确认插件已正确打包:云打包时是否勾选了该插件?打自定义基座测试
  2. 检查铃声文件:确认 nativeplugins/DCloud-PushSound/ios/ 目录下有正确的 .caf 文件
  3. 测试推送:先用固定 sound 值测试,排除条件判断问题
  4. 查看推送日志:检查 uniPush 控制台的推送记录,确认 sound 字段是否正确传递

已知限制

根据社区反馈,iOS 离线推送的自定义铃声必须通过 APNs 的 sound 字段传递,且铃声文件必须预置在 App 包中。在线推送可以通过前端 uni.createPushMessage 配合 uni.createInnerAudioContext 播放自定义音频,但离线推送只能依赖 APNs 的 sound 配置。

如果以上步骤都确认无误仍不生效,建议检查:

  • iOS 设备的通知设置中是否允许了该 App 的声音提醒
  • 是否使用了正确的证书环境(开发/生产)

需要我进一步帮你检查哪个环节吗?

内容为 AI 生成,仅供参考

要回复问题请先登录注册