2014-01-08 16 views
7

Ich suche schon seit einiger Zeit nach einem Weg, um festzustellen, ob ein externer iOS-Bildschirm mit Kabel verbunden ist ODER über Funk und kann keinen offensichtlichen Weg finden.Bietet iOS irgendeine Funktionalität, um festzustellen, ob der externe Bildschirm ein "festverdrahteter" TV-Ausgang/ein HDMI- oder ein "Netzwerk" -Airplay-Gerät ist?

Ich habe die inoffiziellen AirPlay-Spezifikationen HERE gesehen, kann aber keine naheliegende Methode erkennen. Weiß jemand, ob dies mit legit/'public' API getan werden kann.

+1

Warum möchten Sie wissen? Der "festverdrahtete" TV-Ausgang ist sowieso AirPlay-over-a-wire. Was genau willst du herausfinden? –

+1

Ja, ich weiß, es ist im Wesentlichen das gleiche Protokoll über Kabel, aber wir entwickeln eine sicherheitssensitive App, die einige Clients beschränken möchten, um Airplay Spiegelung nur über eine festverdrahtete Verbindung zu ermöglichen - Aufgrund der gut publizierten Unsicherheit der Ausstrahlung AirPay Displays über WLAN und das Potenzial für nicht autorisierte Parteien, es zu sehen. – Herwr

Antwort

2

Ich glaube nicht, dass es eine öffentliche API dafür gibt. Ich würde vermuten, dass dies aus Apples Sicht nicht das Problem Ihrer App ist. Es hängt vom Benutzer ab, was er mit dem Bildschirm Ihrer App macht: Sie können ihn screenshot und an alle per E-Mail verschicken, oder einfach ein Kabel in einen Projektor stecken und es an der Seite eines Gebäudes zeigen. Der Versuch, dies in einer App zu verhindern, ist wahrscheinlich nicht möglich.

Sie können jedoch etwas davon mit Apples Configurator-Tool erreichen. Sie können beispielsweise ein firmeneigenes iOS-Gerät so konfigurieren, dass AirPlay nur bestimmten Hosts erlaubt wird. Es kann auch Screenshots und andere Dinge verhindern, die hilfreich sein könnten. Ich weiß nicht, ob du genau das bekommst, wonach du suchst, aber es könnte etwas sein, wenn du etwas Kontrolle über die Geräte hast, auf denen diese App installiert wird.

+0

Danke für die Wiederholung - Ja, wir machen schon etwas Ähnliches durch die App, was es dem Kunden erlaubt, bestimmte Funktionen wie AirPlay einzuschränken, allerdings ist es notwendig, nur verkabelte Displays zu erlauben (im Gegensatz zu Over-Air). Beachten Sie, dass es sich um potenziell hochsensible Informationen handelt, die auf den Geräten enthalten sind. In diesem Fall passt es leider nicht in den Standard "Benutzer sollte das tun können, was er will" -Szenario. – Herwr

+0

Auch ich bin nicht unbedingt nach einer öffentlichen API, nur eine "Apple legal" Art und Weise, es zu erkennen - Wie in, wird es Apples Code-Review-Prozess passieren. – Herwr

5

Ja, es gibt tatsächlich einen Weg.

Erstellen Sie irgendwo in Ihrer App eine Instanz von MPVolumeView. In einer Instanzvariable festhalten. Sie müssen es nicht als Subview zu etwas hinzufügen, es muss einfach existieren.

Dann abonnieren Sie den MPVolumeViewWirelessRouteActiveDidChangeNotification wie so:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(handleWirelessRouteActiveDidChangeNotification:) 
               name:MPVolumeViewWirelessRouteActiveDidChangeNotification 
              object:nil]; 

diese Methoden hinzufügen über den Zustand des externen Displays, um herauszufinden:

- (BOOL)isAirPlayConnected 
{ 
    return _volumeView.isWirelessRouteActive; 
} 

- (BOOL)isAirPlayMirroringActive 
{ 
    if ([self isAirPlayConnected]) { 
     NSArray *screens = [UIScreen screens]; 

     if ([screens count] > 1) { 
      return [screens[1] mirroredScreen] == [UIScreen mainScreen]; 
     } 
    } 

    return NO; 
} 

- (BOOL)isAirPlayPlaybackActive 
{ 
    return [self isAirPlayConnected] && ![self isAirPlayMirroringActive]; 
} 

- (BOOL)isExternalPlaybackActive 
{ 
    if ([self isAirPlayPlaybackActive]) { 
     return YES; 
    } else { 
     NSArray *screens = [UIScreen screens]; 

     if ([screens count] > 1) { 
      return [screens[1] mirroredScreen] != [UIScreen mainScreen]; 
     } 
    } 

    return NO; 
} 

Zusätzlich können Sie für die Meldungen UIScreenDidConnectNotification und UIScreenDidDisconnectNotification überprüfen. Mit all dem können Sie feststellen, ob Sie mit AirPlay verbunden sind, ob AirPlay Mirroring aktiv ist, ob AirPlay-Wiedergabe (nicht Mirroring) aktiv ist oder ob Sie einen externen Bildschirm ohne Spiegelung verwenden.

+0

isAirPlayMirroringActive funktioniert nicht, aber andere funktionieren wie ein Zauber, danke. Das liegt daran, dass [UIScreen screens] count immer 1 ist, vielleicht war es vorher anders. – mgyky