2015-10-23 2 views
10

Я просто имел Apple TV приложение отвергнута из-заApple TV App не выходя на домашний экран от исходного контроллера представления при нажатии кнопки меню нажал на пульте

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

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

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

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

+0

Если вы видите это поведение, скажем, пустое приложение с помощью только настроек раскадровки вы описали, вы можете иметь нашел ошибку. (Если нет, начните работать кусочно, чтобы увидеть, как отличается ваше приложение.) [Файл с этой ошибкой] (http://bugreport.apple.com). – rickster

+0

Да, я уверен, что это ошибка. Я собираюсь подать отчет об ошибке. Если я создаю новый контроллер представлений, ничего не получится, он будет работать. Если я добавлю несколько ярлыков, кнопок, изображений и пользовательских шрифтов (даже не подключая что-либо или используя свои собственные подклассы), он внезапно останавливается. –

+0

Пример того, как вернуться к главному экрану Apple TV вручную в Swift: [Разрешить кнопку удаленного Siri при отключенной кнопке «Воспроизведение/Пауза»] (http://stackoverflow.com/a/38685417/2108547). –

ответ

5

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

+0

Не забудьте сделать аналогичный вызов -ignoreMenu: from -pressesEnded: если вы тоже переопределяете это. –

0

Так что я в конечном итоге неохотой вызова выход (0), как так

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

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

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

+2

Тогда вам повезло. В прошлый раз, когда я сделал вызов 'exit()', он был отклонен. Apple заявила, что вы не должны вызывать exit в приложениях. – Mecki

1

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

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

-(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 
} 
+0

Это тот, который работал для меня, с незначительной разницей. По какой-то причине вызов метода [super pressesBegan ...] сделал так, чтобы приложение * не * возвращалось в меню Apple tv – erparker

1

Здесь пропущено кода, который в конечном итоге работает для меня:

-(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; 
    } 
} 
0

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

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

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

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]; 
} 
+0

BTW, для контроллераUserInteractionEnabled также должно быть установлено значение YES (для Objective C) или true (для Swift), на уровне ViewController, иначе передача событий пресса супер, поскольку клавиша меню не действует. – Gino