我有一个已在iTunes App Store上发布的应用程序,并且它已启用音频后台模式。
更新到XCode 8后,我发布了我的应用程序的更新,之后我发现只要屏幕锁定,应用程序就会停止播放。否则我没有对背景游戏做任何改变。不确定iOS 9 +
的行为或编码要求是否已更改以下是我的代码所做的事情:
App plist file:
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>remote-notification</string>
</array>
AudioController.m
-(void)setBackgroundPlay:(bool)backgroundPlay
{
NSLog(@"setBackgroundPlay %d", backgroundPlay);
AVAudioSession *mySession = [AVAudioSession sharedInstance];
NSError *audioSessionError = nil;
if (backgroundPlay) {
// Assign the Playback category to the audio session.
[mySession setCategory: AVAudioSessionCategoryPlayback
error: &audioSessionError];
OSStatus propertySetError = 0;
UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty (
kAudioSessionProperty_OverrideCategoryMixWithOthers, // 1
sizeof (allowMixing), // 2
&allowMixing // 3
);
if (propertySetError != 0) {
NSLog (@"Error setting audio property MixWithOthers");
}
} else {
// Assign the Playback category to the audio session.
[mySession setCategory: AVAudioSessionCategoryPlayback
error: &audioSessionError];
}
if (audioSessionError != nil) {
NSLog (@"Error setting audio session category.");
}
}
当我最小化应用程序时,音频会继续播放,并继续播放直到屏幕自动锁定。每当屏幕打开时(如收到通知时),音频将恢复,然后在屏幕变黑时关闭。
如前所述,这些东西曾经起作用,并且在更新到Xcode 8 / iOS 9之后似乎已经改变了行为。
我试过在论坛和其他地方搜索人们遇到类似的问题,但一直找不到任何东西。
任何建议,或一双新眼睛看着这个将不胜感激!
谢谢, 斯里达尔
答案 0 :(得分:1)
好的,我发现了问题!关于我如何设置背景音频,一切都很好。
关键赠品是在屏幕锁定开启时查看设备的控制台:
Jan 17 11:03:59 My-iPad Talanome [1179]:kAudioUnitErr_TooManyFramesToProcess:inFramesToProcess = 4096,mMaxFramesPerSlice = 1156
一点点搜索引导我阅读本技术说明 - https://developer.apple.com/library/content/qa/qa1606/_index.html
关键是这个 -
// set the mixer unit to handle 4096 samples per slice since we want to keep rendering during screen lock
UInt32 maxFPS = 4096;
AudioUnitSetProperty(mMixer, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0,
&maxFPS, sizeof(maxFPS));
我没有设置我的maxFramesPerSlice,因此默认为1156,这对于自动锁定打开时太小了(这是4096)。在我的音频初始化中将maxFramesPerSlice设置为4096可确保我在屏幕锁定时有足够的空间。
希望这有助于其他可能遇到类似问题的人!
-Sridhar