2

iOS アプリ (iOS > 5.0) を構築しようとしています。ユーザーが設定したタイマーが終了すると、音楽ファイルを再生する必要があります。これまでに行った場合の私のセットアップは次のとおりです。

  • AVプレイヤーを使っています
  • plist の Background Modes を「アプリがオーディオを再生する」に設定しました
  • 私のappDelegateには次のものがあります:

    NSError *sessionError = nil;
    [[AVAudioSession sharedInstance] setDelegate:self];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
    
  • 曲をセットで演奏する前に:

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
    [[AVAudioSession sharedInstance] setActive:YES error:&sessionError];
    
  • 「playerItemDidPlayToEnd」でアプリケーションに通知し、プレーヤーを停止して、music.app などの他のアプリに再びアクティブになるように指示します。

    _avPlayer = nil;
    NSError *sessionError = nil;
    [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:&sessionError];
    

これはうまくいきます。音楽アプリをバックグラウンドで再生できます。私のアプリは、音楽アプリがフェードアウトする曲の再生を開始します。私の曲が再生され、それが終了した場合、音楽アプリは引き続き再生されます。ただし、アプリがバックグラウンドにない限り。

バックグラウンドでエラーが発生します:

エラー ドメイン = NSOSStatusErrorDomain コード = 560161140 「操作を完了できませんでした。(OSStatus エラー 560161140。)」

バックグラウンドでの再生 (カスタム イベント) と、fe music.app とバックグラウンドでのアプリの切り替えの両方の組み合わせができない可能性はありますか?

ここに私のプレーヤーモデルのコードがあります: http://pastie.org/4830995

4

2 に答える 2

0

あなたの問題はバックグラウンド処理にあると思います。アプリ デリゲートでこの関数をオーバーライドする必要があります。

  - (void)applicationDidEnterBackground:(UIApplication *)application
{
 __block UIBackgroundTaskIdentifier task = 0;
 task=[application beginBackgroundTaskWithExpirationHandler:^{
     NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]);
    [application endBackgroundTask:task];
    task=UIBackgroundTaskInvalid;
}];

}

サウンドが再生されない限り、アプリケーションは 6 分後に強制終了されます。ユーザーがタイマーを 6 分以上に設定した場合、5.5 分ごとに非常に短いサウンドを再生して、アプリを存続させ、新しいバックグラウンド タスクを開始することができます。また、多くのことがバックグラウンドで実行されないことを考慮する必要があります。私はあなたがやっていることと幾分似たようなことをしました。私がしたことは、音楽の再生とアプリケーションの期限切れを処理する NSObject witch のカスタム サブクラスを作成することでした。多くの機能と通知がバックグラウンドで VC で実行されないため、デリゲートの強力なプロパティにしました。

ただし、サウンドを再生したいだけの場合、これは最善のアプローチではない可能性があります。おそらく、ローカル通知を送信するだけで十分でしょう。

これが役に立ったことを願っています。

于 2012-09-27T11:20:34.343 に答える
-1

アプリをオーディオ アプリとしてバックグラウンドで実行し続けるように登録しましたか? これを行うには、UIBackgroundModesキーをInfo.plistファイルに追加し、その値を に設定しますaudio

于 2012-09-27T11:06:48.567 に答える