2012-03-28 13 views
2

私はiPhoneでFTPクライアントを実装しましたが、FTPサーバからのダウンロード中に接続が途切れてしまった場合、アプリケーションは接続がないことを通知してクライアントを停止します。CFNetworkを使用してiOSでインターネット接続の中断を処理する方法は?

はここで問題が来る:次回は、私は再びダウンロードプロセスを開始しようと、イベントstream:handleEvent:は解雇とNSStreamStatusOpeningnetworkStream滞在のstreamStatusされていません。

ダウンロードプロセスを手動で停止すると(接続が中断されたときと同じ方法で)、再度ダウンロードすることができます。ダウンロードを再開するためには、アプリケーション全体を再起動する必要があります。ここで

は、コードの重要な部分です:

- (void)downloadFile:(NSDictionary *)file { 
    NSURL *url; 
    CFReadStreamRef ftpStream; 
    url = [NSURL URLWithString:[@"PATH TO FTP FILE" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    [self.fileStream open]; 
    ftpStream = CFReadStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) url); 
    self.networkStream = (__bridge NSInputStream *) ftpStream; 
    self.networkStream.delegate = self; 
    [self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [self.networkStream open]; 
    CFRelease(ftpStream); 
} 

と何かが流れ

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode { 
    switch (eventCode) { 
    case NSStreamEventOpenCompleted: { 
     [self updateStatus:@"Opened connection"]; 
    } break; 
    case NSStreamEventHasBytesAvailable: { 
     NSInteger  bytesRead; 
     uint8_t   buffer[32768]; 
     bytesRead = [self.networkStream read:buffer maxLength:sizeof(buffer)]; 
     if (bytesRead == -1) { 
      [self stopReceivingWithStatus:@"Network read error"]; 
     } else if (bytesRead == 0) { 
      [self stopReceivingWithStatus:nil]; 
     } else { 
      [self processStreamDataWithBuffer:buffer andReadBytes:bytesRead]; 
     } 
    } break; 
    case NSStreamEventHasSpaceAvailable: { 
     assert(NO); 
    } break; 
    case NSStreamEventErrorOccurred: { 
     [self stopReceivingWithStatus:@"Stream open error"]; 
    } break; 
    case NSStreamEventEndEncountered: { 
    } break; 
    default: { 
     assert(NO); 
    } break; 
} 

で発生したときに私が言ったように、問題は後に接続が中断されていることで解雇された方法で、イベントはもはや起動されません。

注:私はiOS 5とARCを使用しています。

答えて

2

おそらく、ストリームが強制的にデフォルトの未処理のネイティブソケットを閉じるようにフラグを設定する必要があります。

[self.networkStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket]; 
関連する問題