10

我刚刚有一个 Apple TV 应用被拒绝,因为

“此外,Siri Remote 上的菜单按钮在您的应用程序中的行为与预期不符。具体来说,当用户启动应用程序并点击 Siri Remote 上的菜单按钮时,应用程序不会退出到 Apple TV 主屏幕。

我正在查找这个,据我所知,这应该是在初始视图控制器上按下菜单按钮的自动行为。但是,我有一个带有根视图控制器的导航控制器,它通过情节提要自动实例化,没有覆盖任何方法,当我按下此视图控制器上的菜单按钮时,什么也没有发生。

有人可以告诉我我是否遗漏了什么,或者是否有办法手动实现它?

我想我可以拦截菜单按钮按下并调用exit(0),但这似乎不是一种优雅的退出方式。

4

6 回答 6

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

于 2015-10-24T20:59:19.200 回答
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];
}
于 2015-12-15T18:10:54.030 回答
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;
    }
}
于 2015-11-08T20:50:04.723 回答
1

以更通用的方式,菜单按钮应仅在某些情况下将您带到主屏幕,第一个是当您启动应用程序并单击菜单按钮时,如果您在“根视图”,稍后在您的应用程序中' 你的应用程序。

如果您在屏幕上显示某些内容,例如不受标准 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
}
于 2015-11-04T04:13:07.263 回答
0

所以我最终不情愿地像这样调用 exit(0)

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

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

它不像自动工作时那么整洁。您最终会看到大约半秒钟的模糊白色视图,而不是更优雅的淡出动画。但是它确实有效,我可以确认我是通过 Apple 的审核流程这样做的。

于 2015-10-28T13:47:23.293 回答
0

当您不再需要手势识别器时,为我解决的只是从您的视图中移除手势识别器(对于您的菜单按钮)。

然后,当您遇到想要菜单按钮的情况时,例如,返回上一个屏幕,然后再次添加手势识别器。

这样,菜单按钮就可以按应有的方式工作,而无需调用 exit() 或强制您的应用以其他方式退出。

于 2015-12-03T21:06:36.193 回答