2015-10-23 12 views
10

gedrückt habe ich habe gerade ein Apple TV App wegenApple TV App nicht auf den Startbildschirm von dem ersten View-Controller verläßt, wenn Menü-Taste auf der Fernbedienung

‚Darüber hinaus abgelehnt, die Menü-Taste auf der Fernbedienung Siri tut verhalten Sie sich nicht wie erwartet in Ihrer App. Wenn der Benutzer die App startet und die Menü-Taste auf der Siri-Fernbedienung antippen, wird die App nicht automatisch auf dem Apple TV-Startbildschirm angezeigt.

Ich schaue das nach oben und von dem, was ich sagen kann dies das automatische Verhalten des Drückens der Menü-Taste, wenn auf der ersten Ansicht Controller. Allerdings habe ich einen Navigationscontroller mit einem Root-View-Controller, der automatisch über das Storyboard ohne Methoden überschrieben wird und nichts passiert, wenn ich die Menü-Taste auf diesem View-Controller drücke.

Kann mir jemand sagen, ob ich etwas vermisse oder ob es eine Möglichkeit gibt, dies manuell zu implementieren?

Ich denke, ich könnte nur die Menü-Taste abdrücken und rufen Sie Ausgang (0), aber das scheint nicht eine anmutige Art zu verlassen.

+0

Wenn Sie dieses Verhalten in sehen, sagen sie, eine leere App nur mit dem Storyboard-Setup Sie beschreiben, können Sie Einen Fehler gefunden. (Falls nicht, fange an, stückweise zu arbeiten, um zu sehen, wie sich deine App unterscheidet.) [File that bug] (http://bugreport.apple.com). – rickster

+0

Ja, ich bin mir ziemlich sicher, dass es ein Fehler ist. Ich werde einen Fehlerbericht einreichen. Wenn ich einen brandneuen View-Controller erstelle, der nichts drauf hat, funktioniert es. Wenn ich ein paar Beschriftungen, Schaltflächen, Bildansichten und benutzerdefinierte Schriftarten hinzufüge (auch ohne etwas anzuhängen oder meine eigenen Unterklassen zu verwenden), hört es plötzlich auf. –

+0

Beispiel für die manuelle Rückkehr zum Apple TV-Startbildschirm in Swift: [Siri Remote Menu-Taste zulassen, wenn die Wiedergabe/Pause-Taste außer Kraft gesetzt wird] (http://stackoverflow.com/a/38685417/2108547). –

Antwort

5

Ich hatte gerade eine App aus diesem Grund auch abgelehnt. In meinem Fall war das Problem, die press<Phase>d:withEvent Gruppe von Methoden zu überschreiben, ohne die super Implementierung aufzurufen.

Also änderte ich dies:

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

Um dies:

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

Und die Menü-Taste funktioniert wieder. Was verwirrend ist, ist, dass die Home-Taste weiterhin funktioniert, egal, ob Sie die super aufrufen oder nicht.

+0

Vergiss nicht, einen ähnlichen Aufruf an -ignoreMenu zu richten: from -pressesEnded: wenn du das auch übertreibst. –

0

So landete ich Ausfahrt begrudgingly Aufruf (0) wie so

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

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

Es ist nicht ganz so ordentlich wie wenn es funktioniert automatisch; Sie erhalten eine verschwommene weiße Ansicht für etwa eine halbe Sekunde statt der anmutigeren Fade-Out-Animation. Es funktioniert jedoch und ich kann bestätigen, dass ich es durch Apples Review-Prozess geschafft habe.

+2

Dann hatten Sie Glück. Das letzte Mal, als ich einen 'exit()' Anruf gemacht habe, wurde er abgelehnt. Apple sagte, du darfst den Ausgang nicht in Apps aufrufen. – Mecki

1

In einer allgemeineren Weise, die Menü-Schaltfläche sollte Sie auf den Startbildschirm nur unter bestimmten Bedingungen, zuerst würde man sein, wenn Sie die App starten und klicken Sie auf die Menü-Taste und später in Ihrer App, wenn Sie bei die "Root-Ansicht" Ihrer App

Wenn Sie etwas auf dem Bildschirm anzeigen, z. B. ein Popover/Dialog, der nicht vom Standard-SDK gesteuert wird, sondern manuell (z. B. Hinzufügen eines UIView als Popover), sollte der Menü-Button nur als 'Abbrechen/Gehen Sie zurück wie beim Navigationscontroller.

-(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

Dies ist die eine, die für mich arbeitete, mit einem kleinen Unterschied. Aus welchem ​​Grund auch immer, wenn die Methode [super pressesBegan ...] aufgerufen wurde, so dass die App * nicht zum apfelfernsehmenü – erparker

1

Hier ist die snipped von Code, der für mich am Ende arbeiten:

-(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

Was es für mich aussortiert wurde nur die Geste Erkenner aus der Ansicht zu entfernen (für die Menü-Taste), wenn Sie Brauche es nicht mehr.

Wenn Sie eine Situation haben, in der Sie beispielsweise die Menüschaltfläche verwenden möchten, kehren Sie zu einem vorherigen Bildschirm zurück, und fügen Sie dann Ihren Gestenerkenner erneut hinzu.

Auf diese Weise funktioniert die Menüschaltfläche so, wie Sie sollten, ohne dass Sie exit() aufrufen müssen oder die App zwingen müssen, auf andere Weise zu beenden.

2

Mein kompletter Arbeits Code ab tvOS 9.1 (zusammengestellt unter 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

zurückkehrte, muss controllerUserInteractionEnabled auch auf YES (für Objective C) oder true (für Swift), auf der ViewController-Ebene, sonst übergibt die presses-Ereignisse an super, für die Menütaste hat keine Wirkung. – Gino