macOS使用ObjC设置MPNowPlayingInfoCenter播放信息无效果求助
问题原因与修复方案
核心问题1:缺少应用Bundle标识
macOS的MPNowPlayingInfoCenter仅会同步拥有合法Bundle ID的应用的播放信息,你当前写的是纯命令行可执行文件,没有捆绑Info.plist配置,系统无法识别你的应用身份,自然不会展示你设置的内容。
修复方式
两种方案二选一即可:
- 方案1:用Xcode创建Cocoa App项目,把逻辑写到
AppDelegate的applicationDidFinishLaunching:方法里,项目会自动生成带Bundle ID的Info.plist - 方案2:手动给命令行可执行文件附带Info.plist,编译时注入配置:
新建Info.plist文件,核心要包含CFBundleIdentifier字段,示例如下:
编译时添加参数:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleIdentifier</key> <string>com.yourname.testmediaplayer</string> <key>CFBundleName</key> <string>TestMediaPlayer</string> </dict> </plist>clang -fobjc-arc -framework Foundation -framework AppKit -framework MediaPlayer main.m -o TestMediaPlayer -sectcreate __TEXT __info_plist Info.plist
核心问题2:主事件循环未运行
你当前用scanf阻塞主线程,Cocoa的NSRunLoop没有启动,MPNowPlayingInfoCenter和系统的通信依赖主RunLoop分发事件,阻塞状态下更新请求无法发送到系统服务。
修复方式
把代码里的scanf相关逻辑替换成启动主RunLoop的代码:
// 删掉原来的scanf相关代码,替换为以下内容 [[NSRunLoop mainRunLoop] runUntilDate:[NSDate distantFuture]];
额外调试与优化建议
- 赋值完成后先打印
[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo的内容,确认字典没有空值、字段类型正确,比如MPMediaItemPropertyPersistentID是整数类型,你当前用numberWithFloat传值建议改成numberWithInteger避免类型不匹配 - 调试时暂时退出其他正在运行的播放类应用(比如苹果音乐、Spotify),避免优先级更高的播放源覆盖你的展示内容
- macOS 13+可以在系统「控制台.app」里搜索
nowplaying关键词,查看系统服务有没有收到你应用的播放信息更新请求 - 后续做Rust绑定时也要注意两个核心前提:应用要有合法Bundle ID、主RunLoop正常运行,否则哪怕ObjC逻辑正确,Rust侧运行也会出现同样的不展示问题
内容的提问来源于stack exchange,提问作者Dm3Ch
相关产品推荐
相关产品推荐

