2017-06-21 8 views
1

私は[MPMusicPlayerController applicationMusicPlayer]を使用してApple Musicを再生しています。 (AVPlayerとAVAudioPlayerはApple Musicでは動作しません)バックグラウンドでApple Musicを再生

バックグラウンドでは、いつ次の曲を再生できるかを知る必要があります。残念ながら、MPMusicPlayerControllerPlaybackStateDidChangeNotificationは、アプリケーションがバックグラウンドにある間は起動されません。

私はbeginBackgroundTaskWithExpirationHandlerを使ってバックグラウンドタスクを作成しました。これは、NSTimerを1秒に1回起動して曲の終わりをチェックします。音声の背景モードが設定されていますが、私の仕事はまだ3分しかかかりません。私がオーディオバックグラウンドモードを使用すると、私の仕事は無限の時間になると私は理解していました。それは本当ですか?そうでない場合は、どうすればこの問題を処理できますか?確かに他の人がこのような状況に遭遇しました。

答えて

0

私はAppStoreでほぼ同じアプリをリリースしました。 [MPMusicPlayerController applicationMusicPlayer]を使用して曲を再生します。

はい、MPMusicPlayerControllerPlaybackStateDidChangeNotificationはバックグラウンドアプリにはなりませんでした。 それで、NSTimerを使って曲がいつ終了するかを判断しました。 NSTimerを1秒に設定しています。私はNSTimerを曲の演奏時間に設定しました。すなわち、曲が3分15秒の時間を有するとき、NSTimerを3分15秒に設定する。

ユーザーが音楽を一時停止すると、NSTimerが一時停止します。 そして、ユーザーが音楽を再開すると、NSTimerを曲の残りの時間に設定します。

非常にうまく動作します。 これがあなたを助けてくれることを願っています。 申し訳ありませんが私のcheepの英語です。


手順が必要な場合があります。

  1. 機能設定でオーディオ背景モードを設定します。 (完了しました)
  2. App DelegateでbeginBackgroundTaskWithExpirationHandlerを使用します。非繰り返しモードで
 
    - (void)applicationWillResignActive:(UIApplication *)application 
    { 
     _bgid = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) 
     { 
      [[UIApplication sharedApplication] endBackgroundTask:_bgid]; 

      _bgid = UIBackgroundTaskInvalid; 
     }]; 
    } 

    - (void)applicationDidBecomeActive:(UIApplication *)application 
    { 
     if (_bgid != UIBackgroundTaskInvalid) 
     { 
      [[UIApplication sharedApplication] endBackgroundTask:_bgid]; 
     } 
    } 


3.Use NSTimer。今後の参考のために

 

    #import "NMCountdownTimer.h" 

    @interface NMCountdownTimer() 
    { 
    @private 
     NSTimer *_timer; 
     NSTimeInterval _rest; 
     NMMethodCompletion _completion; 
    } 
    @end 

    @implementation NMCountdownTimer 

    - (void)start:(NSTimeInterval)secs completion:(NMMethodCompletion _Nullable)completion 
    { 
     _completion = completion; 

     if (secs > 0.0f) 
     { 
      NSLog(@"[ ] start (secs:%f)", secs); 
      _timer = [NSTimer scheduledTimerWithTimeInterval:secs target:self selector:@selector(fired) userInfo:nil repeats:FALSE]; 
      _rest = 0.0f; 
     } 
    } 

    - (void)pause 
    { 
     if (_timer && (_rest == 0.0f)) 
     { 
      _rest = [[_timer fireDate] timeIntervalSinceReferenceDate] - [[NSDate date] timeIntervalSinceReferenceDate]; 

      NSLog(@"[ ] pause (rest:%f)", _rest); 

      [_timer invalidate]; 
      _timer = nil; 
     } 
    } 

    - (void)resume 
    { 
     if ((! _timer) && (_rest > 0.0f)) 
     { 
      NSLog(@"[ ] resume (rest:%f)", _rest); 
      _timer = [NSTimer scheduledTimerWithTimeInterval:_rest target:self selector:@selector(fired) userInfo:nil repeats:FALSE]; 
      _rest = 0.0f; 
     } 
    } 

    - (void)kill 
    { 
     [_timer invalidate]; 
     _timer = nil; 
     _rest = 0.0f; 
     _completion = nil; 

     NSLog(@"[ ] kill"); 
    } 

    - (void)fired 
    { 
     [_timer invalidate]; 
     _timer = nil; 
     _rest = 0.0f; 

     if (_completion) 
     { 
      _completion (nil); 
     } 

     NSLog(@"[ ] fired"); 
    } 

    - (void)dealloc 
    { 
    #if (Namera_SHOW_DEALLOC && FALSE) 
     NSLog(@"[DEA] %@ NMCountdownTimer", self); 
    #endif 

     _timer = nil; 
     _completion = nil; 
    } 

    @end 
 
    somewhere in your code like this; 

    NSTimeInterval playback_duration = [[song valueForProperty: MPMediaItemPropertyPlaybackDuration] doubleValue]; 

    .... 

    MPMediaItemCollection *collection = [MPMediaItemCollection collectionWithItems:[NSArray arrayWithObject:song]]; 

    [_musicCtr setQueueWithItemCollection:collection]; 
    [_musicCtr play]; 
    [_countdown_timer start:playback_duration completion:^(id _Nullable object) 
    { 
     [weakSelf execute_next_song]; 
    }]; 
+0

繰り返しモードのNSTimerはバックグラウンドでうまく動作しないと思います。私は非繰り返しモードで使用しました。 –

+0

全く同じことを試しましたが、3分後にNSTimerが起動しなくなりました。だから私の本当の疑問は、どうすれば3分以上かかるのだろうか?オーディオ背景モードが設定されています。 –

0

私はapplicationMusicPlayerまたはsystemMusicPlayerのいずれかを使用して、MPMusicPlayerControllerはオーディオUIBackgroundModeに係合することはないことがわかりました。だから、3分以上のバックグラウンドタイムを得ることはできません。ただし、AVAudioPlayerはオーディオ背景モードを使用しません。だから私の(醜い)解決策は、バックグラウンドでAVAudioPlayerを使ってサイレントMP3をループすることです。私はアップルが抗議しないと仮定しようとしている、これは静かなオーディオの正当な使用のようだ。 AVAudioPlayerとMPMusicPlayerControllerの両方を同時に再生するには、AVAudioSessionCategoryOptionMixWithOthersをAVAudioSessionに設定する必要があります。

+0

コントロールセンターで情報を再生するソリューションを考え出すことができましたか? applicationQueuePlayerを使用していて、音楽を再生することができますが、コントロールセンターはMPNowPlayingInfoCenterで更新されません。在庫音楽アプリ情報を保持します。 – Benr783

関連する問題