8

バックグラウンドでオーディオを再生するアプリがあります。beginBackgroundTaskWithExpirationHandler現在のトラックが終了したら、次のトラックにスキップするために使用しようとしています。

再生状態が変化したときに呼び出されるコードは次のとおりです。同じメソッド内の他のコードがバックグラウンドで正常に実装されていても、「呼び出されたbeginBG」をログに記録することはありません。

UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [self ffwButtonPressed:ffwButton];
    NSLog(@"beginBG called");
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

ffwButtonPressedトラックを変更するためにいくつかの異なるメソッドを呼び出します。それが完了したら...

UIApplication *app = [UIApplication sharedApplication];
    if (bgTask != UIBackgroundTaskInvalid) {
        [app endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid;
        NSLog(@"end bgTask");

編集:宣言

UIBackgroundTaskIdentifier bgTask;

編集: ViewDidLoadで

bgTask = 0;
4

7 に答える 7

30

あなたは実際に機能を誤解しています -(UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler

「ハンドラー」と呼ばれるブロック引数は、バックグラウンドタスクが期限切れになったときに発生するものです(10分)。

コードを実行するには、コードを有効期限ハンドラーから外す必要があります。

UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    bgTask = UIBackgroundTaskInvalid;
};

[self ffwButtonPressed:ffwButton];
NSLog(@"beginBG called");
[app endBackgroundTask:bgTask];

ドキュメントへのリンクは次のとおりです

于 2012-07-25T17:24:53.513 に答える
2

まったく必要なくなってしまいましたbeginBackgroundTaskWithExpirationHandler。この行は私の問題を解決しました...

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];  
于 2012-07-24T15:39:35.707 に答える
0

アプリには、オーディオアプリとしてバックグラウンドで実行する権限がありますか?(Info.plistに適切なモードを設定する必要があります)

Appleのドキュメントを参照してください

于 2013-08-27T17:35:31.457 に答える
0

beginBackgroundTaskWithExpirationHandlerハンドラーは、かなり大きな値のタイマーが不足した場合にのみ呼び出されます。上記のTomsumが述べたような実際のタスクは、ブロックの一部であってはなりません。また、endBackgroundTaskを呼び出すことを忘れないでください。最後にbackGroundTaskID!= UIBackgroundTaskInvalidであり、ブロックで実行する必要があるのは、タスク変数=UIBackgroundTaskInvalidを設定することだけです。

于 2013-10-02T09:34:47.227 に答える
0

Swiftバージョン:

    var backgroundTask: UIBackgroundTaskIdentifier? = 0
    backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "backgroundTask", expirationHandler: {() -> Void in
        backgroundTask = UIBackgroundTaskInvalid
    })

    // Perform actions in background
    YOUR_CODE_GOES_HERE (e.g. fetch requests, etc.)

    UIApplication.shared.endBackgroundTask(backgroundTask!)
于 2018-10-19T15:13:12.977 に答える
0

少し変更することができます。有効期限ハンドラーにendBackgroundTaskを追加する必要があります。

IApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
};

[self ffwButtonPressed:ffwButton];
NSLog(@"beginBG called");
[app endBackgroundTask:bgTask];
于 2020-04-05T10:21:40.127 に答える
-1

これはすべてあなたのコードですか?bgTask変数が初期化されていない可能性があります。割り当てる前にbgTaskを宣言する必要があります。これを試して -

UIBackgroundTaskIdentifier bgTask = nil;
于 2012-07-23T17:58:35.027 に答える