2014-01-08 5 views
7

나는 잠시 동안 iOS 외부 화면이 케이블에 연결되어 있는지 또는 무선으로 연결되어 있는지, 그리고 명백한 방법을 찾을 수 없는지를 판단 해 왔습니다.iOS는 외부 화면이 '하드 와이어드'TV 출력/HDMI와 '네트워크'Airplay 디스플레이/장치인지를 감지하는 기능을 제공합니까?

비공식 AirPlay 사양 HERE을 보았지만 분명히 감지 할 방법이 없습니다. 누구나 legit/'public'API를 사용하여이를 수행 할 수 있는지 알 수 있습니까?

+1

왜 알고 싶습니까? "하드 와이어드"TV 출력은 실제로 AirPlay-over-a-wire입니다. 정확히 무엇을 찾으려고합니까? –

+1

예 본질적으로 유선과 동일한 프로토콜이라는 것을 알고 있지만, 일부 고객은 무선 유선 연결을 통해 Airplay 미러링 만 허용하도록 제한하려는 보안 민감한 앱을 개발합니다. Wi-Fi 및 Wi-Fi를 통한 Airpay 방송의 공개 불안으로 인해 권한이없는 당사자들이 그것을 볼 수있는 가능성. – Herwr

답변

2

여기에 공개 API가 있다고 생각하지 않습니다. 나는 애플의 견해로 볼 때 이것이 앱의 관심사가 아니라고 생각한다. 사용자가 앱 화면을 통해하는 일은 사용자가 결정할 수 있습니다. 스크린 샷을 찍어 모든 사람에게 이메일로 보내거나 프로젝터에 와이어를 꽂아 건물 옆에 표시 할 수 있습니다. 앱 내에서 이들을 막으려 고 시도하는 것은 불가능할 것입니다.

그러나 Apple Configurator 도구를 사용하면이 중 일부를 얻을 수 있습니다. 회사 소유의 iOS 장치를 구성하여 특정 호스트에만 AirPlay를 허용하도록 구성 할 수 있습니다. 또한 스크린 샷과 도움이 될 수있는 다른 것들을 막을 수 있습니다. 나는 네가 찾고있는 것을 정확히 얻을 수 있는지 모르지만,이 앱이 설치 될 장치에 대해 어느 정도의 제어권을 가지고 있다면 조사 할 항목이 될 수있다.

+0

재생 해 주셔서 감사합니다. - 예, 우리는 이미 클라이언트를 통해 AirPlay를 포함한 특정 기능을 제한 할 수 있도록 앱을 통해 유사한 작업을 수행합니다. 그러나 유선 직접 표시 만 허용해야합니다 (대기와 반대). 우리는 기기에 포함 된 잠재적으로 매우 민감한 정보를 다루므로 불행히도이 경우 기본 '사용자가 원하는대로 할 수 있어야합니다'시나리오와 꼭 맞지는 않습니다. – Herwr

+0

또한 필자는 공개 API를 따를 필요도 없으며 Apple의 코드 검토 프로세스를 통과 할 것입니다. – Herwr

5

예, 실제로 방법이 있습니다.

어딘가에 MPVolumeView의 인스턴스를 만듭니다. 일부 인스턴스 변수에서 계속 유지하십시오. 하위 뷰로 추가 할 필요는 없으며 단순히 존재해야합니다.

그런 다음 지금처럼 MPVolumeViewWirelessRouteActiveDidChangeNotification에 가입 :

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

는 외부 디스플레이의 상태에 대해 알고 이러한 방법을 추가

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

은 또한 당신이 UIScreenDidConnectNotificationUIScreenDidDisconnectNotification 알림을 확인할 수 있습니다. AirPlay Mirroring이 활성화되어 있거나 AirPlay 재생 (미러링 아님)이 활성화되어 있거나 미러링없이 외부 화면을 사용하고 있다면 AirPlay에 연결되어 있는지 확인할 수 있습니다.

+0

isAirPlayMirroringActive는 작동하지 않지만 다른 사람들은 매력처럼 작동합니다. 감사합니다. 그것은 [UIScreen screens] 수가 항상 1이기 때문에, 아마도 그것은 이전과 다를 수 있습니다. – mgyky