2012-01-26 12 views
6

私のアプリケーションでAirPlayサポートを有効にしようとしています。私はビデオをやっていません。私は外部ディスプレイを「第2のディスプレイ」として使用したい。iOS AirPlay:ミラーリングがオンの場合、私のアプリには外部ディスプレイのみが通知されますか?

ここに私の問題があります:私がAirPlayボタンから「AppleTV」を選択した場合、私のアプリは通知を受けません。私のアプリが通知する唯一の時間は、私が自分のアプリケーションを終了し、OSレベルのAirPlayボタンに行き、そこで「AppleTV」を選択し、ミラーリングをオンにすることです。ミラーリングをオフにすると、私のアプリは外部ディスプレイが消えたことを知らされます。

ので:私は私のアプリ内で から、外部ディスプレイを選ぶ際

  1. はなぜ私のアプリには通知されませんか?
  2. ミラーリングをオンにしたときに、外部ディスプレイの が存在することがアプリに通知されるのはなぜですか。私は明らかに何かを誤解していますが、ミラーリングをオンにしたように見えるのは、外部ディスプレイが消えてしまったことを私のアプリに知らせるべきです(OSは現在、外部ディスプレイをミラーリングのために使用しているはずです)。

以下のコードサンプル。助けをあらかじめありがとう!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    // Override point for customization after application launch. 

    // Is there already an external screen? 
    if (UIScreen.screens.count > 1)] 
    { 
      [self prepareExternalScreen:UIScreen.screens.lastObject]; 
    } 

    // Tell us when an external screen is added or removed. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(externalScreenDidConnect:) name:UIScreenDidConnectNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(externalScreenDidDisconnect:) name:UIScreenDidDisconnectNotification object:nil]; 

    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    self.window.rootViewController = self.viewController; 

    // Add AirPlay control to view controller. 
    MPVolumeView* airplayButtonView = [[MPVolumeView alloc] init]; 
    airplayButtonView.frame = CGRectMake(300, 300, 50, 50); 
    airplayButtonView.backgroundColor = [UIColor blackColor]; 
    airplayButtonView.showsVolumeSlider = NO; 
    airplayButtonView.showsRouteButton = YES; 

    [self.viewController.view addSubview:airplayButtonView]; 


    [self.window makeKeyAndVisible]; 

    return YES; 
} 

#pragma mark - External screen handling 

- (void)externalScreenDidConnect:(NSNotification*)notification 
{ 
    [self prepareExternalScreen:notification.object]; 
} 

- (void)externalScreenDidDisconnect:(NSNotification*)notification 
{ 
    // Don't need these anymore. 
    self.externalWindow = nil; 
} 

- (void)prepareExternalScreen:(UIScreen*)externalScreen 
{ 
    NSLog(@"PREPPING EXTERNAL SCREEN."); 
    self.viewController.view.backgroundColor = [UIColor blueColor]; 
    CGRect frame = externalScreen.bounds; 
    self.externalWindow = [[UIWindow alloc] initWithFrame:frame]; 
    self.externalWindow.screen = externalScreen; 
    self.externalWindow.hidden = NO; 
    self.externalWindow.backgroundColor = [UIColor redColor]; 
} 

答えて

8

これは間違いありません。セカンダリディスプレイ(Airplay画面)は、ミラーリングでのみ使用できます。ここで

はこれを実装する方法を示していたアプリケーションです: https://github.com/quellish/AirplayDemo

あなたのコードを見て、ユーザがエアプレイメニューに行き、あなたのアプリがアクティブである間ミラーリングオンになったとき、あなたはUIScreenDidConnectNotificationを取得するべきです。 MPVolumeViewまたはムービーコントローラの「Airplay Button」は、ミラーリング(したがって外部ディスプレイ機能)を制御しません。残念ながら、ビデオとオーディオ出力はミラーリングとは別物であり、ミラーリングはシステム全体のミラーリングUIを使用してのみオンまたはオフにすることができます。

結論:あなたのアプリ内からそのAirPlay画面をオンにすることはできません。

+1

ありがとうございます。そして、うんざりしている:Appleはこれに関してUIでひどい仕事をしたようだ。 –

+0

これはまだですか?私はこの投稿がかなり古くて、私は道を探しているのを見る。 – VaporwareWolf

2

最後に、新しい画面通知を取得するにはミラーリングが有効になっている必要がありますが、2番目の画面の内容で画面を上書きする必要があります。とても混乱するような!

は、この例を参照してください:

UIScreen screens always return 1 screen

さて、最悪の部分。

MPVolumeView *volumeView = [ [MPVolumeView alloc] init] ; 
[view addSubview:volumeView]; 

このピッカーからミラーリングを有効にすることはできません。また、ミラーリングを有効にするプログラム的な方法はありません。

How can I turn on AirPlay Screen Mirroring on the iPhone 4S programmatically

だから明らかに2番目の画面の経験を持っている唯一の方法は、マルチタスクバーからのAirPlayをオンにしてください、彼らは上のミラーをオンにする方法をユーザーに指示することです。

関連する問題