IOS NSStream FTP not responding after 5 minutes of inactivity

I am using the FTP library for iOS ( nkreipke / FTPManager ). It works great. I can upload a list of directories, upload images, etc. The problem is that if you leave the application open for 5 minutes without doing anything, and then you try to download or download, nothing happens.

I debugged it and found out that the NSStreamDelegate method is (void): (NSStream *) theStream handleEvent: (NSStreamEvent) streamEvent is never called after this short period of time being inactive.

Here is the code:

- (NSArray*) _contentsOfServer:(FMServer*)server {
BOOL success = YES;

action = _FMCurrentActionContentsOfServer;

fileSize = 0;

self.directoryListingData = [[NSMutableData alloc] init];

NSURL* dest = [server.destination ftpURLForPort:server.port];
And(success, (dest != nil));
Check(success);

if (![dest.absoluteString hasSuffix:@"/"]) {
    //if the url does not end with an '/' the method fails.
    //no problem, we can fix this.
    dest = [NSURL URLWithString:[NSString stringWithFormat:@"%@/",dest.absoluteString]];
}

CFReadStreamRef readStream = CFReadStreamCreateWithFTPURL(NULL, (__bridge CFURLRef)dest);
And(success, (readStream != NULL));
if (!success) return nil;
self.serverReadStream = (__bridge_transfer NSInputStream*) readStream;

And(success, [self.serverReadStream setProperty:server.username forKey:(id)kCFStreamPropertyFTPUserName]);
And(success, [self.serverReadStream setProperty:server.password forKey:(id)kCFStreamPropertyFTPPassword]);
if (!success) return nil;

self.bufferOffset = 0;
self.bufferLimit = 0;

currentRunLoop = CFRunLoopGetCurrent();

self.serverReadStream.delegate = self;
[self.serverReadStream open];
[self.serverReadStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

CFRunLoopRun(); //<- Hangs here.

And(success, streamSuccess);
if (!success) return nil;

NSArray* directoryContents = [self _createListingArrayFromDirectoryListingData:self.directoryListingData];
self.directoryListingData = nil;

return directoryContents;

serverReadStream is an NSInputStream object .

When the action ends:

if (self.serverReadStream) {
    [self.serverReadStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    CFRunLoopStop(CFRunLoopGetCurrent());
    self.serverReadStream.delegate = nil;
    [self.serverReadStream close];
    self.serverReadStream = nil;
}

FTPManager.m. , . , NSStreamDelegate , .

, - .

.

+4
1

iPad, CFRunLoopRun(), FTP- .

FTPManager.

-,

[self.serverReadStream open];
[self.serverReadStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

to

[self.serverReadStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.serverReadStream open];

, . , , . .

, , . , / , , .

:

[self.serverReadStream setProperty: (id) kCFBooleanFalse forKey: (id) kCFStreamPropertyFTPAttemptPersistentConnection];

, .

+1

All Articles