2011-10-09 18 views
10

私はバックグラウンドでも常に実行されるvoipアプリケーションを持っています。 私はバックグラウンドにいるうちに、メインスレッドから呼び出しています。(ネットワークが失われたと診断した場合にネットワーク接続を確立するため)PerformSelector遅延がバックグラウンドモードで実行されなかった後 - iPhone

[self performSelector :@selector(Reconnect:) withObject:nil afterDelay:60.0]; 

ただし、セレクタは、アプリがフォアグラウンドに戻るときにのみ実行されます。 特にセレクタをバックグラウンドで実行させるには何かを行う必要がありますか?

おかげ

編集:

-(void) reconectInBackgroundAfterDelay:(NSTimeInterval) dealy 
{ 
    NSLog(@"reconectInBackgroundAfterDelay"); 
    UIApplication* app = [UIApplication sharedApplication]; 

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

    // Start the long-running task and return immediately. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     [self performSelector :@selector(Reconnect:) withObject:nil afterDelay:dealy]; 

     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }); 
} 

私の代わりにこのコードを追加しましたが、まだ「再接続」の方法が提供される遅延の後に呼び出さなっていません。 私はすでに背景にいるうちに "reconectInBackgroundAfterDelay"メソッドを呼び出します。

他の提案はありますか?

編集2 解決策が見つかりました。下記を参照

答えて

22

私がこれまでに見つかった唯一の解決策:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(Reconnect:) userInfo:nil repeats:NO];  

     [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode]; 

     [[NSRunLoop currentRunLoop] run]; 
    }); 
+0

ありがとう、それはうまくいきます。 –

+0

私のアプリケーションもvoipアプリケーションです。しかし、私のアプリは最初に登録する前にサーバからファイルをダウンロードしていました。ソリューションを使用してダウンロードを続けることは可能ですか? –

+0

ここには[http://stackoverflow.com/questions/14828955/download-files-using-http-request-in-background-in-iphone-above-ios-4-0#comment20777172_14828955] [私の質問] –

1

beginBackgroundTaskWithExpirationHandlerブロックにこのラインを挿入しましたか? http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.htmlにある有限長のタスクの完了を参照してください。

+0

私はバックグラウンドタスクを使用していません。私のアプリはvoipアプリケーションなので、バックグラウンドで常時実行して、ネットワーク接続を永続的に維持できます。ここにバックグラウンドタスクを使用する理由が表示されない場合は、どちらが助けになるかはわかりません。 – Idan

+0

VoIPアプリケーションは常にバックグラウンドで実行されません。 [iOSアプリケーションプログラミングガイド](http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5- SW15):「VoIPアプリケーションを常に起き続けるのではなく、システムを停止させ、ソケットを監視する機能を提供します。着信トラフィックが検出されると、システムはVoIPアプリケーションを起動し、ソケットの制御を返しますそれに " – omz

+0

さて、私はバックグラウンドで私のTCP接続を失ったとし、接続を再確立するために2分後にセレクタをスケジュールしたいとします。それ以降の選択を実行しない場合、どのように達成する必要がありますか?明らかにバックグラウンドタスクはここでは適切ではありません。 – Idan

1

私はテストそれは、いくつかの時間のためだったというのiOSバックグラウンドで実行中のときcorebluetoothイベント来て、あなたが何かの遅延使用NSTimerオブジェクトをしたい場合は、 10秒未満でなければならず、10秒を超えるとタイマーは無効になります。

+1

ここ10秒の意味は何ですか?あなたはそれを論理的に説明できますか? (CBCentralManager *)中央:(空)centralManager - 返事が遅れて申し訳ありません – Swamy

+0

、私は がDELAY_EVENT_TIME 10以上の場合、このdoSomethingののfuncが の#define DELAY_EVENT_TIME 8 に呼ばれることはありません、次のコードを参照してください例をあげてみましょうdidConnectPeripheral:(CBPeripheral *)周辺機器 { [NSTimer scheduledTimerWithTimeInterval:DELAY_EVENT_TIMEターゲット:セルフセレクタ:@セレクタ(doSomething)userInfo:nil repeats:NO]; } - (void)doSomething { \t NSLog(@ "doSomething delay!"); } – DDZ

関連する問題