私は、5秒ごとに "ping"という単語を送信する単純なTCPサーバーに接続する単純なTCPクライアントを持っています。標準のCソケットライブラリから読み込んだコマンドを使って、これらの「ping」を読みます。iphoneOSバックグラウンドソケット
int numberOfBytes = read(m_clientSocketFileDescriptor,buffer,255);
if (numberOfBytes < 0) {
error("reading from socket");
}
私は、アプリケーションのplistファイルでWIFIの使用状況、バックグラウンドのサウンドとバックグラウンドのVOIPの値を設定しました。 私は私のソケットは、次のようにバックグラウンドにすることを宣言:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
if (m_clientSocketFileDescriptor) {
CFStreamCreatePairWithSocket(kCFAllocatorDefault, m_clientSocketFileDescriptor, &m_tcpReadStream, nil);
if (m_tcpReadStream != NULL) {
CFReadStreamSetProperty(m_tcpReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
}
}
}
私はホームボタンを押したときにこれは完璧に動作します。私のpingはサーバーから受信され、アプリケーションを起動するとすべてのメッセージが受信されます。 私の問題は、iPhoneの画面をロックするために電源ボタンを使用するときです。ソケットは実際に閉じています。私のサーバーはSIGPIPEエラーを受け取りました。私が電話を起動すると、read()関数は "ソケットが接続していません"というメッセージを表示します。
ユーザが画面をロックしたときに背景のソケットを持っているのはかなり馬鹿だと思う(デフォルトでは、1〜5分の間にこのようなことが起こる)ので、間違ったやり方で。
誰でもこの問題を解決できましたか? iphone 3GS & iphone 4でiOS 5.0でテスト済み。
@DarkDustで提案されているように、 'setKeepAliveTimeout:handler:'を試しましたか? おそらく、 'applicationWillResignActive:'で何らかの準備をするのでしょうか? – Thompsonian