mcpField
A
axiom-now-playing-carplay

axiom-now-playing-carplay

github.com/charleswiltgen开发1.2k164 次安装今天更新
代码仓库

关于 axiom-now-playing-carplay

面向 iOS 开发者的 CarPlay 音频集成与排障技能,说明如何复用现有的播放信息和远程控制设置,并涵盖权限、界面配置与测试。

主要功能

  1. 01复用 MPNowPlayingInfoCenter 和 MPRemoteCommandCenter
  2. 02配置 CPNowPlayingTemplate 控件
  3. 03检查 CarPlay 音频权限要求
  4. 04排查元数据、封面和按钮问题
  5. 05使用 CarPlay 模拟器测试

适用场景

  1. 01为现有音频应用添加 CarPlay 支持
  2. 02排查 Now Playing 元数据或封面缺失
  3. 03检查 CarPlay 中的播放控制
  4. 04对比连接与未连接调试器时的行为

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/charleswiltgen/axiom --skill axiom-now-playing-carplay

安装后在 Claude Code 中输入/axiom-now-playing-carplay确认已加载。

详细介绍

CarPlay 集成

耗时:15-20 分钟(如果 MPNowPlayingInfoCenter 已正常工作)

关键要点

CarPlay 使用与锁定屏幕和控制中心相同的 MPNowPlayingInfoCenter 和 MPRemoteCommandCenter。 如果你的“正在播放”集成在 iOS 上正常工作,那么它在 CarPlay 中也会自动生效,无需添加任何代码。

CarPlay 会读取什么

iOS 组件CarPlay 显示内容
MPNowPlayingInfoCenter.nowPlayingInfoCPNowPlayingTemplate 元数据(标题、艺术家、封面图)
MPRemoteCommandCenter 处理程序CPNowPlayingTemplate 按钮响应
nowPlayingInfo 中的封面图CarPlay UI 中的专辑封面

无需 CarPlay 专用元数据。现有代码即可正常工作。

CPNowPlayingTemplate 自定义(iOS 14+)

如需使用标准播放/暂停/跳过之外的自定义播放控制:

import CarPlay

@MainActor
class SceneDelegate: UIResponder, UIWindowSceneDelegate, CPTemplateApplicationSceneDelegate {

    func templateApplicationScene(
        _ templateApplicationScene: CPTemplateApplicationScene,
        didConnect interfaceController: CPInterfaceController
    ) {
        // ✅ Configure CPNowPlayingTemplate at connection time (not when pushed)
        let nowPlayingTemplate = CPNowPlayingTemplate.shared

        // Enable Album/Artist browsing (shows button that navigates to album/artist view in your app)
        nowPlayingTemplate.isAlbumArtistButtonEnabled = true

        // Enable Up Next queue (shows button that displays upcoming tracks)
        nowPlayingTemplate.isUpNextButtonEnabled = true

        // Add custom buttons (iOS 14+)
        setupCustomButtons(for: nowPlayingTemplate)
    }

    private func setupCustomButtons(for template: CPNowPlayingTemplate) {
        var buttons: [CPNowPlayingButton] = []

        // Playback rate button
        let rateButton = CPNowPlayingPlaybackRateButton { [weak self] button in
            self?.cyclePlaybackRate()
        }
        buttons.append(rateButton)

        // Shuffle button
        let shuffleButton = CPNowPlayingShuffleButton { [weak self] button in
            self?.toggleShuffle()
        }
        buttons.append(shuffleButton)

        // Repeat button
        let repeatButton = CPNowPlayingRepeatButton { [weak self] button in
            self?.cycleRepeatMode()
        }
        buttons.append(repeatButton)

        // Update template with custom buttons
        template.updateNowPlayingButtons(buttons)
    }
}

权限要求

CarPlay 要求在 Xcode 项目中添加权限:

Info.plist:

<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>

Entitlements 文件:

<key>com.apple.developer.carplay-audio</key>
<true/>

如果没有此权限,CarPlay 将完全不显示你的应用。

CarPlay 特有注意事项

问题原因解决方法耗时
CarPlay 不显示应用缺少权限添加 com.apple.developer.carplay-audio5 分钟
CarPlay 中“正在播放”为空白未设置 MPNowPlayingInfoCenter与锁定屏幕使用相同的修复方法(模式 1)10 分钟
自定义按钮未显示在推送后才配置在 templateApplicationScene(_:didConnect:) 中配置5 分钟
按钮在设备上可用,但在 CarPlay 模拟器中不可用调试器干扰不连接调试器进行测试1 分钟
缺少专辑封面与 iOS 问题相同修复 MPMediaItemArtwork(模式 3)15 分钟

测试 CarPlay

模拟器(Xcode 12+):

  1. I/O → 外接显示器 → CarPlay
  2. 轻点 CarPlay 显示屏
  3. 在“音频”部分找到你的应用
  4. 重要:为确保测试可靠,请在不连接调试器的情况下运行(调试器可能干扰 CarPlay 音频会话的激活)

真实车辆: 需要获得 Apple 的权限批准(对于启用了 UIBackgroundModes 音频模式的应用会自动批准;无需手动申请)。

验证

  • 应用显示在 CarPlay 的“音频”部分
  • “正在播放”显示正确的元数据
  • 显示专辑封面
  • 播放/暂停/跳过按钮响应正常
  • 自定义按钮(如有)显示且可正常工作
  • 已分别在连接和未连接调试器的情况下测试

资源

技能:axiom-now-playing、axiom-now-playing-musickit

评论

支持 Markdown