MusicBox
原生 macOS 网易云音乐播放器,使用 SwiftUI、AVPlayer 和 Liquid Glass。需要 macOS 26 或更新版本,支持 Apple silicon 和 Intel Mac。
安装与更新
从 Releases 下载 MusicBox-版本号.zip,解压后将 MusicBox.app 拖入「应用程序」。
正式版通过 Developer ID 签名和 Apple 公证。应用默认每天检查更新,发现新版后提示安装,也可以从 MusicBox 菜单选择「检查更新」。更新包通过 Sparkle EdDSA 签名验证。
旧的未签名版本和 nightly 用户需要先手动安装一次新的正式版,以切换到新的更新源。不要对正式版执行临时重签名或移除隔离属性的脚本。
功能
- 网页登录网易云音乐,浏览每日推荐、个人歌单、收藏和搜索结果。
- 播放在线歌曲和云盘音乐,支持上传、匹配及管理云盘文件。
- 播放时渐进式缓存,支持循环、随机、单曲循环和「下一首播放」队列。
- 同步歌词、翻译和罗马音。
- 媒体键、系统正在播放信息、AirPlay 和可配置的播放时防休眠。
- 保存播放队列、进度和音量;关闭窗口后应用继续运行。
歌曲可用性和音质取决于网易云账号权限。音频缓存位于 ~/Music/MusicBox。
截图



开发
使用 Xcode 26 或更新版本打开 MusicBox.xcodeproj。本地构建保留项目的自动 Apple Development 签名配置。
xcodebuild -project MusicBox.xcodeproj -scheme MusicBox -configuration Debug build
xcodebuild -project MusicBox.xcodeproj -scheme MusicBox -configuration Debug test
发布
主分支和 Pull Request 运行测试,不再覆盖 nightly Release。推送 v主.次.修订 格式的 tag(例如 v1.1.0)会运行测试、构建通用架构应用、签名并公证,随后创建正式 GitHub Release。tag 版本必须高于已发布的正式版;不接受预发布后缀或重复发布。
发布任务串行排队,连续推送 tag 不会取消已有的等待任务;GitHub 最多保留 100 个等待任务。
先在仓库 Settings → Secrets and variables → Actions 配置以下 Repository secrets:
| Secret | 内容 |
|---|---|
BUILD_CERTIFICATE_BASE64 |
含私钥的 Developer ID Application 证书 .p12 的 Base64 内容;不是 Apple Development 或 Apple Distribution 证书 |
P12_PASSWORD |
导出 .p12 时设置的密码 |
APPLE_ID |
开发者 Apple Account 邮箱 |
APPLE_APP_SPECIFIC_PASSWORD |
该账号生成的 App 专用密码,用于 notarytool 公证 |
SPARKLE_PRIVATE_KEY |
Sparkle generate_keys -x 导出的私钥文件内容,不要再做 Base64 编码 |
Developer ID 证书需要在 Xcode 或 Apple Developer 后台创建并导出为包含私钥的 .p12。公证使用的 Team ID 从证书读取,不改变本地工程的签名团队。
Sparkle 工具在解析依赖后的 DerivedData/SourcePackages/artifacts/sparkle/Sparkle/bin/ 中。已有私钥应继续沿用;generate_keys -p 输出必须与 MusicBox/Info.plist 的 SUPublicEDKey 一致。将导出的私钥保存到 Secret 后删除导出文件,并另行安全备份;不要提交证书、密码或私钥。
# 在包含最新发布配置的提交上创建 tag,替换为实际新版本号。
git tag v1.1.0
git push origin v1.1.0
Release 附件包含应用 ZIP、dSYM ZIP 和自动生成的 appcast.xml。更新源固定为:
https://github.com/zeyugao/MusicBox/releases/latest/download/appcast.xml
版本号同时写入 CFBundleShortVersionString、CFBundleVersion 和 appcast;下载地址固定到该 tag。所有附件先上传到草稿 Release,成功后才公开并设为 Latest,因此不会先切换更新源再上传应用。无需部署网页或让 CI 提交生成文件回主分支。
发布失败时,先检查 Actions 日志。若留下了同名草稿,修复配置后删除该草稿,再重跑失败任务;已公开的版本使用新 tag 发布,不覆盖旧包或签名。
致谢
- CachingPlayerItem:音频缓存。
- Sparkle:自动更新。
- YesPlayMusic:Logo。