1

最近我发现在带有嵌入式 Unity 播放器的 iOS 应用程序中没有调用 MediaPlayer 远程控制事件 (MPRemoteCommand) 处理程序。我正在使用 Xcode 6.3.1 和 Unity 5.0.1f1,但是,它看起来可以使用当前可用版本的任何组合来复制。

这是在 iOS 上处理远程控制事件的官方 Apple 文档:https ://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/Remote-ControlEvents/Remote-ControlEvents.html

这个问题很容易重现——它只是在一个空项目中添加了 24 行代码。

  1. 在 Xcode 中创建新的单视图应用程序(以制作没有 Unity 播放器的工作示例)或在 Unity 中创建一个空项目并立即构建它以 iOS 平台为目标(文件->构建设置...,iOS,构建),所有设置都保留它们的默认值来获取由 Unity 生成的 Xcode 项目(使用嵌入式 Unity 播放器制作损坏的示例)。

  2. 在 AppDelegate.h(例如不带 Unity)或 UnityAppController.h(例如带 Unity)中导入 MediaPlayer 框架头文件:

    #import <MediaPlayer/MediaPlayer.h>
    
  3. 在位于 AppDelegate.h/UnityAppController.h 的类接口中为 MPMoviePlayerController 对象声明一个属性:

    @property (strong, nonatomic) MPMoviePlayerController *player;
    
  4. 插入此代码,该代码创建一个带有 URL 的播放器(它是一个直播电台,您可以使用任何其他您想要的 HTTP 直播音频源),注册播放、暂停和 togglePlayPause 远程控制事件的处理程序并开始播放音频(从而使应用程序成为“正在播放”应用程序)在应用程序的开头:didFinishLaunchingWithOptions:位于 AppDelegate.m/UnityAppController.mm 的方法(您也可以在该方法的返回语句之前添加它 - 没关系):

    self.player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"http://81.9.96.34/eldoradio-64k"]];
    
    [[MPRemoteCommandCenter sharedCommandCenter].playCommand addTarget:self action:@selector(playCommand)];
    [[MPRemoteCommandCenter sharedCommandCenter].pauseCommand addTarget:self action:@selector(pauseCommand)];
    [[MPRemoteCommandCenter sharedCommandCenter].togglePlayPauseCommand addTarget:self action:@selector(togglePlayPauseCommand)];
    
    [self.player play];
    
  5. 将处理程序的实现添加到 AppDelegate.m/UnityAppController.mm:

    - (void)playCommand {
        [self.player play];
    }
    
    - (void)pauseCommand {
        [self.player pause];
    }
    
    - (void)togglePlayPauseCommand {
        if (self.player.playbackState == MPMoviePlaybackStatePlaying) {
            [self.player pause];
        } else {
            [self.player play];
        }
    }
    
  6. 构建并运行应用程序。一旦开始,您应该会听到音乐播放。

  7. 触发一些远程控制事件。最简单的方法是插入标准Apple EarPods并按下它们上的播放暂停按钮,这应该会生成 togglePlayPause 事件,但打开 iOS 控制中心(通过从底部滑动屏幕获得的 UI)并按下播放/暂停按钮也可以(它们应该分别生成单独的播放和暂停事件)。

在没有 Unity 的应用程序中,音频会根据正在发送的远程控制事件停止并开始播放。在具有 Unity 处理程序的应用程序中,永远不会调用(您可以在其中设置断点并在调试器下查看),并且什么也没有发生。您还可以注意到 iOS 控制中心的外观完全不同:在嵌入 Unity 播放器的应用程序中,无论音频状态如何,它都有播放和两个倒带按钮,但在没有 Unity 的应用程序中,它仅在音频播放时显示暂停按钮或不播放时只需播放按钮。

您还可以用 AVFoundation 框架中的 AVPlayer 替换 MPMoviePlayerController - 结果将完全相同。

有人知道这种行为的任何原因和/或任何解决方法吗?这非常严重地影响了我们的应用程序。

PS:我之前已经问过类似的问题,但没有得到任何答案。这个例子尽可能简单。

4

1 回答 1

0

我的应用程序与您的应用程序具有几乎相同的设置 - 并且存在相同的问题。只要我使用可混合的音频会话

    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.DuckOthers, .InterruptSpokenAudioAndMixWithOthers])

我的应用程序不会触发任何 MPRemoteCommand 处理程序。

当我将音频会话变成不可混合的会话时(通过删除选项)

    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

每当我按下耳机上的播放/暂停按钮时,都会调用我的 MPRemoteCommand 处理程序。

因此,解决方案是使用不可混合的音频会话,PlayAndRecord 没有明确的混合选项,而不是可混合的音频会话。

于 2015-11-06T14:44:23.047 回答