1

接続時に、ユーザーの接続の最後にこのコードを追加しました。

    UIBackgroundTaskIdentifier myLongTask;
    myLongTask = [[UIApplication sharedApplication]
                  beginBackgroundTaskWithExpirationHandler:^{
                      //   If you're worried about exceeding 10 minutes, handle it here
                  }];

    CFRunLoopRun();
    [[UIApplication sharedApplication] endBackgroundTask:myLongTask];  

ビルド設定も設定しました。アプリケーションにはwifiが必要です。これは、ソケットを使用する基本的なクライアントです。

以前は iPad をロックするとインターネットが使えなくなりました。iPadがロックされてから10分間は生き続けると思っていましたが、何らかの理由で今のところ無期限に残っています。電話をロックし、戻ってきてロックを解除してから30分以上インターネットがオンになっていることを測定しましたが、接続はまだチャットをストリーミングしています.

私はこれがVOIPアプリであることについて読んでいた特別な設定を何も設定していませんでしたが、これはアプリストアで受け入れられるための合法的なアプリの動作ではないかもしれないと心配しています. beginBackgroundTaskWithExpirationHandler を使用しましたが、アプリケーションにはインターネットが必要です。実際にアプリケーションが実際にスリープしない場合、長期的なバッテリーへの影響についても心配していますが、接続しているサーバーは60分間アイドル状態になると切断されるため、無期限に接続されたままになることはありませんが、このループが常に発生する場合は依然として懸念されます切断後も動作し、バッテリーを使用する可能性があります。たとえば、ユーザーがアプリを離れて 1 週間以上戻ってこず、iPad が 1 週間ロックされたままになっている場合、高速バッテリーを使用しますか? 私のテストは'

助言がありますか?10分間の画面ロック後にアプリがスリープしない理由を知っている人はいますか?

マイク

4

2 に答える 2

1

OSはあなたを殺すかもしれませんし、そうでないかもしれません。10分は「ガイドライン」に似ていますが、OSはとにかく早くまたは後であなたを殺すかもしれません.

ただし、CFRunloopRun はほぼ無期限に実行されます (ソースが接続されているか停止されている限り)。それが終了していることを確認するか、bg タスクを終了しないでください。

禁止されていませんが、クールではありません!

于 2013-03-17T14:37:41.093 に答える
0

これは、バックグラウンド タスク リクエストを設定する非常に奇妙な方法です。CFRunLoopRun()このように手動で呼び出すこともまれです。UIApplicationMain()メインループでこれを行うという事実は、標準関数を使用していないことを示唆しています。そうでない場合は、アプリケーションを正しく設定していない可能性があり、動作が不安定になる可能性があります。通常の方法でバックグラウンド タスクを使用してみましたか。

  • beginBackgroundTaskWithExpirationHandler:
  • プログラムがバックグラウンドになっても、実行したい特定のタスクを実行します
  • endBackgroundTask:そのタスクが完了したとき

あなたがやっている方法は、endBackgroundTask:おそらく決して呼び出されません。


編集: OS が実行を許可している限り (約 10 分) バックグラウンドに入った後に実行を許可することが目標の場合は、 を呼び出しbeginBackgroundTaskWithExpirationHandler:ますapplicationWillEnterBackground:。ランループを特別に使用する必要はありません。停止するまで続行することをOSに伝えるだけです。

于 2013-03-17T18:05:27.580 に答える