Javaチャットサーバーを使ってiphone用チャットアプリを作りました。
これにはソケットを使用しました。iOS 側では、次のコードを使用しました。
#import <CFNetwork/CFNetwork.h>
#import <sys/socket.h>
#import <sys/types.h>
- (void) viewDidLoad
{
[self initNetworkCommunication];
}
#pragma mark Network connection
- (void) initNetworkCommunication
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"xx.xx.xx.xx", xxxx, &readStream, &writeStream);
inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
ただし、アプリがバックグラウンドになるたびに、ソケットが切断されます。したがって、 socket を作成する必要があります"KEEP ALIVE"
。
サーバー側では、 によってこれを達成しましたsocket.setKeepAlive(true, 2000);
が、アプリ (つまり iOS) 側でこれを設定することはできません。
彼らは、次のようなコードを使用してソケットをキープアライブにするように指定しています。
CFDataRef data = (CFDataRef)CFWriteStreamCopyProperty(( CFWriteStreamRef)outputStream, kCFStreamPropertySocketNativeHandle);
if(data)
{
CFSocketNativeHandle socket_handle = *(CFSocketNativeHandle *)CFDataGetBytePtr(data);
CFRelease(data);
NSLog(@"SOCK HANDLE: %x", socket_handle);
//Enabling keep alive
if( setsockopt( socket_handle, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof( opt ) ) < 0 )
{
NSLog(@"Yikes 2: failed to set keepalive! ERRNO: %s", strerror(errno));
}
}
このコードを試しましたが、変数の値を見つけることができませんでしたsocket_handle, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof( opt )
。
では、ios (objective-c) でソケット接続を維持する方法は?
ありがとう。