Ответ 1
ОК, поэтому у меня было немного времени на моих руках, и поэтому я последовал за панировкой... Это то, что я нашел.
Включите среду MediaPlayer и получите RemoteCommandCenter:
MPRemoteCommandCenter *rcc = [MPRemoteCommandCenter sharedCommandCenter];
то, если вы хотите установить элементы управления пропусками в соответствии с Overcast, вы можете сделать следующее:
MPSkipIntervalCommand *skipBackwardIntervalCommand = [rcc skipBackwardCommand];
[skipBackwardIntervalCommand setEnabled:YES];
[skipBackwardIntervalCommand addTarget:self action:@selector(skipBackwardEvent:)];
skipBackwardIntervalCommand.preferredIntervals = @[@(42)]; // Set your own interval
MPSkipIntervalCommand *skipForwardIntervalCommand = [rcc skipForwardCommand];
skipForwardIntervalCommand.preferredIntervals = @[@(42)]; // Max 99
[skipForwardIntervalCommand setEnabled:YES];
[skipForwardIntervalCommand addTarget:self action:@selector(skipForwardEvent:)];
а в обработчиках событий сделайте то, что вам нужно сделать, чтобы пропустить интервал:
-(void)skipBackwardEvent: (MPSkipIntervalCommandEvent *)skipEvent
{
NSLog(@"Skip backward by %f", skipEvent.interval);
}
-(void)skipForwardEvent: (MPSkipIntervalCommandEvent *)skipEvent
{
NSLog(@"Skip forward by %f", skipEvent.interval);
}
Примечание. Предпочтительным свойствомIntervals является NSArray, но я не понял, как дополнительные интервалы могут использоваться командным центром, если вы не сделаете что-то с этим сами.
Следует отметить, что Ive нашел до сих пор. Когда вы это делаете, вы контролируете все элементы управления, поэтому кнопки воспроизведения и паузы по умолчанию не будут отображаться, если вы не сделаете то же самое для них:
MPRemoteCommand *pauseCommand = [rcc pauseCommand];
[pauseCommand setEnabled:YES];
[pauseCommand addTarget:self action:@selector(playOrPauseEvent:)];
//
MPRemoteCommand *playCommand = [rcc playCommand];
[playCommand setEnabled:YES];
[playCommand addTarget:self action:@selector(playOrPauseEvent:)];
(есть также параметр togglePlayPauseCommand, но я не мог заставить его стрелять из Command Center - он работает только от наушников.)
Другие открытия: Кнопки находятся в фиксированных положениях влево/вправо/вправо, поэтому у вас нет (например) предыдущегоTrack и skipBackward, поскольку оба они занимают левую позицию.
Существуют команды seekForward/seekBackward, для которых требуется команда prevTrack и nextTrack. Когда вы настраиваете оба, один раз нажмите триггеры next/previous и нажмите и удерживайте триггеры, чтобы начать поиск и конец, когда вы поднимаете палец.
// Doesn’t show unless prevTrack is enabled
MPRemoteCommand *seekBackwardCommand = [rcc seekBackwardCommand];
[seekBackwardCommand setEnabled:YES];
[seekBackwardCommand addTarget:self action:@selector(seekEvent:)];
// Doesn’t show unless nextTrack is enabled
MPRemoteCommand *seekForwardCommand = [rcc seekForwardCommand];
[seekForwardCommand setEnabled:YES];
[seekForwardCommand addTarget:self action:@selector(seekEvent:)];
-(void) seekEvent: (MPSeekCommandEvent *) seekEvent
{
if (seekEvent.type == MPSeekCommandEventTypeBeginSeeking) {
NSLog(@"Begin Seeking");
}
if (seekEvent.type == MPSeekCommandEventTypeEndSeeking) {
NSLog(@"End Seeking");
}
}
Существует также механизм обратной связи, который я ранее не видел (занимает левую позицию)
MPFeedbackCommand *likeCommand = [rcc likeCommand];
[likeCommand setEnabled:YES];
[likeCommand setLocalizedTitle:@"I love it"]; // can leave this out for default
[likeCommand addTarget:self action:@selector(likeEvent:)];
MPFeedbackCommand *dislikeCommand = [rcc dislikeCommand];
[dislikeCommand setEnabled:YES];
[dislikeCommand setActive:YES];
[dislikeCommand setLocalizedTitle:@"I hate it"]; // can leave this out for default
[dislikeCommand addTarget:self action:@selector(dislikeEvent:)];
BOOL userPreviouslyIndicatedThatTheyDislikedThisItemAndIStoredThat = YES;
if (userPreviouslyIndicatedThatTheyDislikedThisItemAndIStoredThat) {
[dislikeCommand setActive:YES];
}
MPFeedbackCommand *bookmarkCommand = [rcc bookmarkCommand];
[bookmarkCommand setEnabled:YES];
[bookmarkCommand addTarget:self action:@selector(bookmarkEvent:)];
// Feedback events also have a "negative" property but Command Center always returns not negative
-(void)dislikeEvent: (MPFeedbackCommandEvent *)feedbackEvent
{
NSLog(@"Mark the item disliked");
}
-(void)likeEvent: (MPFeedbackCommandEvent *)feedbackEvent
{
NSLog(@"Mark the item liked");
}
-(void)bookmarkEvent: (MPFeedbackCommandEvent *)feedbackEvent
{
NSLog(@"Bookmark the item or playback position");
}
Это отображает три горизонтальные полосы и отображает лист предупреждений - вы можете выделить их индивидуально, установив активное свойство.
Существует также определенная команда рейтинга, но я не мог ее отобразить в командном центре
// MPRatingCommand *ratingCommand = [rcc ratingCommand];
// [ratingCommand setEnabled:YES];
// [ratingCommand setMinimumRating:0.0];
// [ratingCommand setMaximumRating:5.0];
// [ratingCommand addTarget:self action:@selector(ratingEvent:)];
и команду изменения скорости воспроизведения - но опять-таки не удалось получить это в Command Center
// MPChangePlaybackRateCommand *playBackRateCommand = [rcc changePlaybackRateCommand];
// [playBackRateCommand setEnabled:YES];
// [playBackRateCommand setSupportedPlaybackRates:@[@(1),@(1.5),@(2)]];
// [playBackRateCommand addTarget:self action:@selector(remoteControlReceivedWithEvent:)];
Существует также блок-механизм целевых действий, если вы предпочитаете
// @property (strong, nonatomic) id likeHandler;
self.likeHandler = [likeCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent *event) {
NSLog(@"They like it");
return MPRemoteCommandHandlerStatusSuccess; // or fail or no such content
}];
Один последний момент, о котором нужно знать: если вы зарегистрировались для получения удаленных событий через [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; то некоторые из этих команд также запускают события в обработчике получаемого обработчика - (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent. Это UIEvents, но с типом UIEventTypeRemoteControl и подтипом, чтобы отличать событие. Вы не можете смешивать и сопоставлять их с MPRemoteCommandEvents в этом методе. Есть подсказки, что MPRemoteCommandEvents в какой-то момент заменит UIEvents.
Все это на основе проб и ошибок, поэтому не стесняйтесь исправить.
Гарет