2013-02-14 12 views
6

Iam utilizza una chat dell'app per iPhone utilizza la connessione socket per comunicare con il server. Quando l'app viene spostata sullo sfondo, posso vedere che il server è in grado di comunicare con l'app per circa 5 minuti. Ma dopo questo tempo, la connessione socket viene distrutta. Ma l'applicazione smette di essere eseguita non appena passa allo sfondo. Perché la connessione socket viene mantenuta per 5 minuti ma non l'esecuzione dell'app. Apple Apple specifica l'ora esatta per la quale la connessione verrà mantenuta.connessione socket interrotta dopo che l'app iOS è passata allo sfondo

+0

La tua app è registrata come app VoIP? – trojanfoe

+0

no. non è registrato come Voip. – Chinta

risposta

9

è possibile ottenere un tempo massimo di 600 secondi (10 minuti) utilizzando facendo uso di codice riportato di seguito applicationDidEnterBackground:

if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4 
if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking 
    UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance 
    __block UIBackgroundTaskIdentifier background_task; //Create a task object 
    background_task = [application beginBackgroundTaskWithExpirationHandler:^{ 
     [application endBackgroundTask: background_task]; //Tell the system that we are done with the tasks 
     background_task = UIBackgroundTaskInvalid; //Set the task to be invalid 
     //System will be shutting down the app at any point in time now 
    }]; 
    //Background tasks require you to use asyncrous tasks 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     //Perform your tasks that your application requires 
     NSLog(@"\n\nRunning in the background!\n\n"); 
     [application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform 
     background_task = UIBackgroundTaskInvalid; //Invalidate the background_task 
    }); 
    } 
} 

La documentazione può essere trovato qui http://disanji.net/iOS_Doc/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Ho appena implementato l'oggetto backgroundTaskIdentifier e Invalidate il background_task per controllare l'ora, l'app era viva ed eseguiva 600 sec. Puoi anche ottenere il tempo residuo utilizzando questo

NSLog(@"Time remaining: %f", application.backgroundTimeRemaining); 
+1

Se si sta usando iOS 4.3 o versioni successive, non sono necessarie le due istruzioni iniziali "if". – rmaddy

+0

@rmaddy hai ragione :) –

+0

@chinta Configurare i socket per l'utilizzo VoIP per lo sfondo può essere trovato qui. Molto informativo http://wiseman-safiq.blogspot.in/2010/11/ios-executing-code-in-background.html –

1

Da IOS Programming Guide

maggior parte delle applicazioni di Apple che entrano lo stato di sfondo vengono spostati allo stato sospesa poco dopo. In questo stato, l'applicazione non esegue alcun codice e può essere rimossa dalla memoria in qualsiasi momento. Le applicazioni che forniscono servizi specifici all'utente possono richiedere il tempo di esecuzione in background per fornire i servizi .

Questo almeno spiega perché l'applicazione si arresta. Perché il tuo server è ancora in grado di comunicare con la tua app per 5 minuti, perché hai impostato un intervallo di tempo molto lungo e non stai chiudendo esplicitamente la connessione socket sulla tua app che entra nello sfondo.