バックグラウンドで吊り下げられた携帯電話をロックした後、壊れたパイプを削除します
-
28-10-2019 - |
質問
私は使用しています asyncudpsocket 私のiPhoneアプリのサードパーティライブラリとほとんどの場合、それはうまく機能します。私はanのシングルトンインスタンスを持っています AsyncUDPSocket
すべてのネットワークトラフィックに使用すること。私のアプリは、バックグラウンドでロケーショントラッキングに登録されており、目覚めてバックグラウンドで実行中にネットワーク上でロケーション更新パケットを送信します。これは、以下を行う場合を除き、バックグラウンド、フォアグラウンド、電話ロックまたはロック解除でバックグラウンドで粉砕して実行されています。
- アプリを始めてください
- アプリの設定でロケーショントラッキングを無効にします(したがって、背景は目覚めません)
- ホームボタンを押します(アプリがバックグラウンドに入り、ソケットはアプリの残りの部分で「フリーズドライ」です)
- 電話をロックします
- 電話のロックを解除します
- 履歴書アプリ
- 追跡を再起動して、ソケットから何かを送信しようとします。私が試みるとすぐに、私は取得します
SIGPIPE
/EPIPE
エラーとアプリがクラッシュします。
これに対処するための最良の方法は、アプリケーションの終了とバックグラウンド追跡が有効になっているときはいつでもソケットを閉じてリリースすることだと思いましたが、試してみると [socket close]
また [socket release]
に AsyncUDPSocket
, 、私はさまざまになります EXC_BAD_ACCESS
エラー。私は開発チームにバグを提出しましたが、ここの誰かがどちらかを避ける方法についていくつかのアイデアを与えることができるかどうか疑問に思っていました SIGPIPE
完全にエラーまたはソケットをリリースせずに生かし続ける他の方法。ありがとう。
解決 2
誰かが好奇心を持っている場合に備えて(この質問の統計から判断すると、そうではありません)、私は何が原因であるかを判断できませんでした SIGPIPE
エラーですが、最終的に私のメモリ管理の問題を整理しました(これはの実装が誤っていたためでした onUdpSocketDidClose
私の代表者で)では、アプリが再起動するたびにソケットを再活性化できるようにします。
他のヒント
素晴らしい観察 - はい、タスクをバックグラウンドに送信してから電話をロックした後、ソケットが落とされ、次に使用しようとすると、Sigpipeでbl打が出されます。
ここでそれに対処する方法に関するアイデア:バックグラウンドタスクを切り替えるときにSigpipeクラッシュ(それは、アプリ全体のSigpipeまたはソケットのために無視するか、それにハンラーを提供するかのどちらかです)
詩また、Sigpipeを無視するように設定は、添付のデバッガーでは動作しないため、w/oと比較してください。