Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS 音频后台播放 && 锁屏显示及控制

iOS 音频后台播放 && 锁屏显示及控制

作者头像
莫空9081
发布于 2023-10-16 01:53:23
发布于 2023-10-16 01:53:23
2.1K00
代码可运行
举报
文章被收录于专栏:iOS 备忘录iOS 备忘录
运行总次数:0
代码可运行

播放锁屏通知栏显示

背景

播放音频时,希望通知界面能显示,且能控制音频播放。由于之前需求是进入后台时播放暂停,所以每次打开通知界面时,播放就暂停,看不到类似于音乐播放器那样的效果。后来发现,去除进入后台暂停代码后,通知界面就可以显示播放器,但是不能控制、且没有进度。

实现

支持后台播放

首先需要 APP 支持后台播放,即,一方面去除进入后台播放暂停的代码逻辑;另一方面,设置 Target -> Signing & Capabilities 中,添加 Backgroud Modes,打开 Audio, AirPlay, and Picture in Picture。图片如下:

注意设置AVAudioSession,播放前根据实际需要设置,播放后关闭

AVAudioSessionCategory类型

Category类型

当按”静音”或者锁屏时是否静音

是否可以和其他支持混音的 APP 混合播放

是否支持后台

场景举例描述

AVAudioSessionCategoryAmbient

常用于 APP 的背景音,比如玩游戏时还可以听音乐

AVAudioSessionCategorySoloAmbient

同样是背景音,但是用于玩游戏时不想听音乐的场景

AVAudioSessionCategoryPlayback

默认不可以,但可支持

音乐播放,锁屏时还能听音乐

AVAudioSessionCategoryRecord

否,只能录音

录音机,录音时,其他音乐不能播放

AVAudioSessionCategoryPlayAndRecord

默认可以,即可以录音也可以播放

边播边录,比如 VOIP 这样的场景

AVAudioSessionCategoryAudioProcessing

否,硬件解码音频,不能播放和录制

用于音频格式处理

AVAudioSessionCategoryMultiRoute

是,多种输入输出

耳机、USB 设备同时播放

AVAudioSessionCategoryOption类型

CategoryOption类型

描述

适用类别

AVAudioSessionCategoryOptionMixWithOthers

支持和其他APP 混合播放

AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryPlayback、AVAudioSessionCategoryMultiRoute

AVAudioSessionCategoryOptionDuckOthers

调低其他 APP 音频音量,突出本 APP 的音量

AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryPlayback、AVAudioSessionCategoryMultiRoute

AVAudioSessionCategoryOptionAllowBluetooth

支持蓝牙音频输入

AVAudioSessionCategoryRecord、AVAudioSessionCategoryPlayAndRecord

AVAudioSessionCategoryOptionDefaultToSpeaker

设置默认输出音频到扬声器

AVAudioSessionCategoryPlayAndRecord

AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers

App 偶尔有用到音频播放,且播放时停止其他应用音频

AVAudioSessionCategoryPlayback、AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryMultiRoute

AVAudioSessionCategoryOptionAllowBluetoothA2DP

支持立体声蓝牙

AVAudioSessionCategoryPlayAndRecord

AVAudioSessionCategoryOptionAllowAirPlay

支持 AirPlay 设备

AVAudioSessionCategoryPlayAndRecord

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

func setupAudioSession() {
    do {
        // 设置.notifyOthersOnDeactivation,当 Active 为 false 是生效,通知系统本应用播放已结束,可继续其他 APP 播放
        try AVAudioSession.sharedInstance().setActive(true, options: AVAudioSession.SetActiveOptions.notifyOthersOnDeactivation)
        
        // 根据实际需要切换设置不同的 Category
        try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, options: AVAudioSession.CategoryOptions.duckOthers)
    } catch {
        print("set AudioSession error: %@", error)
    }
}

锁屏通知栏显示

APP 支持后台播放后,可以看到在通知栏已经有显示了,但是播放时没有进度,没有标题,没有图片,只有 APP 的名字和 小Icon。而要修改这些信息的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import <MediaPlayer/MPNowPlayingInfoCenter.h>
#import <MediaPlayer/MPRemoteCommandCenter.h>
#import <MediaPlayer/MPRemoteCommand.h>
#import <MediaPlayer/MPMediaItem.h>

