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.