iphone - 如何使用 CFNetwork 处理 iOS 上的互联网连接中断?

标签 iphone objective-c ios cocoa-touch ftp

我在 iPhone 上实现了 FTP 客户端,但是当从 FTP 服务器下载时连接暂时中断时,应用程序会通知我没有连接并停止客户端。

问题来了:下次我尝试再次启动下载过程时,事件 stream:handleEvent: 不会被触发,并且 streamStatus networkStream 保持在 NSStreamStatusOpening 上。

如果我手动停止下载过程(使用与连接中断时触发的相同方法),我可以再次重新下载。我必须重新启动整个应用程序才能再次下载。

以下是代码的关键部分:

- (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;
}

正如我所说,问题是连接中断后,事件不再触发。

注意:我使用带有 ARC 的 iOS 5。

最佳答案

也许您应该设置标志来强制流关闭底层 native 套接字,默认情况下不会完成;

[self.networkStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];

关于iphone - 如何使用 CFNetwork 处理 iOS 上的互联网连接中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9903172/

相关文章:

ios - 在 UIView 数组中查找边

ios - 使用 css * 选择器来适应 webkit uiview for iPhone 中的所有内容是个好主意吗?

iphone - 查找两个日期之间的差值正好是 1 年

ios - 在 iOS 中向用户显示之前修改通知数据

ios - 我什么时候需要从服务器加载通知数据?

ios - 设置 map 的默认起始位置 - iOS

ios - 我需要在发布应用程序之前禁用 NSLog 吗?

iphone - 如何在iphone应用程序中单击按钮时隐藏删除 subview

persistence - iphone 书签 cookie 持久性

iphone - 如何检查EKCalendar是否可见