gpt4 book ai didi

iOS 后台音频不播放

转载 作者:可可西里 更新时间:2023-11-01 03:35:52 25 4
gpt4 key购买 nike

我有一个使用 CoreBluetooth 后台模式的应用程序。当某个事件发生时,我需要播放警报声。一切在前台工作正常,所有蓝牙功能在后台工作正常。我也让它在后台安排 UILocalNotification 发出警报,但是我不喜欢这些缺少音量控制所以想使用 AVAudioPlayer 播放警报声。

我已将背景模式 audio 添加到我的 .plist 文件,但无法正常播放声音。

我正在为闹钟使用单例类并像这样初始化声音:

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:soundName
ofType:@"caf"]];

player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
player.numberOfLoops = -1;
[player setVolume:1.0];

我开始这样的声音:

-(void)startAlert
{
playing = YES;
[player play];
if (vibrate)
[self vibratePattern];
}

并将其用于振动:

-(void)vibratePattern
{
if (vibrate && playing) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
[self performSelector:@selector(vibratePattern) withObject:nil afterDelay:0.75];
}
}

振动在后台运行良好,但没有声音。如果我使用 Systemsound 来播放这样的声音,它播放得很好(但没有音量控制):

AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &_sound);
AudioServicesPlaySystemSound(_sound);

那么 AVAudioPlayer 没有播放声音文件的原因可能是什么?

谢谢

编辑-------

如果应用程序在后台运行时已经在播放声音,则会播放该声音。然而,让它在后台运行时开始播放是行不通的。

最佳答案

在属性列表 (.plist) 文件中添加一个名为 Required background modes 的键..

如下图..

enter image description here你能得到帮助吗..

并在

中添加如下代码

AppDelegate.h

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

AppDelegate.m

在应用程序 didFinishLaunchingWithOptions 中

[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

UInt32 size = sizeof(CFStringRef);
CFStringRef route;
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &route);
NSLog(@"route = %@", route);

如果你想根据事件进行更改,你必须在 AppDelegate.m 中添加以下代码

- (void)remoteControlReceivedWithEvent:(UIEvent *)theEvent {

if (theEvent.type == UIEventTypeRemoteControl) {
switch(theEvent.subtype) {
case UIEventSubtypeRemoteControlPlay:
[[NSNotificationCenter defaultCenter] postNotificationName:@"TogglePlayPause" object:nil];
break;
case UIEventSubtypeRemoteControlPause:
[[NSNotificationCenter defaultCenter] postNotificationName:@"TogglePlayPause" object:nil];
break;
case UIEventSubtypeRemoteControlStop:
break;
case UIEventSubtypeRemoteControlTogglePlayPause:
[[NSNotificationCenter defaultCenter] postNotificationName:@"TogglePlayPause" object:nil];
break;
default:
return;
}
}
}

基于通知必须对其进行处理..

code.tutsplus.com 提供了一个 tutorial .

对于 HandsetBluetooth,您必须在 AppDelegate 中添加以下代码

UInt32 size = sizeof(CFStringRef);
CFStringRef route;
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &route);
NSLog(@"route = %@", route);
NSString *routeString=[NSString stringWithFormat:@"%@",route];
if([routeString isEqualToString:@"HeadsetBT"]){
UInt32 allowBluetoothInput = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryEnableBluetoothInput,sizeof (allowBluetoothInput),&allowBluetoothInput);
}

关于iOS 后台音频不播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22591421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com