2011-12-21 9 views
0

私のアプリケーションは、 'App plays audio'に設定されたUIBackgroundModesを使用するための要件を満たしています。私のアプリケーションでは、MPMusicPlayerController iPodMusicPlayerクラスの音楽が再生されます。私が達成しようとしているのは、ユーザーが音楽を停止するタイマーを設定できるようにすることです。私はこれに問題があります。 checkTimeRemaining方法でバックグラウンドサービスは「バックグラウンドで実行中」を許可されています。では、なぜこれを動作させることができないのですか?

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    UIDevice* device = [UIDevice currentDevice]; 
    BOOL backgroundSupported = NO; 
    if ([device respondsToSelector:@selector(isMultitaskingSupported)]) { 
     backgroundSupported = device.multitaskingSupported; 
    } 

    if (backgroundSupported) { 
     UIApplication* app = [UIApplication sharedApplication]; 
     bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (bgTask != UIBackgroundTaskInvalid) { 
        [app endBackgroundTask:bgTask]; 
       } 
      }); 
     }]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (bgTask != UIBackgroundTaskInvalid) { 
        if (rootController.sleepTimer != nil) 
        self.sustainTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkTimeRemaining) userInfo:nil repeats:YES];  
       } 

      }); 
     }); 
    } 
} 

:次のように私はapplicationDidEnterBackground方法でバックグラウンドタスクを実装しました

-(void)checkTimeRemaining{ 
    NSTimeInterval totalSeconds = rootController.timerSetInSeconds.doubleValue; 
    NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:rootController.startDateforSleepTimer]; 
    NSTimeInterval remainingTime = totalSeconds - elapsedTime; 
    NSLog(@"remaining time %f",remainingTime); 
    if (remainingTime <= 0) { 
     [self.musicPlayer pause]; 
     [sustainTimer invalidate]; 
     self.sustainTimer = nil; 
    } 
} 

私はすべてのエラーを得ていないんだけど、タイマーは超えません10分を許容した。私はオーディオを再生しているので(バックグラウンドモードのセットと一緒に)、指定された時間に音楽を止めることができます。私がどこに間違っているかについてのアイデアは?

おかげ

答えて

0

オーディオ、バックグラウンドモードの設定は、オーディオ処理がオーディオ停止するまでバックグラウンドで継続することができますので、あなたはそれを動作させることはできません。 BackgroundTaskWithExpirationHandlerのようなオーディオ以外のものに特別な権限を与えて続行しません。

Audio QueueまたはRemoteIO Audio Unitのバッファコールバックに時間を記録しても、オーディオが再生されている間は、コールバックが継続されます。

+0

こんにちは。私がまだ 'iPodMusicPlayer'コントローラを使用しているかどうかをあなたが記述していますか?これを実装する方法を学び始めるのに最適な場所はどこですか?これがスリープタイマーアプリがこれを達成している様子です。彼らはまだiPodの音楽コントローラを使用することができます。 – sooper

1

beginBackgroundTaskWithExpirationHandlerは、有限の長さのタスクしか実行できないため、あなたのタイマーはAppleが課した10分の制限時間に制限されています。一方で、Audioフレームワークは、内部的に、ユーザがオーディオを停止するか、オーディオが終了するまで、バックグラウンドでオーディオを再生することができます。

Playing Background Audio

UIBackgroundModesキーはオーディオ値が含まれている場合、システムの メディアフレームワークは自動的にバックグラウンドに移動したときに中断される から対応アプリを防ぎます。 オーディオまたはビデオコンテンツを再生している限り、アプリは引き続き のバックグラウンドで実行されます。しかし、アプリケーションがオーディオやビデオの再生を停止すると、 システムはそれを中断します。

+0

こんにちは、私に戻ってくれてありがとう。 AppStoreには何とかこれを実装しているアプリがいくつかあります。彼らはiPodMusicPlayerコントローラを使って音楽を再生しています。ユーザーが時間を設定してデバイスをロックすると、x分/時間後に音楽が停止します。彼らはどのようにこれを達成していますか? – sooper

+0

私のステートメントの最後の行「またはオーディオが終了しました」は、オーディオを終了する方法を探る手がかりでした:)。 @ hotpaw2が推奨しているものを見てください。オーディオキューがあなたのコードにコールバックし続けるならば、それを止めることができます。 – Joe

+0

申し訳ありませんが、それにはほとんど気づかなかったのです。助けてくれてありがとう。 – sooper

関連する問題