Пользовательское действие iOS для увеличения/уменьшения громкости в наушниках

Требование: когда пользователь подключает наушники к 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 также будут оценены.


person Bhargav Soni    schedule 17.11.2018    source источник
comment
Я боюсь, что это поведение не настраивается в последних версиях iOS.   -  person Vanya    schedule 17.11.2018


Ответы (1)


iOS очень строга к тому, что вы не можете изменить предполагаемое поведение аппаратных кнопок. Ваше приложение будет отклонено, даже если вы сможете это сделать.

person GeneCode    schedule 18.11.2018
comment
Вы имеете в виду, что клавишу увеличения/уменьшения громкости наушников нельзя настроить для определенных действий? - person Bhargav Soni; 19.11.2018
comment
Я имею в виду, что нет никакого законного способа сделать это. Вероятно, есть нелегальный способ сделать это с помощью приватного API (недокументированные функции), но его нужно поискать. Но, как я уже сказал, обозреватель приложений Apple имеет автоматизированные способы обнаружения использования нелегальной функции, чтобы ваше приложение было отклонено. - person GeneCode; 21.11.2018
comment
Есть ли у вас какая-либо конкретная документация, описывающая то же самое, предоставленная Apple. @GeneCode - person Anjali jariwala; 22.11.2018
comment
@GeneCode проверьте это приложение, оно также работает с аппаратными кнопками, не влияя на громкость системы. itunes.apple.com/us/app/rallyblitz-nav/ id735777925?mt=8 - person Bhargav Soni; 24.11.2018
comment
разработчику этого приложения просто повезло. Вы можете попытать счастья. кстати, я нашел решение на SO, как скрыть объем HUD: -slider" title="скрыть отображение громкости устройства при настройке громкости с помощью ползунка mpvolumeview"> stackoverflow.com/questions/24444376/ - person GeneCode; 25.11.2018