Требование: когда пользователь подключает наушники к iPhone через проводную / беспроводную сеть, используя клавиши увеличения / уменьшения громкости, пользователь может выполнять пользовательские действия с помощью этих кнопок.(Не нужно менять громкость системы через наушники)
Текущая реализация:
Чтобы определить, подключены ли наушники:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRouteChange:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];
- (void)handleRouteChange:(NSNotification *)notification
{
NSDictionary *dicUserInfo = notification.userInfo;
uint reason = [dicUserInfo[AVAudioSessionRouteChangeReasonKey] intValue];
BOOL isHeadphonesConnected = NO;
switch (reason)
{
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
{
AVAudioSession *session = [AVAudioSession sharedInstance];
for (AVAudioSessionPortDescription *output in session.currentRoute.outputs)
{
if ([output.portType isEqualToString:AVAudioSessionPortHeadphones])
{
isHeadphonesConnected = YES;
}
}
}
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
{
AVAudioSessionRouteDescription *previousRoute = dicUserInfo[AVAudioSessionRouteChangePreviousRouteKey];
for (AVAudioSessionPortDescription *output in previousRoute.outputs)
{
if ([output.portType isEqualToString:AVAudioSessionPortHeadphones])
{
isHeadphonesConnected = NO;
}
}
}
break;
default:
break;
}
if (isHeadphonesConnected)
{
NSLog(@"Headphones connected");
}
else
{
NSLog(@"Headphones disconnected");
}
}
Чтобы определить, есть ли у клавиши громкостибыли нажаты из наушников:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeDidChange:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
- (IBAction)volumeDidChange:(NSNotification *)notification
{
CGFloat newVolume = [[notification.userInfo valueForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];
if (volume == 0 || newVolume < volume)
{
// change value
}
else
{
// change value
}
volume = newVolume;
}
Проблемы, с которыми мы сталкиваемся при текущей реализации:
Мы сталкиваемся с проблемой, что всякий раз, когда пользователь нажимает кнопку громкости в наушниках, мы можем запустить метод volumeDidChange
,но он также изменяет системную громкость и отображает громкость HUD-оповещения, которую нам не нужно менять.Громкость системы должна быть постоянной.
Если пользователь нажимает кнопку увеличения и уменьшения громкости устройства, он может изменять громкость системы, но из наушников он должен выполнять только определенные действия.
Ответы на языке Swift будутТакже следует ценить.