Как вы управляете аудиозаписью приложения, произошли значительные изменения с iOS 6.0, и он заслуживает краткого упоминания в первую очередь. Перед тем, как iOS 6.0 вы использовали бы AVAudioSession и AudioSessionServices классы, включающие делегирование и прослушивание свойств соответственно. От iOS 6.0 и последующее использование AVAudioSession класс и включение уведомлений.
Для iOS 6.0 и далее.
Чтобы узнать, есть ли другие аудио вне вашего приложения песочнице играет использование -
// query if other audio is playing
BOOL isPlayingWithOthers = [[AVAudioSession sharedInstance] isOtherAudioPlaying];
// test it with...
(isPlayingWithOthers) ? NSLog(@"other audio is playing") : NSLog(@"no other audio is playing");
Как для прерывания обработки вы должны будете наблюдать AVAudioSessionInterruptionNotification
и AVAudioSessionRouteChangeNotification
. Таким образом, в классе, который управляет вашим аудиосеансом, вы можете добавить что-то вроде следующего: это нужно вызывать один раз в начале жизненного цикла приложения и не забывать удалять наблюдателя в методе dealloc того же класса.
// ensure we already have a singleton object
[AVAudioSession sharedInstance];
// register for notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(interruption:)
name:AVAudioSessionInterruptionNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(routeChange:)
name:AVAudioSessionRouteChangeNotification
object:nil];
И, наконец, добавьте следующие селекторы interruption:
и routeChange:
- они получат NSNotification
объект, который имеет свойство USERINFO типа NSDictionary
, что вы читаете, чтобы помочь либо условным ваше приложение имеет.
- (void)interruption:(NSNotification*)notification {
// get the user info dictionary
NSDictionary *interuptionDict = notification.userInfo;
// get the AVAudioSessionInterruptionTypeKey enum from the dictionary
NSInteger interuptionType = [[interuptionDict valueForKey:AVAudioSessionInterruptionTypeKey] integerValue];
// decide what to do based on interruption type here...
switch (interuptionType) {
case AVAudioSessionInterruptionTypeBegan:
NSLog(@"Audio Session Interruption case started.");
// fork to handling method here...
// EG:[self handleInterruptionStarted];
break;
case AVAudioSessionInterruptionTypeEnded:
NSLog(@"Audio Session Interruption case ended.");
// fork to handling method here...
// EG:[self handleInterruptionEnded];
break;
default:
NSLog(@"Audio Session Interruption Notification case default.");
break;
} }
И точно так же ...
- (void)routeChange:(NSNotification*)notification {
NSDictionary *interuptionDict = notification.userInfo;
NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
switch (routeChangeReason) {
case AVAudioSessionRouteChangeReasonUnknown:
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonUnknown");
break;
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
// a headset was added or removed
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonNewDeviceAvailable");
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
// a headset was added or removed
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
break;
case AVAudioSessionRouteChangeReasonCategoryChange:
// called at start - also when other audio wants to play
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonCategoryChange");//AVAudioSessionRouteChangeReasonCategoryChange
break;
case AVAudioSessionRouteChangeReasonOverride:
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonOverride");
break;
case AVAudioSessionRouteChangeReasonWakeFromSleep:
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonWakeFromSleep");
break;
case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory:
NSLog(@"routeChangeReason : AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory");
break;
default:
break;
} }
Там нет необходимости опрашивать ничего до тех пор, как вы проверить состояние ваших приложений сказать аудио сессии, например, в viewDidLoad
вашего контроллера зрения корень, в начале жизненного цикла приложений. Любые изменения с этого момента на аудиозапись приложений будут известны с помощью этих двух основных уведомлений. Замените операторы NSLog
тем, что ваш код должен делать на основе случаев, содержащихся в коммутаторе.
Дополнительную информацию о AVAudioSessionInterruptionTypeKey
и AVAudioSessionRouteChangeReasonKey
в справочной документации по классу AVAudioSession
.
Приносим извинения за длинный ответ, но я считаю, что управление аудио сеансами в iOS довольно затруднительно, и руководство по программированию аудиозаписей Apple на момент написания этого документа не включает примеры кода с использованием уведомлений об обработке прерываний.
Интересно .... – Maulik