voip アプリがあり、バックグラウンドで実行する必要があります。私の理解では、これらは私がする必要があることです:
- アプリに voip のフラグを立てます。
- 「アプリケーションはバックグラウンドで実行されません」フラグを NO に設定します。
- 有効期限ハンドラーを設定します。これは、標準の 10 分間の実行時間を延長するコードです。
- もっと?
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 を使用しています。
ライブラリのソースを編集することも見ることもできないので、ソケットが正しい方法で作成されるかどうかわかりません。
両方の状況を正しく処理するにはどうすればよいですか? なぜ違いがあるのかさえ理解できません。