// 更新通知栏显示
- (void)updateNowPlaingInfo {
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    // 设置歌曲标题
    [dict setValue:@"Title" forKey:MPMediaItemPropertyTitle];
    // 设置歌手名
    [dict setValue:@"Artist" forKey:MPMediaItemPropertyArtist];
    // 设置专辑名
    [dict setValue:@"AlbumTItle" forKey:MPMediaItemPropertyAlbumTitle];
    // 设置显示的图片
    MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc] initWithImage:ArtImage];
    [dict setValue:artwork forKey:MPMediaItemPropertyArtwork];
    // 设置歌曲时长
    NSTimeInterval duration = self.player.duration;
    [dict setValue:[NSNumber numberWithDouble:duration] forKey:MPMediaItemPropertyPlaybackDuration];
    // 设置已经播放时长
    NSTimeInterval currentTime = self.player.currentTime;
    [dict setValue:[NSNumber numberWithDouble:currentTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
    // 设置播放速率
    [dict setValue:@(1.0) forKey:MPNowPlayingInfoPropertyPlaybackRate];
    
    // 更新
    [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict];
}

而如果想要播放完成后,不在通知栏显示,则可如下设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:@{}];

设置通知栏控制播放的暂停、上集、下集,通过设置MPRemoteCommandCenter中的属性可以控制对应功能是否打开,而响应事件的处理有两种方法:

  • 方法一,通过remoteControlReceivedWithEvent:方法,响应对应事件
  • 方法二:通过MPRemoteCommandCenterCommandaddTarget来处理对应事件

设置通知栏对应功能是否打开的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

// 在 AppDelegate 中,或者对应播放的 Controller 中,打开接收系统控制事件
// 接收系统控制事件
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];

- (void)setupCommandCenter {
    MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];
    [commandCenter.playCommand removeTarget:self];
    [commandCenter.pauseCommand removeTarget:self];
    
    // 禁用 pre, next
    commandCenter.previousTrackCommand.enabled = NO;
    commandCenter.nextTrackCommand.enabled = NO;
    
    // 播放
    commandCenter.playCommand.enabled = YES;
    
    // 暂停
    commandCenter.pauseCommand.enabled = YES;
    
    // 播放和暂停(耳机控制)
    commandCenter.togglePlayPauseCommand.enabled = NO;

    // 拖拽进度
    commandCenter.changePlaybackPositionCommand.enable = YES;
}

响应事件处理方法一的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

// 响应远程事件
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    if (event.type == UIEventTypeRemoteControl) {
        switch (event.subtype) {
            case UIEventSubtypeRemoteControlPlay:
            {
                NSLog(@"RemoteControlEvents: play");
            }
                break;
            case UIEventSubtypeRemoteControlPause:
            {
                NSLog(@"RemoteControlEvents: pause");
            }
                break;
            case UIEventSubtypeRemoteControlTogglePlayPause:
                NSLog(@"耳机控制:暂停||播放");
                break;
            case UIEventSubtypeRemoteControlNextTrack:
            {
                NSLog(@"RemoteControlEvents: next");
            }
                break;
            case UIEventSubtypeRemoteControlPreviousTrack:
            {
                NSLog(@"RemoteControlEvents: previous");
            }
                break;
            default:
                break;
        }
    }
}

响应事件处理方法二的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

- (void)setupCommandCenter {
    MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];

    // 播放
    [commandCenter.playCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {
        NSLog(@"play");
        return MPRemoteCommandHandlerStatusSuccess;
    }];

    // 暂停
    [commandCenter.pauseCommand addTarget:self action:@selector(handlePauseCommand:)];

    // 拖拽进度
    [commandCenter.changePlaybackPositionCommand addTarget:self action:@selector(handlePlaybackPositionCommand:)];
}

- (MPRemoteCommandHandlerStatus):(id)sender {
    NSLog(@"pause");
    return MPRemoteCommandHandlerStatusSuccess;
}

- (MPRemoteCommandHandlerStatus)handlePlaybackPositionCommand:
(MPChangePlaybackPositionCommandEvent *) event

