Ios 音频播放器在后台播放,应在硬件静音开关关闭的情况下工作

Ios 音频播放器在后台播放,应在硬件静音开关关闭的情况下工作,ios,audio,audio-player,avaudiosession,mute,Ios,Audio,Audio Player,Avaudiosession,Mute,我想在前台和后台播放音频文件,它应与静音开关一起工作,即如果静音开关打开,则不应播放,如果静音开关关闭,则应播放音频 **我正在开发一个SIP呼叫应用程序。当用户接到电话时,应用程序应播放声音/铃声。如果应用程序在后台/前台,它应该播放;如果硬件静音开关打开/关闭,它应该静音/取消静音 为此,我使用了带有以下代码的AVPlyaer AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVA

我想在前台和后台播放音频文件,它应与静音开关一起工作,即如果静音开关打开,则不应播放,如果静音开关关闭,则应播放音频

**我正在开发一个SIP呼叫应用程序。当用户接到电话时,应用程序应播放声音/铃声。如果应用程序在后台/前台,它应该播放;如果硬件静音开关打开/关闭,它应该静音/取消静音

为此,我使用了带有以下代码的AVPlyaer

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:&error];
[session setActive:YES error:nil];

NSURL * audioFileUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test1" ofType:@"mp3"]];
AVPlayer *player = [[AVPlayer alloc] initWithURL: audioFileUrl];
[player play];
我还在info.plist的背景模式中添加了“应用程序使用AirPlay播放音频或流式音频/视频”

这在两种模式下播放,但在硬件静音开关打开时不静音。 如果我使用
AVAudioSessionCategoryAmbient
不在后台模式下播放。
我使用了AVAudioPlayer,但在硬件开关打开时无法找到静音功能

您的音频会话类别可能设置不正确。 因为您想尊重静音开关,所以应该使用SoloAmbient

AVAudioSessionCategorySoloAmbient

默认类别的类别, 除非使用setCategory:错误:或 setCategory:withOptions:error:method

屏幕锁定和静音开关(iPhone上称为铃声/静音开关)会使音频静音。

默认情况下,使用此类别意味着您的应用程序的音频是 非混合激活会话将中断任何其他音频 也不可混合的会话。要允许混合,请使用
而不是音频会话类别

在iOS 3.0及更高版本中提供

您似乎使用过此类别:

AVAudioSessionCategoryPlayback

播放录制的音乐或其他重要声音的类别 为您的应用程序的成功使用干杯

使用此类别时,当静音开关设置为静音或屏幕锁定时,应用程序音频将继续。(此开关被称为 iPhone上的铃声/静音开关。)以在 应用程序转换到背景(例如,当屏幕 锁定),将音频值添加到 信息属性列表文件

默认情况下,使用此类别意味着您的应用程序的音频是 非混合激活会话将中断任何其他音频 也不可混合的会话。要允许此类别的混合, 使用AVAudioSessionCategoryOptionMixWithOthers选项

在iOS 3.0及更高版本中提供

来源:
这里有一个用于检测静音开关状态的库:。
它基于苹果的公共API。它只播放系统声音并测量完成播放所用的时间。它曾在Instagram iOS应用程序中使用。

我很高兴地说,我发现了skype是如何实现这一功能的

在前台,我们可以使用音频会话和任何一个类别来播放铃声

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory: AVAudioSessionCategorySoloAmbient error:&error];
[session setActive:YES error:nil];

NSURL * audioFileUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test1" ofType:@"mp3"]];
AVPlayer *player = [[AVPlayer alloc] initWithURL: audioFileUrl];
[player play];
在后台,我们必须使用带有自定义声音的本地通知。这将与硬件静音开关一起工作。但这里的声音文件长度不应超过30秒

    UILocalNotification* notification = [[UILocalNotification alloc] init];
    [notification @"Title"];
    [notification setAlertBody:@"Body"];
    [notification setAlertAction:noteAction];
    [notification setSoundName:@"ringtone.mp3"];
    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];

希望这将是有用的:)。

可能重复的@Juan AvaudioSessionCategoryBient不在后台播放似乎不可能做到“AvaudioSessionCategoryBient”这不是在后台播放,“AVAudioSessionCategoryPlayback”这不适用于静音开关。你能告诉我两种情况下都适用的那个吗。或者其他任何实现它的方法。@Ganee。。。。好的,对不起,我误解了。您希望在屏幕关闭时播放音频,但不希望在静音时播放音频。这是正确的吗?那么,我遇到了和你一样的障碍。苹果似乎没有为此提供音频分类。对不起,我帮不上忙(但是,Skype是如何实现此功能的:(,有什么建议吗?@Ganee….对不起,我不是iOS开发人员。我甚至没有iOS设备。我希望有人能帮助你。这个答案解决了我的问题。我在应用商店收到负面评论,因为用户的手机处于静默状态,并且认为应用程序坏了。我想我必须将音频会话设置为AVAudioSessionCategorySoloAmbient,以便您可以通过其他应用程序/iTunes播放其音频。但是,使用AVAudioSessionCategoryPlayback并将其选项设置为AVAudioSessionCategoryOptionMixWithOthers,现在允许我的应用程序在静默模式下播放声音,而不会中断其他音频源。谢谢!这对ios9非常有效,不使用后台usage@Miro不能让这个为我工作。你能分享你的代码吗?他们的网站给了我代码,但是当你把他们的.h/.m文件复制到你的项目中后,它几乎是:_detector=[SharkfoodMuteSwitchDetector shared];_detector.silentNotify=^(BOOL silent){/*在这里做点什么*/}你能为这段代码提供更多的上下文吗?我不确定你在哪里实现它/它如何为你提供有关静默开关的信息。它不会提供任何信息,通知声音会根据静默开关工作,音频会话不会根据静默开关工作。@Ganee…,但是如果假设VoIP可以,你如何处理ll出现在后台状态,用户点击了它,前台出现后,你是如何播放铃声的?在后台模式下,当你点击通知时,通知声音将停止,应用程序将打开。应用程序打开后(表示在前台模式下)如果呼叫仍处于响铃模式,您可以使用AVPlayer播放音频。@Ganee…这看起来是正确的解决方案,非常感谢!我仍然不明白为什么苹果没有提供正确的类别,在前台和后台都遵循静音开关。