Приложение Apple TV не выходит на главный экран с контроллера начального вида, когда кнопка меню нажата на пульте дистанционного управления

У меня только что приложение Apple TV отклонено из-за

'Кроме того, кнопка меню на Siri Remote не действует должным образом в вашем приложении. В частности, когда пользователь запускает приложение и нажимает кнопку "Меню" на Siri Remote, приложение не выходит на главный экран Apple TV.

Я смотрю это, и из того, что я могу сказать, должно быть автоматическое поведение нажатия кнопки меню, когда на контроллере начального представления. Однако у меня есть контроллер навигации с контроллером корневого представления, созданный автоматически через раскадровку без переопределенных методов, и ничего не происходит, когда я нажимаю кнопку меню на этом контроллере представления.

Может ли кто-нибудь сказать мне, если я что-то упустил или если есть способ реализовать это вручную?

Я думаю, что могу просто перехватить кнопку меню и нажать exit (0), но это не похоже на изящный способ выхода.

Ответ 1

У меня просто было отклонено приложение по этой причине. В моем случае проблема заключалась в переопределении группы методов press<Phase>d:withEvent без вызова реализации super.

Итак, я изменил это:

-(void)pressesBegan:(NSSet*)presses withEvent:(UIPressesEvent *)event {
    // my code
}

Для этого:

-(BOOL)ignoreMenu:(NSSet*)presses {
    return ((UIPress *)[presses anyObject]).type == UIPressTypeMenu;
}

-(void)pressesBegan:(NSSet*)presses withEvent:(UIPressesEvent *)event {
    if ([self ignoreMenu:presses]) return [super pressesBegan:presses withEvent:event];
    // my code
}

И кнопка меню снова работает. Что сбивает с толку, что кнопка "Домой" продолжает работать, вы вызываете super или нет.

Ответ 2

Мой полный рабочий код от tvOS 9.1 (скомпилирован под Objective-C ++)

bool AppRespondedToBack = false;
-(void)pressesBegan:(NSSet*)presses withEvent:(UIPressesEvent *)event
{
    UIPress *UP = (UIPress *)presses.anyObject;
    if ( UP && UP.type == UIPressTypeMenu )
    {
        //OnBack should be where you handle the back operation in your app
        AppRespondedToBack = OnBack();
        if ( !AppRespondedToBack )
            // Let AppleTV return to the home screen
            [super pressesBegan:presses withEvent:event];
    }
    else
        [super pressesBegan:presses withEvent:event];
}
-(void)pressesEnded:(NSSet*)presses withEvent:(UIPressesEvent *)event
{
    UIPress *UP = (UIPress *)presses.anyObject;
    if ( UP && UP.type == UIPressTypeMenu )
    {
        if ( !AppRespondedToBack )
             // Let AppleTV return to the home screen
            [super pressesEnded:presses withEvent:event];
    }
    else
        [super pressesEnded:presses withEvent:event];
}

Ответ 3

В более общем виде кнопка "Меню" выводит вас на главный экран только в некоторых условиях, сначала при запуске приложения и нажатии кнопки "Меню", а затем в приложении, если вы находитесь на "root view" вашего приложения.

Если вы отобразите что-то на экране, например, popover/dialog, который не контролируется стандартным sdk, а также вручную (например, добавление UIView как popover), кнопка Menu должна просто действовать как 'cancel/go назад, как это было бы на навигационном контроллере.

-(void)pressesBegan/Ended:(NSSet*)presses withEvent:(UIPressesEvent *)event {
    if( presses.anyObject.type == UIPressTypeMenu) {
        if ( !somePopoverDisplayed) {
                // Let the sdk do its thing with the menu button 
            [super pressesBegan:presses withEvent:event];
        } else {
            // otherwise handle the menu button yourself ...
        }
        return;
    }

    // handle other buttons
}

Ответ 4

Вот фрагмент кода, который закончился для меня:

-(void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event {
    if( presses.anyObject.type == UIPressTypeMenu) {
        if (scene.view.paused == YES) {
            // This will return to the Apple TV Menu           
        } else {
            // This allows your code to run without exiting the app
            [self pauseScene];
            [super pressesBegan:presses withEvent:event];
        }
        return;
    }
}

Ответ 5

Итак, я закончил тем, что вызывал вызов (0) так

- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event
{
    [super pressesBegan:presses withEvent:event];

    if (presses.anyObject.type == UIPressTypeMenu)
    {
        exit(0);
    }
}

Это не совсем так, как когда он работает автоматически; вы получаете размытый белый вид примерно на полсекунды вместо более изящной анимации. Однако он работает, и я могу подтвердить, что я сделал это через процесс проверки Apple, делая это таким образом.

Ответ 6

Для меня это было просто удалением распознавателя жестов с вашего вида (для кнопки "Меню" ), когда вам это больше не нужно.

Затем, когда у вас есть ситуация, когда вы хотите, чтобы кнопка меню, например, вернулась к предыдущему экрану, просто добавьте свой распознаватель жестов.

Таким образом, кнопка "Меню" работает так, как вам нужно, без необходимости вызывать exit() или заставить ваше приложение выйти другим путем.