{
    [self.palyer seekToTime:CMTimeMakeWithSeconds(event.positionTime, 1)];

    NSLog(@"changePlaybackPosition to %f", event.positionTime);

    return MPRemoteCommandHandlerStatusSuccess;
}

问题

不添加beginReceivingRemoteControlEvents时,是否会显示通知栏,是否影响两种方法处理 响应事件处理方法二的响应会走两次 自定义播放的进度和通知栏的进度不一致

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果
功能描述:锁屏歌曲信息、控制台远程控制音乐播放:暂停/播放、上一首/下一首、快进/快退、锁屏状态下列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果)、歌词解析并随音乐滚动显示。 [总效果预览图.gif] **** 第一部分:锁屏效果包括:锁屏歌曲信息和远程控制音乐播放 ① 锁屏歌曲信息显示 [iOS11以下锁屏信息预览] //展示锁屏歌曲信息:图片、歌词、进度、歌曲名、演唱者、专辑、(歌词是绘制在图片上的) - (void)showLockScreenTotaltime
且行且珍惜_iOS
2018/05/22
2.8K0
TXLiteAVSDK中使用 AVAudioSession 问题总结
在 iOS 端做音视频相关 App 过程中咱们经常会遇到音频管理的相关问题,下面介绍一下 AVAudiosession 的基本使用,并结合使用腾讯云视频 TXLiteAVSDK 项目中碰到的一些问题场景实现分享。
腾讯云-chaoli
2019/07/07
5.2K2
TXLiteAVSDK中使用 AVAudioSession 问题总结
iOS后台音频播放及锁屏界面显示音频信息 原
后台播放是任何一个音频软件都支持的功能,在上一篇博客中,详细介绍了使用AVAudioPlayer播放音频的方法,这篇博客将对后台的处理做介绍,关于播放与设置音频的博客地址:http://my.oschina.net/u/2340880/blog/420129。
珲少
2018/08/16
3.2K0
iOS后台音频播放及锁屏界面显示音频信息
                                                                            原
iOS_AVAudioPlayer播放并实现了后台播放和远程控制
在Info.plist中添加App Transport Security Settings类型Dictionary。
mikimo
2022/07/20
9520
iOS后台音频播放及锁屏歌词
1.PNG 2.PNG 主要代码如下: //后台播放音频设置,需要在Capabilities->Background Modes中勾选Audio,Airplay,and Picture in Picture AVAudioSession *session = [AVAudioSession sharedInstance]; [session setActive:YES error:nil]; [session setCategory:AVAudioSessionCategoryPla
且行且珍惜_iOS
2018/05/22
1.8K0
AVFoundation框架解析看这里(3)- 音频AVAudio
上一章节主要以媒体捕捉以起点,拍摄、保存视频,本章将以音频AVFAudio为重点,主要知识点有:
sweet说好的幸福
2020/12/23
1.9K0
AVFoundation框架解析看这里(3)- 音频AVAudio
如何让iOS推送播放语音?
iOS 推送播放语音的需求调研,即收到推送后,播放推送的文案,文案的内容不固定。类似于支付宝和微信的收款到账语音。
莫空9081
2021/05/26
2.6K0
iOS音频播放器锁屏歌词显示与性能优化 原
    前边有博客探讨了有关iOS开发中音频播放的技术与进行后台音频播放并在后台与用户进行交互的方法,本篇将探讨一种在锁屏界面同步显示歌词歌词的方法,并在应用性能上进行一些处理。前边博客地址如下:
珲少
2018/08/15
1.2K0
iOS音频播放器锁屏歌词显示与性能优化
                                                                            原
