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

Мне только что отказали в приложении Apple TV из-за

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

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

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

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


person Mark Bridges    schedule 23.10.2015    source источник
comment
Если вы наблюдаете такое поведение, скажем, в пустом приложении с описанной вами настройкой раскадровки, возможно, вы обнаружили ошибку. (Если нет, начните работать по частям, чтобы увидеть, чем ваше приложение отличается.) Исправьте ошибку.   -  person rickster    schedule 24.10.2015
comment
Да, я почти уверен, что это ошибка. Я собираюсь отправить отчет об ошибке. Если я создам новый контроллер представления, на котором ничего нет, он будет работать. Если я добавлю несколько ярлыков, кнопок, представлений изображений и пользовательских шрифтов (даже без каких-либо подключений или использования моих собственных подклассов), он внезапно остановится.   -  person Mark Bridges    schedule 24.10.2015
comment
Пример того, как вручную вернуться на главный экран Apple TV в Swift: Разрешить кнопку Siri Remote Menu, когда кнопка Play / Pause переопределена.   -  person Daniel Storm    schedule 31.07.2016


Ответы (6)


Мне тоже только что отказали в приложении по этой причине. В моем случае проблема заключалась в переопределении группы методов 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 или нет.

person Shaun Inman    schedule 24.10.2015
comment
Не забудьте сделать аналогичный вызов -ignoreMenu: from -pressesEnded: если вы это тоже переопределяете. - person Rachid Finge Jr; 14.12.2015

Мой полный рабочий код для 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];
}
person RelativeGames    schedule 15.12.2015
comment
Кстати, для controllerUserInteractionEnabled также необходимо установить значение YES (для Objective C) или true (для Swift) на уровне ViewController, иначе передача событий нажатия в super, поскольку клавиша меню не имеет никакого эффекта. - person Gino; 27.02.2017

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

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

-(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
}
person Bluedays    schedule 04.11.2015
comment
Это тот, который у меня сработал, с небольшой разницей. По какой-то причине вызов метода [super presssesBegan ...] привел к тому, что приложение не вернулось в меню Apple TV. - person erparker; 08.11.2015

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

-(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;
    }
}
person erparker    schedule 08.11.2015

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

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

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

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

person Mark Bridges    schedule 28.10.2015
comment
Тогда тебе повезло. В прошлый раз, когда я сделал exit() звонок, он был отклонен. Apple заявила, что в приложениях нельзя вызывать выход. - person Mecki; 30.11.2015

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

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

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

person DJDLTD    schedule 03.12.2015