54

コントロール センター (MPNowPlayingInfoCenter 経由) に、Apple がポッドキャストで表示する 15 秒前/15 秒前のコントロールを表示したいと思います。

ポッドキャスト コントロール

ドキュメントが完全に不足していることから、これを行う明白な方法はないことがわかりますが、プライベートな方法に頼らずにこれを強制する明白でない方法を見つけた人はいますか?

適切に進むように設定された進む/戻るボタンの処理は既に取得していますが、より適切な UI を使用したいと考えています。どんな助けでも大歓迎です。

4

5 に答える 5

123

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 を置き換えるというヒントがあります。

これはすべて試行錯誤に基づいているため、自由に修正してください。

ガレス

フィードバック コマンドとスキップフォワードのスクリーンショット

于 2014-07-18T06:14:51.423 に答える
3

うおおおお。Marco Arment は Overcast でこれを機能させ、少なくとも次のツイートで Castro の人たちにパンくずリストを残しました。

MPRemoteCommandCenter です。ただし、ドキュメントで頑張ってください。

これは、この質問をフォローしているすべての人のためskipBackwardCommandドキュメントskipForwardCommandです。すぐに調べる時間がないので、誰かが突っ込んでより完全な回答をしたい場合に備えて、ここに残しておきます.

于 2014-07-17T00:32:51.557 に答える