HarmonyOS 开发实践 —— 基于AVPlayer音频后台播放
音乐播放是媒体最重要的组成之一,以下是AVPlayer将Audio媒体资源(比如mp3等)转码为可听见的音频模拟信号,并通过输出设备进行播放。
小帅聊鸿蒙
2024/12/07
2671
HarmonyOS 开发实践 —— 基于AVPlayer音频后台播放
iOS 后台任务
仅当你的app是真的提供给用户音频播放功能,你才能使用音频后台模式。 若我们抱有侥幸心理,为了获得CPU更多时间而利用该模式播放一段无声的音频,apple将会拒绝此类app。 同样的当语音播放完毕之后程序同样会挂起
码客说
2019/10/22
7150
基础篇-iOS后台运行以及相关
对于APP的前后台运行情况的了解,有助于我们在实际开发中规避一些问题,以及采取稳妥的方法处理和解决问题,是很必须的。
進无尽
2018/09/12
5K0
基础篇-iOS后台运行以及相关
不会吧,这也行?iOS后台锁屏监听摇一摇
一般情况下,出于省电、权限、合理性等因素考虑,给人的感觉是很多奇怪的需求安卓可以实现,但是iOS就无法实现!今天要介绍的需求也有这种感觉,就是“当 APP 处于后台或锁屏状态时,依旧可以监听到摇一摇,进而触发某些功能,比如:语音播报”。
woopDast1
2020/09/21
3.1K1
用MediaPlayer做个带进度条可后台的音乐播放器
传送到github看源码 下载apk试用 密码:rukn 前言 想在天朝听音乐还是有些难度的, 一般来说, 两三个app还是要的. 那何不尝试自己做个手机播放器, 听个爽呢?!今天就带大家先做个简单
sean_yang
2018/09/04
1.8K0
用MediaPlayer做个带进度条可后台的音乐播放器
关于iOS实现前台,后台,锁屏或关闭app语音播报
公司要求像支付宝收款一样,收到推送后实现语音播报功能,之前没有做过,特此机会研究一下。 用到的技术点: 1.如果对语音要求不是特别高的情况下,用苹果系统自带的AVSpeechUtterance可以实现
honey缘木鱼
2018/06/13
3.8K1
iOS后台唤醒实战:微信收款到账语音提醒技术总结
微信为了解决小商户老板们在频繁交易中不方便核对、确认到账的功能痛点,产品MM提出了新版本需要支持收款到账语音提醒功能。本文借此总结了iOS平台上的APP后台唤醒和语音合成、播放等一系列技术开发过程中遇到的坑和小技巧,希望与您分享。
JackJiang
2018/08/29
2.7K1
AVFoundation 框架初探究(一)
夜深时动笔 ----       前面一篇文章写了视频播放的几种基本的方式,算是给这个系列开了一个头,这里面最想说和探究的就是AVFoundation框架,很想把这个框架不敢说是完全理解,但至少想把它弄明白它里面到底有什么,这个过程需要一些时间,既然是不明白的东西就得花时间来总结学习。白天工作的时候都要忙着项目的事,只能等晚上或者哪天上班没其他事打扰或者周末去花时间来做这些了,毕业这么些年,有时候还是会想起以前在学校时候,那时候只顾着长身体追求我的女神和电竞梦,其实就是什么都没做成。也真是浪费了太多的时
Mr.RisingSun
2018/03/19
3K0
AVFoundation 框架初探究(一)
腾讯云LiteAV、IM SDK(iOS)
实时音视频TRTC:https://cloud.tencent.com/document/product/647/46907
sunmou10
2020/08/05
26.2K1
腾讯云LiteAV、IM SDK(iOS)
Android 音频播放速率调整实现
最近接触到的一个项目, 有音频播放、切换播放速率和拖动进度到某处播放的需求 ,由于之前只是见过并没有尝试过切换播放速率 , 于是开始调研并最终实现,下面简单记录一下这次的调研过程。
程思扬
2022/01/11
1.3K0
全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)
本文原作者“minminaya”,作者网站:minminaya.cn,为了提升文章品质,即时通讯网对内容作了幅修订和改动,感谢原作者。
JackJiang
2018/12/27
4.4K0
微信iOS收款到账语音提醒开发总结
一、背景 为了解决小商户老板们在频繁交易中不方便核对、确认到账的痛点,产品MM提出了新版本需要支持收款到账语音提醒功能。这篇文章总结了开发过程中遇到的坑和一些小技巧。 二、技术方案 后台唤醒App 收款到账语音提醒需要收款方在收到款后,播放一段TTS合成语音播报金额,微信在前台时可以通过模板消息将需要播报的金额带下来,再请求TTS数据并播放,但是app在挂起或者被kill掉的情况下要如何请求语音数据并播放呢? iOS提供了两种方式唤醒处于挂起或已经被kill掉的app。分别是Silent Notificat
腾讯Bugly
2018/03/23
3.6K1
推荐阅读
相关推荐
iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验