2015-09-16 24 views
9

Non riesco ad ottenere le notifiche del voip pushkit per riavviare l'app se l'utente ha forzato l'app (spostandolo verso l'alto in l'interfaccia multi-tasking) E se il dispositivo è stato riavviato.La notifica del VoIP Pushkit non riavvierà l'app se è stata forzata e il dispositivo è stato riavviato

Tuttavia, posso ottenere le notifiche voip pushkit a lavorare nei seguenti scenari:

  • L'applicazione è stata sottoposta ad lasciò poi la notifica pushkit arriva. L'app verrà riavviata immediatamente. Le notifiche push standard non sono in grado di risvegliare l'app in tale scenario.

  • L'app era in background/sospesa e il dispositivo viene riavviato. Grazie alla modalità Voip, l'app verrà riavviata al riavvio del dispositivo (posso vedere il processo in Xcode Activity Monitor). C'è un trucco necessario qui per ottenere la notifica pushkit essere adeguatamente trattati che è descritto in http://blog.biokoda.com/post/114315188985/ios-and-pushkit in questi termini "Prima di inizializzare PushKit avviare un'attività in background. Finire questo compito quando viene ricevuto PushKit gettone"

In qualche modo quando combinando questi due (riavvio del dispositivo e forzatura forzata dell'app), le notifiche del pushkit non sembrano riavviare l'app. Inoltre, guardando i log del dispositivo in Xcode non ottengo nessun log da apsd che dice che la notifica è stata elaborata dal sistema.

Qui è il mio codice:

@implementation AppDelegate 
{ 
    UIBackgroundTaskIdentifier bgTask; 
} 
- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    UIApplication* app = [UIApplication sharedApplication]; 
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
    dispatch_async(dispatch_get_global_queue(
    DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     while (true) { 
      ; 
     } 
    }); 
    // Initialize pushkit 
    PKPushRegistry *pushRegistry = 
     [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()]; 
    pushRegistry.delegate = self; 
    pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];  
    return YES; 
} 

- (void)pushRegistry:(PKPushRegistry *)registry 
    didUpdatePushCredentials:(PKPushCredentials *)credentials 
    forType:(NSString *)type{ 
    UIApplication* app = [UIApplication sharedApplication]; 
    [app endBackgroundTask:bgTask]; 
    // ... more code to read the token ... 
} 

- (void)pushRegistry:(PKPushRegistry *)registry 
    didReceiveIncomingPushWithPayload:(PKPushPayload *)payload 
    forType:(NSString *)type { 
    // ... logging to check if notification is received ... 
} 

Anche io ho "Voice over IP" e "Remote" notifiche attivate in modalità Background.

So che altre app come Whatsapp sono in grado di essere rilanciate in questo scenario, quindi non capisco cosa sto facendo male.

Su una nota correlata, non aiuta a fare quanto segue 1) Uscita forzata 2) Inviare una notifica pushkit - che verrà ricevuta 3) Riavvia. L'app non verrà riavviata e una nuova notifica push non la rilancerà ancora.

+0

@ sahara108 e anche io sto avendo questo problema. Ho chiesto direttamente ad Apple, quindi se rispondono prima che qualcun altro lo capisca, pubblicherò la risposta qui. Inoltre dici che WhatsApp e altri sono in grado di essere riavviati, ma si riavviano completamente? Nelle nostre indagini, le app si riavviano ma non si avviano completamente.Il loro logging viene troncato prematuramente (sembra un kill OS). – Pandalover

+0

Ho determinato che l'app è stata riavviata esaminando il processo avviato nel monitor Attività. – mcaoun

risposta

3

Dopo aver provato l'applicazione con un profilo di provisioning AdHoc (e installato da iTunes), le notifiche push Voip servite tramite prod gateway.push.apple.com invece di gateway.sandbox.push.apple.com ha iniziato a svegliarsi l'app forzata dopo il riavvio.

Il sistema operativo gestisce apparentemente lo sviluppo e la produzione in un modo diverso.

Guardando ulteriormente nei log APSD, ho scoperto che quando si usa uno sviluppo provisioning profilo seguente è stampata:

: XXXX-XXXX XX: XX: XX 0300 APSD [97]:
Questi argomenti abilitati sono stati rimossi {( "YOUR_BUNLE_IDENTIFIER" )}

Questo non avviene quando si utilizza un adhoc provisioning profilo.

+0

Intendevi il provisioning dell'appstore? Nel mio test, l'app è in grado di riavviarsi quando il telefono viene riavviato, ma è incompleto. È bloccato quando si tenta di aprire una connessione socket xmpp. Sembra che la rete non sia disponibile in questo momento. La tua app è in grado di rilanciare con successo? – sahara108