如何从 PlayCommand 中删除目标?

How to remove target from PlayCommand?

我正在使用 XamarinMediaManagerXamarin.iOS 上构建音频播放器,它基于 iOS 上的 AVPlayer

为了 play/pause 来自锁定屏幕的曲目,我将以下处理程序添加到 PlayCommandPauseCommand,如下所示:

MPRemoteCommandCenter.Shared.PlayCommand.AddTarget(LockScreenPlay);
MPRemoteCommandCenter.Shared.PauseCommand.AddTarget(LockScreenPause);
 //..

 private MPRemoteCommandHandlerStatus LockScreenPlay(MPRemoteCommandEvent arg)
{
  //..
    PlaybackController.Play();
  // ..
}
 private MPRemoteCommandHandlerStatus LockScreenPause(MPRemoteCommandEvent arg)
{
 //..
    PlaybackController.Pause();
 //..
}

问题

当我多次访问控制器时,LockScreenPlay/Pause 被执行了几次,我如何在卸载视图时删除旧的处理程序?

Ps:我已经在 ViewWillDisappear 方法中尝试 RemoveTarget

KMPRemoteCommandCenter.Shared.PlayCommand.RemoveTarget(this);

但这没有用,我做错了什么?任何帮助,将不胜感激。

MPRemoteCommandCenter.Shared.PlayCommand.AddTarget(LockScreenPlay); 将 return 一个 NSObject。如果你想删除这个动作,你应该使用这个 api 比如:

// Add play command
playCommand =  MPRemoteCommandCenter.Shared.PlayCommand.AddTarget(LockScreenPlay);
// Remove play command later
MPRemoteCommandCenter.Shared.PlayCommand.RemoveTarget(playCommand);

这样每次添加的命令都需要记录下来。然后在需要时删除它们。

也可以尝试使用OC选择器添加播放命令:

MPRemoteCommandCenter.Shared.PlayCommand.AddTarget(this, new ObjCRuntime.Selector("LockScreenPlay:"));
[Export("LockScreenPlay:")]
private void LockScreenPlay(MPRemoteCommand command)
{
   ...
}

这样,您可以使用MPRemoteCommandCenter.Shared.PlayCommand.RemoveTarget(this);删除您添加的所有命令。暂停命令也是如此。