MacOS не отвечает на команды MPRemoteCommandCenter в фоновом режиме - PullRequest
3 голосов
/ 19 апреля 2020

Я пишу приложение для своих собственных целей, целью которого является получение событий паузы воспроизведения независимо от того, что происходит в системе. Я получил очень много работы

let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.togglePlayPauseCommand.isEnabled = true
commandCenter.togglePlayPauseCommand.addTarget { (MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in
    print("Play Pause Command")
    return .success
}

commandCenter.nextTrackCommand.isEnabled = true
commandCenter.nextTrackCommand.addTarget { (MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in
    print("NextTrackCommand")
    return .success
}
commandCenter.previousTrackCommand.isEnabled = true
commandCenter.previousTrackCommand.addTarget { (MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in
    print("previousTrackCommand")
    return .success
}
commandCenter.playCommand.isEnabled = true
commandCenter.playCommand.addTarget { (MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in
    print("playCommand")
    return .success
}

MPNowPlayingInfoCenter.default().playbackState = .playing

Большинство из этих методов есть, потому что, очевидно, вы не получите никаких уведомлений без реализации nextTrackCommand или previousTrackCommand или playCommand.

В любом случае, моя единственная проблема заключается в том, что как только вы откроете другое приложение, использующее звук, эти обработчики событий перестают вызываться, и я не могу найти способ обнаружить и исправить это. не похоже на работу. Любые идеи о том, как я могу получить события playpause независимо от того, в каком состоянии находится система?

Я бы хотел всегда иметь возможность прослушивать эти события ИЛИ получать информацию о том, когда кто-то другой взял контроль над аудио ? Возможно, даже сможете повторно подписаться на эти события паузы воспроизведения.

1 Ответ

1 голос
/ 26 апреля 2020

В системе есть внутренняя очередь, которая содержит всех подписчиков аудио-событий. Когда вы начинаете их использовать, другие приложения оказываются на вершине.

Я бы хотел всегда иметь возможность прослушивать эти события

Для этого нет API, но есть грязный обходной путь. Если я правильно понимаю вашу проблему, этот фрагмент:

    MPNowPlayingInfoCenter.default().playbackState = .paused
    MPNowPlayingInfoCenter.default().playbackState = .playing

должен помочь вам, если вы запустите его в al oop где-то в вашем приложении.

Обратите внимание, что это не так Надежность на 100%, потому что:

  1. Если событие генерируется до двух последующих изменений состояния playbackState сразу после переключения на другое приложение, оно все равно будет отслеживаться приложением в активном окне. ;
  2. Если другое приложение делает то же самое, в очереди будет постоянное состояние гонки с непредсказуемым результатом.

Ссылки:

ИЛИ получить информацию о том, когда кто-то еще взял контроль над звуком

Насколько я знаю, нет никакого публичного c API для это в macOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...