gpt4 book ai didi

ios - 是否有公共(public)方式强制 MPNowPlayingInfoCenter 显示播客控件?

转载 作者:IT王子 更新时间:2023-10-29 07:36:38 25 4
gpt4 key购买 nike

我希望控制中心(通过 MPNowPlayingInfoCenter)显示前进 15 秒/后退 15 秒的控件,Apple 在播客中显示,如下所示:

podcast controls

完全缺乏文档告诉我没有显而易见的方法来做到这一点,但是有没有人找到任何非显而易见的方法来强制执行此操作而不诉诸私有(private)方法?

我已经将前进/后退按钮的处理设置为适本地前进,我只想使用更合适的 UI。任何帮助将不胜感激。

最佳答案

好吧,我手上有一点时间,所以我跟着面包屑。...这是我发现的。

包含 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);
}

注意:preferredIntervals 属性是一个 NSArray,但我还没有弄清楚命令中心如何使用额外的间隔,除非你自己做一些事情。

到目前为止我发现的注意事项。执行此操作时,您将控制所有控件,因此默认播放和暂停按钮不会显示,除非您对它们执行相同操作:

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,但我无法从命令中心触发它 - 虽然它确实从耳机触发。)

其他发现:这些按钮位于左/中/右的固定位置,因此您不能有(例如)previousTrack 和 skipBackward,因为它们都占据左侧位置。

有 seekForward/seekBackward 命令需要触发 prevTrack 和 nextTrack 命令。当您设置两者时,单击会触发下一个/上一个,按住会在您抬起手指时触发开始搜索和结束搜索。

    // 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");
}

这会显示三个水平条并显示一个警告表 - 您可以通过设置 active 属性来单独突出显示它们。

还定义了一个评级命令 - 但我无法在命令中心显示它

//    MPRatingCommand *ratingCommand = [rcc ratingCommand];
// [ratingCommand setEnabled:YES];
// [ratingCommand setMinimumRating:0.0];
// [ratingCommand setMaximumRating:5.0];
// [ratingCommand addTarget:self action:@selector(ratingEvent:)];

和播放速率更改命令 - 但同样无法在命令中心显示此命令

//    MPChangePlaybackRateCommand *playBackRateCommand = [rcc changePlaybackRateCommand];
// [playBackRateCommand setEnabled:YES];
// [playBackRateCommand setSupportedPlaybackRates:@[@(1),@(1.5),@(2)]];
// [playBackRateCommand addTarget:self action:@selector(remoteControlReceivedWithEvent:)];

如果您愿意,还有一个基于 block 的目标操作机制

// @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 处理程序中的事件。这些是 UIEvent,但具有 UIEventTypeRemoteControl 类型和用于区分事件的子类型。您不能在此方法中将它们与 MPRemoteCommandEvents 混合和匹配。有迹象表明 MPRemoteCommandEvents 将在某个时候取代 UIEvents。

所有这些都是基于反复试验,所以请随时纠正。

加雷思

Screenshot of feedback command and skipforward

关于ios - 是否有公共(public)方式强制 MPNowPlayingInfoCenter 显示播客控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20591156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com