私は、実行中にいくつかの TCP および UDP ソケットをバインドしておく必要がある社内アプリ (iPhone ストア配布用ではないため、Apple の承認の対象ではありません) を持っています。
テスト中に、バインドされたソケットに奇妙な動作があることに気付きました。デバイスがスリープ状態になると、ソケットが閉じられます。これは、たとえば、電話の上部にある電源ボタンを押したときに発生しますが、私は本当にそれをしたくありません. 言うまでもなく、BSD ソケット API 契約に対する重大な違反のようです。
ソケット コードはすべて C で記述されているため、Objective-C nsstreamライブラリを使用していません。
VOIP、音楽ストリーミングなどのためにソケットを開いたままにしておくには、さまざまな方法があることに気付きました。nsstream のドキュメント自体にはNSStreamNetworkServiceTypeBackground
、電話がスリープ状態になったときにアプリがソケットを開いたままにしておくのに役立つと思われるプロパティがリストされています。Apple ドキュメントの下部には、次のプロパティがリストされています。
定数
NSStreamNetworkServiceTypeVoIP
ストリームが VoIP サービスを提供していることを指定します。
NSStreamNetworkServiceTypeVideo
ストリームがビデオ サービスを提供していることを指定します。
NSStreamNetworkServiceTypeBackground
ストリームがバックグラウンド サービスを提供していることを指定します。
NSStreamNetworkServiceTypeVoice
ストリームが音声サービスを提供していることを指定します。
しかし、私のアプリのネットワーク コードは Objective-C API を使用していないため、知る必要があります: 上記の定数はどのように実装されていますか? 同じ結果を得るために使用できる文書化されていないソケットオプションがあるのでしょうか? 基本的に、デバイスがスリープしているときにソケットをいじらないようにカーネルに指示する必要があるだけです。
edit : カーネル呼び出しをリバース エンジニアリングする代わりに、これらのオプションを適用できる Objective-C コードにソケット ファイル記述子を渡す方法があるのではないでしょうか?