1

voip アプリがあり、バックグラウンドで実行する必要があります。私の理解では、これらは私がする必要があることです:

  1. アプリに voip のフラグを立てます。
  2. 「アプリケーションはバックグラウンドで実行されません」フラグを NO に設定します。
  3. 有効期限ハンドラーを設定します。これは、標準の 10 分間の実行時間を延長するコードです。
  4. もっと?

info.plist ファイルに両方のフラグを設定すると、10 分が表示されます。この投稿で提案されていることを試しました。これが私のコードです:

//in didFinishLaunchingWithOptions:
expirationHandler = ^{
    NSLog(@"ending background task");
    [[UIApplication sharedApplication] endBackgroundTask:bgTask];

    NSLog(@"restarting background task");
    bgTask = UIBackgroundTaskInvalid;
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];

    NSLog(@"finished running background task");
};

//in applicationDidEnterBackground
NSLog(@"entering background mode");
bgTask = UIBackgroundTaskInvalid;
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];

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

    // inform others to stop tasks, if you like
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationEntersBackground" object:self];

    //this while loop is just here for testing
    inBackground = true;
    while (inBackground) {
        NSLog(@"stayin alive!!"); //this keeps going forever
        sleep(10);
    }
});

状況:

Web サービスとの通信を処理するサードパーティ ライブラリを使用しています。このサービスは CommuniGate pro サーバーです。ライブラリを介して連絡先からプレゼンスの更新情報 (オンライン/オフライン) とインスタント メッセージを受け取ります。ライブラリは CommuniGate の ximss ライブラリであり、xmpp に似たプロトコルであり、IM とプレゼンスだけでなく、xml ベースの sip 要求にも使用されます。ユーザーがアプリにログインすると、連絡先 (CmmuniGate の友達リスト) が表示され、その連絡先に電話することを選択できます。ximss 検証メッセージが送信され、相手側が通話を受け入れた後、通話の開始時刻が記録され、facetime 通話が開始されます。

問題:

ホームボタンを押してアプリがバックグラウンドに入ると、ログに「stayin alive」メッセージが表示され始め、10 分ごとにバックグラウンド タスクが再起動されます。
電源ボタンを押してアプリがバックグラウンドに入ると、「稼働中」メッセージが 10 分間表示され始めます。その後、バックグラウンド タスクが再起動され、約 50 ~ 100 ミリ秒ごとに再起動されます。
アップデートに取り組む時間はあるし、私たちのユーザーは iPad を所有していないので、バッテリーを食い尽くすとしても、今のところはこれで問題ありません。私にとっての問題は、ximss ライブラリが接続を失うことです (セッションベースです)。ライブラリでセッションを再開することはできましたが、これは、連絡先リストを取得するためにかなりの量のデータ転送が必要になることを意味し、一部のユーザーは 3g を使用しています。
ライブラリのソースを編集することも見ることもできないので、ソケットが正しい方法で作成されるかどうかわかりません。

両方の状況を正しく処理するにはどうすればよいですか? なぜ違いがあるのか​​さえ理解できません。

4

1 に答える 1