当前位置: 首页 > article >正文

iOS MPNowPlayingInfoCenter 通知栏、锁屏 显示当前播放的媒体信息

前言

MPNowPlayingInfoCenter 是 iOS 框架 MediaPlayer 中的一个类,主要用于管理锁屏界面、控制中心、通知中心中显示的“当前播放”媒体信息。它允许开发者向用户展示正在播放的音乐或媒体信息,并控制媒体播放。

通过 MPNowPlayingInfoCenter,你可以在锁屏上显示诸如歌曲标题、艺术家、专辑封面、播放进度等信息,同时还可以提供播放、暂停、快进等媒体控制。

本篇文章简单介绍一下 MPNowPlayingInfoCenter 以及用法。
请添加图片描述

1. nowPlayingInfo 属性

nowPlayingInfo 是一个字典,你可以通过它设置锁屏和控制中心显示的媒体信息。这个字典中的键值对指定了要展示的媒体元数据,比如标题、艺术家、专辑封面等。

MPNowPlayingInfoCenter.default().nowPlayingInfo = [
    MPMediaItemPropertyTitle: "Song Title",
    MPMediaItemPropertyArtist: "Artist Name",
    MPMediaItemPropertyAlbumTitle: "Album Name",
    MPNowPlayingInfoPropertyElapsedPlaybackTime: 0,  // 当前播放的时间
    MPMediaItemPropertyPlaybackDuration: 200,  // 媒体总时长
    MPNowPlayingInfoPropertyPlaybackRate: 1.0  // 播放速率,1.0表示正常播放,0.0表示暂停
]

常用的键值

  • MPMediaItemPropertyTitle: 媒体的标题(如歌曲名)。
  • MPMediaItemPropertyArtist: 艺术家名。
  • MPMediaItemPropertyAlbumTitle: 专辑名。
  • MPMediaItemPropertyArtwork: 封面图片(使用 MPMediaItemArtwork 对象)。
  • MPNowPlayingInfoPropertyElapsedPlaybackTime: 当前播放时间。
  • MPNowPlayingInfoPropertyPlaybackRate: 播放速率(1.0 为正常播放,0.0 为暂停)。

2. 更新封面图片

MPMediaItemPropertyArtwork 可以用来设置媒体的封面图片。苹果文档建议使用 MPMediaItemArtwork 来处理动态图片大小调整,这样系统在不同场景下会自动调整封面的大小。

if let image = UIImage(named: "albumCover") {
    let artwork = MPMediaItemArtwork(boundsSize: image.size) { size in
        return image
    }
    nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
}
  • 如何将网络图片设置成封面
    使用Kingfisher 框架
//下载图片
 KingfisherManager.shared.retrieveImage(with: albumArtURL) { result in
                switch result {
                case .success(let imageResult):
                    updateArtwork(imageResult.image)
                case .failure(let error):
                    //默认
                    if let defaultImage = UIImage(named: "albumCover")  {
                        updateArtwork(defaultImage)
                    }
                    print("下载封面图失败: \(error.localizedDescription)")
                }
            }
     
       // MARK: - 更新封面图
 func updateArtwork(_ image: UIImage) {
        guard var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo else { return }

        let artwork = MPMediaItemArtwork(boundsSize: image.size) { _ in
            return image
        }
        nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork

        // 更新锁屏信息
        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }  
            

3. 更新播放进度和速率

MPNowPlayingInfoCenter 的 nowPlayingInfo 不仅可以设置媒体元数据,还可以动态更新播放进度和播放状态。

  • 进度更新:通过 MPNowPlayingInfoPropertyElapsedPlaybackTime 来更新当前播放的时间。
  • 播放速率:使用 MPNowPlayingInfoPropertyPlaybackRate 更新播放速率,1.0 表示正在播放,0.0 表示暂停。
MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentTime
MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0

4. 响应远程控制事件

