OK、少し時間があったので、パンくずリストをたどりました…これが私が見つけたものです。
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 は両方とも左の位置を占めるため、持つことができません。
prevTrack および nextTrack コマンドをトリガーする必要がある seekForward / seekBackward コマンドがあります。両方を設定すると、シングルタップで次/前がトリガーされ、長押しすると、指を離したときに開始シークと終了シークがトリガーされます。
// 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");
}
これにより、3 つの水平バーが表示され、アラート シートが表示されます。アクティブなプロパティを設定することで、これらを個別に強調表示できます。
評価コマンドも定義されていますが、これをコマンド センターに表示することはできませんでした
// 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:)];
必要に応じて、ブロックベースのターゲット アクション メカニズムもあります。
// @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 を置き換えるというヒントがあります。
これはすべて試行錯誤に基づいているため、自由に修正してください。
ガレス