2011-10-31 2 views
9

私のアプリはFacebookにビデオをアップロードします。辛抱強くユーザーがアップロード中に[ホーム]ボタンをクリックしても、バックグラウンドでアップロードを完了したいと思います。iOS - バックグラウンドでロングプロセスを完了する方法

いくつか読みになった後、私はこれを試してみました:

 UIBackgroundTaskIdentifier bti = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:bti]; 
    }]; 

    [fb requestWithGraphPath:@"me/videos" 
        andParams:params 
       andHttpMethod:@"POST" 
        andDelegate:self]; 

    [[UIApplication sharedApplication] endBackgroundTask:bti]; 

作業がFB要求方式で行われます。動画はhttp接続経由でFacebookにアップロードされます。これは正常に動作しますが、アップロードの進行中に[ホーム]ボタンをクリックしてアプリをバックグラウンドで実行すると、アップロードは中断されます。アプリケーションをフォアグラウンドにすると、アップロードが再開されます。

私は、アップロードがバックグラウンドで終了することが予想されました。

これがうまくいくと思いますか?私はbeginBackgroundTaskのこと全体に何か間違っていますか?そのように動作するのは単純すぎるようですが、それはドキュメントが言うようなものです。

ご迷惑をおかけして申し訳ございません。

- あなたは、デリゲートのコールバックで[[UIApplication sharedApplication] endBackgroundTask:bti];を呼び出す必要がジョン

+0

@jhon私はバックグラウンドモードで動画をアップロードする必要があります。このコードブロックを訴えることはできますか?バックグラウンドで長時間実行されているプロセスに制限があるので、アップルが私のアプリを拒否する可能性はありますか? –

答えて

9

btiをivarまたは静的変数として格納する必要があります。

+0

私を正しい軌道に乗せてくれてありがとう。私はこの問題に苦しんでいるかもしれない人々のために、より詳細な答えを提供しました。 – John

15

さて、私はそれを理解しました。アプリケーションが終了しても、バックグラウンドで完了したい長いタスクの開始時に 'begin'コードを実行し、タスクが完了したら 'end'コードを実行する必要があります。

上記のコードは「終了」コードの実行が早すぎるため、ほぼ即座にバックグラウンドでの実行が終了します。長いタスクの開始時に

// make sure save can complete in the background 
    if ([[UIDevice currentDevice] isMultitaskingSupported]) 
     backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]; 

それを行う方法のような何かを行うことです。上のハイパークリプトは、「backgroundTaskIDは、長いタスクが完了した後に得ることができるivarまたは何かでなければなりません。

if ([[UIDevice currentDevice] isMultitaskingSupported]) { 
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID]; 
    backgroundTaskID = UIBackgroundTaskInvalid; 
} 

それは魔法のように動作:タスクが完了すると

、のようなものを実行します。

+2

John - あなたはスレッドをはがして、これをすべてスレッドに入れますか、または新しいスレッドからの信号を待ってから、メインスレッドのendBackgroundTaskを呼び出しますか? – Chris

+1

@Chris私は、新しいスレッドにプロセスを置くことをお勧めしたいと思います。バックグラウンドで実行する必要がある場合は、UIが詰まるのを避けるために、別のスレッドで実行する必要がある、複雑で長い作業です。 –

関連する問題