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 inreturn image}nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
}
  • 如何将网络图片设置成封面
    使用Kingfisher 框架
//下载图片KingfisherManager.shared.retrieveImage(with: albumArtURL) { result inswitch 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) { _ inreturn 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 MediaPlayerclass 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.titlenowPlayingInfo[MPMediaItemPropertyArtist] = track.artistnowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = track.durationnowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = 0 // 初始播放时间nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 1.0 // 正在播放if let albumArt = track.albumArt {let artwork = MPMediaItemArtwork(boundsSize: albumArt.size) { size inreturn albumArt}nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork}MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo}func updatePlaybackProgress(currentTime: TimeInterval, isPlaying: Bool) {guard var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo else { return }nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentTimenowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo}}

实现功能:

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

参考文档

  • MPNowPlayingInfoCenter | Apple Developer Documentation

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑,如何跳过联网激活;由于微软限制必须要联网激活,需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用,Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

猫咪掉毛还容易应激,哪款宠物空气净化器可以吸毛且低噪?

今年的双十一第一波优惠我没有抢,因为我在犹豫我真的必须要买宠物空气净化器,但是会不会有很多副作用等等问题,让我一直不敢下手。 一直犹豫买不买是因为我家养了一只爱掉毛的小猫咪,家里每天都是想着要清理猫咪掉下来的猫毛&…

又是一年 1024

今天是 1024 程序员节,现在是一名大数据讲师,我和往常一样,依旧在讲课中度过。对于很多程序员来说,这一天也许是属于代码、调试和无数行 SQL 查询的,而对于我来说,虽然工作内容不同,却也和数据、…

软考算法——线性表、栈和队列、串、数组、矩阵和广义表

软考算法(一) 线性表定义顺序表单链表循环链表双向链表 性能分析线性表插入删除操作 栈和队列栈队列循环队列 串、数组、矩阵和广义表串串的基本操作串的存储结构 数组数组的存储地址计算 矩阵——稀疏矩阵上三角矩阵下三角矩阵 广义表 线性表 定义 线性…

设置K8s管理节点异常容忍时间

说明 每个节点上的 kubelet 需要定时向 apiserver 上报当前节点状态,如果两者间网络异常导致心跳终端,kube-controller-manager 中的 NodeController 会将该节点标记为 Unknown 或 Unhealthy,持续一段时间异常状态后 kube-controller-manage…

软考——计算机网络概论

文章目录 🕐计算机网络分类1️⃣通信子网和资源子网2️⃣网络拓扑结构3️⃣ 计算机网络分类3:LAN MAN WAN4️⃣其他分类方式 🕑OSI 和 TCP/IP 参考模型1️⃣OSI2️⃣TCP/IP🔴TCP/IP 参考模型对应协议 3️⃣OSI 和 TCP/IP 模型对应…

AUTOSAR_EXP_ARAComAPI的6章笔记(4)

☞返回总目录 相关总结:《AUTOSAR 自适应应用中原始数据流传输的使用方法》总结 6.4 原始数据流传输的使用方法 本章描述了原始数据流(RawDataStreams)在 AUTOSAR 自适应应用程序中的使用方法。 目前,原始数据流传输在单播 / …

WSL2-轻量级AI训练场景最佳生产环境

WSL2 只适用于 Win 10 、Win11 在运行 AI 软件、AI 模型训练,Linux 是最佳的操作系统。 在运行各种软件,如:Stable Diffusion Web UI 等,使用 Docker 容器运行也更方便后期的快速复用,同样的 Docker 容器在 Linux 中…

基于springboot的网上服装商城推荐系统的设计与实现

基于springboot的网上服装商城推荐系统的设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:idea 源码获取&#xf…

安灯系统助力汽车零部件工厂快速解决生产异常

在汽车零部件制造领域,高效的生产管理和快速解决异常情况是确保产品质量和生产进度的关键。而安灯系统的应用,正为汽车零部件工厂带来了全新的变革,助力其快速解决生产异常。 汽车零部件工厂的生产报工产线看板直观地反映出生产的各项关键数据…

基于SpringBoot的“心灵治愈交流平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“心灵治愈交流平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能界面图 登录、用户注册界面图 心灵专…

【有啥问啥】智能座舱中的儿童遗留检测(CPD,Child Presence Detection)技术详解

智能座舱中的儿童遗留检测(CPD,Child Presence Detection)技术详解 引言 儿童遗留检测(CPD,Child Presence Detection)系统是一项旨在保护儿童免受因被遗忘在车内而导致的热中暑危险的重要安全技术。近年…

HCIP-HarmonyOS Application Developer 习题(十五)

(判断)1、在HarmonyOs中发布带权限公共事件,发布者首先要在config.json中申请所需的权限。 答案:正确 分析:发布携带权限的公共事件:构造CommonEventPublishInfo对象,设置订阅者的权限。 &#…

书生营 L0G4000 玩转HF/魔搭/魔乐社区

模型下载 在codespace上给环境装包,按照教材即可 运行后下载成功 建立下载json文件 新建下载internlm2_5-chat-1_8b的json文件 运行结果 基本上没啥问题,照着教程来就行 模型上传(可选) push的时候需要先认证token 最后的…

Linux 权限的理解

内容摘要 本文内容包括shell的运行原理,包括外壳程序的原理、理解、和意义,以及从两个方面对于权限的理解(人和事物的属性)、修改文件的权限,包括修改文件的拥有者、修改文件拥有者所在的组的用户以及修改文件的三类用…

域渗透AD渗透攻击利用 MS14-068漏洞利用过程 以及域渗透中票据是什么 如何利用

目录 wmi协议远程执行 ptt票据传递使用 命令传递方式 明文口令传递 hash口令传递 票据分类 kerberos认证的简述流程 PTT攻击的过程 MS14-068 漏洞 执行过程 wmi协议远程执行 wmi服务是比smb服务高级一些的,在日志中是找不到痕迹的,但是这个主…

鸿蒙中富文本编辑与展示

富文本在鸿蒙系统如何展示和编辑的?在文章开头我们提出这个疑问,带着疑问来阅读这篇文章。 富文本用途可以展示图文混排的内容,在日常App 中非常常见,比如微博的发布与展示,朋友圈的发布与展示,都在使用富文…

【树莓派 5B】anaconda换源 更换清华源

【树莓派 5B】anaconda换源 更换清华源 前言 本文基于树莓派5B上运行的 Raspberrypi-OS-64bit (Debian 12 Bookworm)平台,更换 Anaconda 官方源为清华大学镜像源,旨在解决网络连接超时、连接官方源失败、下载速度慢的问题。 参…

spring (Aop) day 1024

ok了家人们,继续学习spring ,这段知识点有点绕,建议搭配b站的视频去学,passion!!! 八.AOP-面向切面编程 8.1 动态代理 8.1.1 概述 什么是代理?在现实生活中,代理很常见…

学习虚幻C++开发日志——TSet

TSet 官方文档:虚幻引擎中的Set容器 | 虚幻引擎 5.5 文档 | Epic Developer Community (epicgames.com) TSet 是通过对元素求值的可覆盖函数,使用数据值本身作为键,而不是将数据值与独立的键相关联。 默认情况下,TSet 不支持重…