シナリオ:
アプリは、ラジオ局から音楽をストリーミングするためのものです。これにはAVPlayerを使用しています。アプリはバックグラウンドで音楽を再生できます ( Required background modes
plist で)。アプリはロックされた画面から再生/一時停止アクションを受け取ることができます ( AVAudioSessionDelegate
andremoteControlReceivedWithEvent
メソッドを使用)。そして、この部分は大丈夫です。
問題
ユーザーがアプリを起動します。最初の画面がロードされたら、ユーザーは「再生」ボタンをタップします。これで、私のコードでは AVPlayer が初期化され、このタスクの準備が整うとすぐに音楽の再生が開始されます。ただし、このタスクは、高速 Wi-Fi でも 3 ~ 5 秒ほど続きます。
もちろん、ユーザーがホームボタンをタップできる 3 ~ 5 秒の間に、アプリはバックグラウンドになり、AVPlayer はオーディオの再生を開始しません。
どうすればこれを処理できますか? 駆け込んでみましたが、役に立ちませんでした[avplayer play]
。dispatch_async
また、AppDelegate で AVPlayer を初期化しようとしましたが、オーディオの読み込みが速くなりましたが、それでも、ユーザーはより速くなる可能性があります... この問題を解決するには、どのようなアプローチが適切ですか?
更新 - プレーヤーを初期化するためのコード
ヘッダー ファイル (MainViewController) 内: //MyPlayer は AVPlayer のサブクラスです
@property (nonatomic, strong) MyPlayer *playerBrain;
実装ファイル:
//lazy instantiation
- (MyPlayer*)playerBrain
{
if (_playerBrain == nil) _playerBrain = [[MyPlayer alloc] initWithURL:[NSURL URLWithString:@"correct_URL_To_MP3_File"]];
return _playerBrain;
}
- (IBAction)onOffSwitch:(UISwitch *)sender
{
if (sender.isOn)
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"inside block!");
[self.playerBrain playRadio];
});
}
else
{
[self.playerBrain pause];
}
}
// MyPlayer 実装内
- (void)playRadio
{
[self play]; //this is method from parent, AVPlayer
}