web-dev-qa-db-ja.com

MPNowPlayingInfoCenterにポッドキャストコントロールを強制的に表示するパブリックな方法はありますか?

コントロールセンター(MPNowPlayingInfoCenter経由)に、Appleポッドキャストで表示される次の15秒/ 15秒のコントロールを表示するようにしたい:

podcast controls

ドキュメントの完全な欠如は、これを行うobviousの方法がないことを教えてくれますが、プライベートメソッドに頼らずにこれを強制する非自明な方法を見つけた人はいますか?

進む/戻るボタンの処理を適切に進めるように設定済みなので、より適切なUIを使用したいだけです。どんな助けも大歓迎です。

50
DesignatedNerd

わかりましたので、少し時間を取って、パンくずリストをたどりました。これが私が見つけたものです。

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も定義されていますが、これをCommand Centerから起動することはできませんでした-ヘッドフォンから起動します。)

その他の発見:ボタンは左/中央/右の固定位置にあるため、両方とも左位置を占めるため、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ハンドラーでもイベントをトリガーします。これらはUIEventTypeRemoteControl型とイベントを区別するサブタイプを持つUIEventです。このメソッドでは、これらをMPRemoteCommandEventsと組み合わせて使用​​することはできません。 MPRemoteCommandEventsがある時点でUIEventsを置き換えるというヒントがあります。

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

ガレス

Screenshot of feedback command and skipforward

116
Gareth

Swift開発者向け

import MediaPlayer

let rcc = MPRemoteCommandCenter.shared()

let skipBackwardCommand = rcc.skipBackwardCommand
skipBackwardCommand.isEnabled = true
skipBackwardCommand.addTarget(handler: skipBackward)
skipBackwardCommand.preferredIntervals = [42]

let skipForwardCommand = rcc.skipForwardCommand
skipForwardCommand.isEnabled = true
skipForwardCommand.addTarget(handler: skipForward)
skipForwardCommand.preferredIntervals = [42]

func skipBackward(_ event: MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus {
    guard let command = event.command as? MPSkipIntervalCommand else {
        return .noSuchContent
    }

    let interval = command.preferredIntervals[0]

    print(interval) //Output: 42

    return .success
}

func skipForward(_ event: MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus {
    guard let command = event.command as? MPSkipIntervalCommand else {
        return .noSuchContent
    }

    let interval = command.preferredIntervals[0]

    print(interval) //Output: 42

    return .success
}

他のコマンドも同様であり、チェックすることができます here

7
zombie

おっと。 Marco ArmentはこれをOvercastで動作するようにし、少なくとも this Tweet :でCastroの人たちにパンくずリストを残しました。

MPRemoteCommandCenterです。ただし、ドキュメントは幸運です。

ドキュメントを参照 この質問をフォローしている人は誰でも-skipBackwardCommandskipForwardCommandに関係していると思います。私はこれをすぐに調べる時間がないので、だれかがそれを突いて、より徹底的な答えをしたい場合に備えて、ここに残しておきます。

3
DesignatedNerd

これを変更する方法がないため、Appleにはドキュメントがありません。繰り返しになりますが、Appleは最高のものを保持しています(Siriも思い浮かびます)。

ジェイルブレイクバージョンは、コントロールセンターのボタンの変更をサポートしています。これは このサイト で見つけました。ジェイルブレイクされたバージョンではなく、actualiOS 7でこのアプリを使用したいので、これはまったく役に立ちません。

これらのプライベートAPIは、良いアプリを頻繁に開発する妨げになります。 Appleが現在プライベートAPIを使用する自由を与えてくれない限り、あなたは運が悪い。

2
erdekhayser

他の回答に加えて、MPNowPlayingInfoCenterでnowPlayingInfoを設定しなかった場合、スキップボタンは表示されませんが、デフォルトのnextTrackボタンとPreviousTrackボタンが表示されます。 (プレーンな早送りボタンと巻き戻しボタンが表示されます)MPNowPlayingInfoCenter.defaultCenter()。nowPlayingInfoを次のような時点で設定していることを確認してください。

 var songInfo: NSMutableDictionary = [
        MPMediaItemPropertyTitle: "song title",
        MPMediaItemPropertyArtist: "artist ",
        MPNowPlayingInfoPropertyElapsedPlaybackTime: "0"
    ]
    MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = songInfo as [NSObject : AnyObject]
0
grizzb