アプリが国のチャンネル (USA) に接続し、そのチャンネルからレコードの再生を開始する必要があります。これは基本的にユーザーが運営するチャンネルであり、ユーザーはレコードをチャンネルにアップロードし、1 つずつ再生します。チャンネルに接続したユーザーは、チャンネルを聴き始めます。
サーバーは、ソケット経由で再生する必要があるレコードの URL を iOS アプリに送信します。iOS アプリは、URL をAVQueuePlayer
( を使用してAVPlayerItems
) 1 つずつ再生するために作成します。
チャンネルがほぼ 1 日ほどレコードでいっぱいになっているときにアプリをバックグラウンドにしておくと、アプリは実行を続け、すべてのレコードを 1 つずつ再生し続けます。AVQueuePlayer
再生する新しいプレーヤー アイテムを受け取ると、アプリケーションを強制終了せずに常に実行する処理が行われることを私は知っています。
ただし、チャネルにレコードがなく、ユーザーがチャネルに接続した場合、アプリのアイドル時間が 10 分を超えると、アプリはバックグラウンドでレコードを再生しません。
新しいレコード URL を常に受信できるように、ソケット接続を開いたままにするバックグラウンド タスク識別子を使用してコードを記述しました。
デバイスにいくつかのクラッシュ レポートが表示されます。"AppName(my app) has active assertions beyond permitted time"
ここで何が問題なのかを知ることができますか。
バックグラウンドタスクコードも投稿しています
- (void)keepBroadcastPersistentConnection {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if(self._bgTaskIdentifier)
self._bgTaskIdentifier = UIBackgroundTaskInvalid;
self._bgTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{
[[UIApplication sharedApplication] endBackgroundTask:self._bgTaskIdentifier];
self._bgTaskIdentifier = UIBackgroundTaskInvalid;
CGLog(@"========================================end bg task at time %@", [NSDate date]);
CGLog(@"Time taken by app to run in bg is %f seconds", [[NSDate date] timeIntervalSinceDate:self.date]);
}];
[[BroadcastSocketConnecter sharedSocketConnecter].socketIO sendHeartbeat]; // this keep the socket alive
self.date = [NSDate date];
CGLog(@"========================================begin bg task at time %@", self.date);
});
}
ありがとう