2012-05-11 21 views
1

ので、ここでの問題の簡単な説明です:NSURLConnectionは反応しませんエラードメイン= NSPOSIXErrorDomainコード= 57

は、私は、WebソケットSocketRocket使用するアプリを持っている - クライアント側、Nodejs + Socket.ioを- サーバ側。 私はアプリケーションの起動時にソケット接続を確立し、すべて正常に動作します。私がアプリを中断した場合(バックグラウンド、ロック画面など)、フォアグラウンドに入ると再接続できます。
私が接続を失った場合(例えば、私がルータで自分をブロックした場合(私は5-10秒でソケットエラーが発生します)、自分自身をブロック解除します) - 私はNSURLConnectionで任意のURLに接続できません。 (なぜ、私はこれに悩まされているのですか?人々はモバイルデバイスで頻繁に緩んでいるので、このエラーを処理しなければなりません)

これは以前に接続があった場合に復元/入力フォアグラウンドで呼び出されています。私は、接続が失敗した後に再接続しようとする場合には

Connecting to socket with URL: https://example.com:9001/socket.io/1/?t=282442 
requestFinished() ==> 843717395328441553:60:60:websocket 
debug: Finished request GET https://example.com:9001/socket.io/1/?t=282442 <LRRestyRequest> 

Connecting to socket with URL: https://example.com:9001/socket.io/1/?t=282475249 

私は同期要求を実行しようとした、まだそれは希望私は通常の場合には何を得るのです

-(void) connectToHost:(NSString *)host onPort:(NSInteger)port withParams:(NSDictionary*)params withNamespace:(NSString *)endpoint 
{  

    if (!_isConnected && !_isConnecting) 
    { 
    _isConnecting = YES; 

    _host = host; 
    _port = port; 
    _endpoint = [endpoint copy]; 

    NSMutableString *query = [[NSMutableString alloc] initWithString:@""]; 
    [params enumerateKeysAndObjectsUsingBlock: ^(id key, id value, BOOL *stop) { 
     [query appendFormat:@"&%@=%@",key,value]; 
    }]; 

    NSString *s = [NSString stringWithFormat:HANDSHAKE_URL, _host, _port, rand(), query]; 
    [self log:[NSString stringWithFormat:@"Connecting to socket with URL: %@",s]];   

    _timeout = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(disconnect) userInfo:nil repeats:NO]; 

    [[LRResty client] get:s withBlock:^(LRRestyResponse *response) { 
     [_timeout invalidate], _timeout = nil;         
     if (response.status == 200) 
     { 
      NSString *responseString = [response asString]; 

      [self log:[NSString stringWithFormat:@"requestFinished() %@", responseString]]; 
      NSArray *data = [responseString componentsSeparatedByString:@":"]; 

      _sid = [data objectAtIndex:0]; 
      [self log:[NSString stringWithFormat:@"sid: %@", _sid]]; 

      _heartbeatTimeout = [[data objectAtIndex:1] floatValue] + 7.0; 
      [self log:[NSString stringWithFormat:@"heartbeatTimeout: %f", _heartbeatTimeout]]; 

      NSString *t = [data objectAtIndex:3]; 
      NSArray *transports = [t componentsSeparatedByString:@","]; 
      [self log:[NSString stringWithFormat:@"transports: %@", transports]]; 

      [self openSocket];     
     } 
     else 
     { 
      [_delegate socketIOHandshakeFailed:self]; 
     } 
    }];      
    }     
} 

私のUIをブロックし、決して終わらないでしょう。したがって、実際にはリクエストはおそらく開始しようとしていますが、実行のポイントに到達することはありません。

これは私がデバッガでアプリを一時停止した場合、私が得るものです: あなたはここにスクリーンショットを見ることができます - >http://avvs.co/static/app_paused.jpg
チェックインスレッド7 -

#0 0x9855fc22 in mach_msg_trap() 
#7 0x026852d3 in -[NSRunLoop(NSRunLoop) run]() 
#8 0x00019b1b in -[LRURLRequestOperation start] 
#9 0x00016670 in -[LRRestyRequest start] 

UPDATE
これが完了このスレッドの操作リストは、ここで何が間違っているのかを指摘できれば本当にうれしいでしょう。

#0 0x9855fc22 in mach_msg_trap() 
#1 0x9855f1f6 in mach_msg() 
#2 0x0073c10a in __CFRunLoopServiceMachPort() 
#3 0x0069f5d5 in __CFRunLoopRun() 
#4 0x0069ed84 in CFRunLoopRunSpecific() 
#5 0x0069ec9b in CFRunLoopRunInMode() 
#6 0x0268540f in -[NSRunLoop(NSRunLoop) runMode:beforeDate:]() 
#7 0x026852d3 in -[NSRunLoop(NSRunLoop) run]() 
#8 0x00019b0b in -[LRURLRequestOperation start] 
#9 0x00016660 in -[LRRestyRequest start] 

答えて

2

私は最終的に解決策を見つけました。実際の問題はNSURLConnectionではなく、ソケット実装で発生しました。接続が失われたとき、アプリケーションは入力ストリームと出力ストリームを閉じていたが、実行中のループから削除されず、ディスパッチされなかった。それを修正することで、私は接続性を復元することができました。

+1

問題の修正方法については、いくつかのコードサンプルを参考にしてください。私はSocketRocketライブラリを使用して同じ問題があります。 LANケーブルを取り外すと、アプリは再接続を試みますが、成功することはありません。 – Neo

+0

こんにちはVitaly、XMPPコードがあればそれを修正する方法を詳しく説明できますか?私は同じ問題に直面しています。 –

関連する問題