私はiPhoneでFTPクライアントを実装しましたが、FTPサーバからのダウンロード中に接続が途切れてしまった場合、アプリケーションは接続がないことを通知してクライアントを停止します。CFNetworkを使用してiOSでインターネット接続の中断を処理する方法は?
はここで問題が来る:次回は、私は再びダウンロードプロセスを開始しようと、イベントstream:handleEvent:
は解雇とNSStreamStatusOpening
上networkStream
滞在の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を使用しています。