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 查询的,而对于我来说,虽然工作内容不同,却也和数据、…

Python 实现日期计算与日历格式化输出

目录 一、引言 二、需求分析 三、实现思路 四、代码实现 五、代码分析 六、测试与验证 七、总结与展望 在日常的编程中,我们经常会遇到与日期相关的问题,比如计算两个日期之间的天数差、确定某个特定日期是星期几以及格式化输出日历等。本文将详细…

内存映射实例

mmap()函数可以将内存的一块地址空间映射到进程空间的指定地址中。 同样的也可以利用其开启一块共享的内存空间。&#xff08;与malloc类似&#xff09; 开启一个子进程&#xff0c;与父进程利用mmap共同管理一块内存空间。 #include<stdlib.h> #include<sys/mman.h&…

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

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

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

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

centos7安装升级cmake

一&#xff0c;移除旧版本 yum remove cmake -y 二&#xff0c;下载安装 wget https://cmake.org/files/v3.25/cmake-3.25.3.tar.gz tar xvf cmake-3.25.3.tar.gz cd cmake-3.25.3 ./bootstrap --prefix/usr/local/cmake make make install 三&#xff0c;创建软连接 ln -s …

软考——计算机网络概论

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

AUTOSAR_EXP_ARAComAPI的6章笔记(4)

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

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

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

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

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

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

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

富格林:曝光有利追损操作方式

富格林指出&#xff0c;现货黄金交易从曝光其交易时间灵活、可双向交易等交易优势以来便深受投资者的关注&#xff0c;但其交易风险也不容小觑。与大多数投资交易相似&#xff0c;现货黄金交易也同样会面临要追损的情况。事实上&#xff0c;追损的最好方式学会正确交易合理止损…

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

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

Dockerfile + docker-compose 构建java镜像并运行服务

&#x1f3dd;️ 博主介绍 大家好&#xff0c;我是一个搬砖的农民工&#xff0c;很高兴认识大家 &#x1f60a; ~ &#x1f468;‍&#x1f393; 个人介绍&#xff1a;本人是一名后端Java开发工程师&#xff0c;坐标北京 ~ &#x1f389; 感谢关注 &#x1f4d6; 一起学习 &…

使用flask构建一个简单的文件同步系统

使用Python构建文件同步系统&#xff1a;步骤指南 在当今互联网时代&#xff0c;能够在本地机器和远程服务器之间同步文件的能力变得至关重要。无论是备份重要文档、与团队成员共享大文件&#xff0c;还是在多个设备间保持数据一致性&#xff0c;一个强大的文件同步系统都能发…

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

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

HCIP-HarmonyOS Application Developer 习题(十五)

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

基于pytorch搭建CNN

先上代码 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torchvision import datasets, transforms import matplotlib.pyplot as plt import numpy as np import pandas as pd import matplotlibmatplotlib.use(tkA…