Question

enter image description hereI am using robbiehanson/CocoaAsyncSocket for async socket, when my iPad goes into background state i disconnect and close all the ports, but some times when iPad awakes from sleep it crashes, happened same with simulator when mac goes to sleep mode. Once i got crash log as [AsyncSocket close] unrecognized instance send to selector.

I am not able to find a solution for this, can any one help me on this. Below is my code for disconnecting.

- (void) enterBackground
{

  if (self.discoveryUdpSocket!=nil)
 {
    self.discoveryUdpSocket.delegate = nil;
    [self.discoveryUdpSocket close];
 }

  self.discoveryUdpSocket.delegate = nil;
  self.discoveryUdpSocket = nil;

}

Crash report 1

Crash report 2

Was it helpful?

Solution

Have you tried to extend time when entering background mode to allow socket framework complete its job?

I mean to add in the app delegate a method:

-(void)applicationDidEnterBackground:(UIApplication *)application {
        UIApplication *app = [UIApplication sharedApplication];
        __block UIBackgroundTaskIdentifier bgTask = 0;
        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            NSLog(@"Times up!");
            [application endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }];
        // Let the async socket to complete its job and finally close the connection
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"Finishing job and closing async socket, time remaining=%f", [app backgroundTimeRemaining]);
            // Calling your background routine
            [self enterBackground];
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        });
}

This is a good way to complete important job just before app is suspended. You have max 180 secs.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top