2014-06-28 1 views
8

Ho creato un'applicazione di chat usando SocketRocket, quando esco dall'app (entra in modalità background) Voglio ricevere il messaggio di chat! quindi potrei farlo chiamandolo app VoIP ma alcune persone dicono che Apple lo rifiuterà dall'App Store a meno che non lo faccia anche VoIP. Quindi, come posso farlo e se l'unico modo per farlo è chiamandolo un'applicazione VoIP come fa whatsapp gestisce questa situazione ??Come mantenere viva la connessione webs iphone iphone mentre è in background?

Ecco quello che ho fatto per mantenere viva l'applicazione in background:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 


NSLog(@"Application entered background state."); 
    NSAssert(self.backgroundTask == UIBackgroundTaskInvalid, nil); 
    self.didShowDisconnectionWarning = NO; 

self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"Background task expired"); 
     if (self.backgroundTimer) 
     { 
      [self.backgroundTimer invalidate]; 
      self.backgroundTimer = nil; 
     } 
     [application endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
    }); 
}]; 

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(timerUpdate:) userInfo:nil repeats:YES]; 
}); 

} 


- (void) timerUpdate:(NSTimer*)timer { 
    UIApplication *application = [UIApplication sharedApplication]; 

    NSLog(@"Timer update, background time left: %f", application.backgroundTimeRemaining); 

    if ([application backgroundTimeRemaining] < 60 && !self.didShowDisconnectionWarning) 
    { 
     UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
     if (localNotif) { 
      localNotif.alertBody = @"Background session will expire in one minute."; 
      localNotif.alertAction = @"OK"; 
      localNotif.soundName = UILocalNotificationDefaultSoundName; 
      [application presentLocalNotificationNow:localNotif]; 
     } 
     self.didShowDisconnectionWarning = YES; 
    } 
    if ([application backgroundTimeRemaining] < 10) 
    { 
     // Clean up here 
     [self.backgroundTimer invalidate]; 
     self.backgroundTimer = nil; 

     [application endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
    } 

} 

risposta

4

credo che l'unica opzione è quella di utilizzare le notifiche remote. Hai bisogno della tua app per registrarti e del tuo server per rilevare quando la tua app non è in esecuzione (cioè collegata tramite il socket), quindi invia una notifica.

+0

grazie, ma non credo che altre app utilizzino l'APNS per farlo, ho rintracciato molte applicazioni di chat e sembra che usi le notifiche remote quando l'app è in sottofondo !! – Atrash

+0

@ MKAlatrash, stai dicendo che lo fanno o no? – jcaron

+0

Un altro dice la stessa cosa: http://stackoverflow.com/a/11022682/3527940 – jcaron

0

Non è possibile mantenere in vita il socket TCP in background, Come ho ottenuto questa funzione ogni volta che applicationDidEnterBackground ha chiamato disconnetti socket e applicationDidBecomeActive Connetti il ​​socket in modo che il server sappia che il socket client è disconnesso, quindi salva il messaggio nella tabella offline. C'era una pianificazione sul server web che viene eseguita periodicamente per inviare notifiche push. ogni volta che l'utente riceve la notifica push e l'utente tocca su di esso è necessario creare un flusso per avviare la conversazione corretta in base al parametro che si ottiene nel dizionario di notifica remoto.