除了显示媒体信息,MPNowPlayingInfoCenter 通常与 MPRemoteCommandCenter 配合使用,来响应锁屏界面上的播放、暂停等媒体控制按钮。你可以为这些按钮设置相应的事件处理逻辑。

let commandCenter = MPRemoteCommandCenter.shared()

commandCenter.playCommand.addTarget { [weak self] event in
    // 播放事件
    self?.play()
    return .success
}

commandCenter.pauseCommand.addTarget { [weak self] event in
    // 暂停事件
    self?.pause()
    return .success
}

5. 清除锁屏信息

如果你不再需要显示锁屏信息,可以将 MPNowPlayingInfoCenter 的 nowPlayingInfo 设置为 nil 来清除当前的媒体信息。

MPNowPlayingInfoCenter.default().nowPlayingInfo = nil

示例代码:音乐播放器锁屏信息管理

import MediaPlayer

class MusicPlayer {
    func play() {
      
        // 播放音乐
        // audioStreaming.play(url: track.url)
        
        // 初始化锁屏信息
        setupNowPlayingInfo(track: track)
    }
    func pause() {
    
        // audioStreaming.pause()
        // 更新锁屏信息
        updatePlaybackProgress(currentTime: audioStreaming.progress,isPlaying: false )
    }
    
    func resume() {
        //继续
        //audioStreaming.resume
         // 更新锁屏信息
        updatePlaybackProgress(currentTime: audioStreaming.progress,isPlaying: true)
    }

    
    func setupNowPlayingInfo(track: Track) {
        var nowPlayingInfo = [String: Any]()
        nowPlayingInfo[MPMediaItemPropertyTitle] = track.title
        nowPlayingInfo[MPMediaItemPropertyArtist] = track.artist
        nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = track.duration
        nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = 0 // 初始播放时间
        nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 1.0 // 正在播放

        if let albumArt = track.albumArt {
            let artwork = MPMediaItemArtwork(boundsSize: albumArt.size) { size in
                return albumArt
            }
            nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
        }
        
        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
    
    func updatePlaybackProgress(currentTime: TimeInterval, isPlaying: Bool) {
        guard var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo else { return }
        
        nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentTime
        nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0
        
        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
    

}

实现功能:

  • 设置锁屏信息:通过 setupNowPlayingInfo 设置播放曲目的相关信息。
  • 更新播放进度:updatePlaybackProgress 方法根据播放状态动态更新播放进度。

参考文档

  • MPNowPlayingInfoCenter | Apple Developer Documentation

感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!


http://www.kler.cn/a/373017.html

相关文章:

  • Tech Talk: 浅谈AI浪潮下的计算型存储SSD
  • .NET内网实战:通过白名单文件反序列化漏洞绕过UAC
  • Django+Vue全栈开发旅游网项目景点详情
  • 目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8
  • 「Mac畅玩鸿蒙与硬件14」鸿蒙UI组件篇4 - Toggle 和 Checkbox 组件
  • gitlab不同账号间·仓库转移
  • git修改用户名与查看git的账号与密码
  • WPF中设置DataGrid的常用样式
  • Mac环境鸿蒙模拟器安装
  • VueSSR详解 VueServerRenderer Nutx
  • Docker学习笔记【从入门到精通】
  • ubuntu 挂载 新 硬盘 ext3
  • 【重学 MySQL】七十九、深入探索用户变量
  • 警务辅助人员管理系统小程序ssm+论文源码调试讲解
  • solidity的struct对象,web3j java解析输出参数
  • 海思MPP音视频总结
  • uniapp离线打包app无法调用相机权限的解决思路
  • RHCE http作业
  • hdlbits系列verilog解答(DFF8-8位D触发器)-81
  • 大语言模型(LLM)入门级选手初学教程 II
  • Linux学习_11
  • 校园社团信息管理:Spring Boot框架的深度解析
  • Springboot3.3 + Mybatis / Mybatis-plus
  • 2024年10月23日Github流行趋势
  • Invalid version: ‘4.0.0-unsupported‘ - cmd 报错解决方案
  • Django入门教程——数据模型建立