9

La mia app per iOS contiene collegamenti all'App Store di Apple e sto cercando di tracciare quelli come eventi.Come spediamo gli eventi di Google Analytics quando l'app iOS viene messa in secondo piano?

Il problema è che non possiamo ottenere che la mia app invii correttamente gli eventi GA prima che vadano in secondo piano. Stiamo usando iOS SDK v2beta4.

Ecco una panoramica del codice che stiamo utilizzando. Potete vedere che abbiamo inserito molto di quello che chiamo codice "polizza assicurativa" perché quello che pensiamo sia il modo corretto non funziona. Ma anche il codice della polizza assicurativa non invia sempre gli eventi prima che la mia app vada in secondo piano. Funziona solo il 50% delle volte e il resto del tempo devo tornare all'app per ottenere gli eventi da inviare.

Crediamo che il modo corretto sia di inviare l'evento in "applicationDidEnterBackground" e di chiedere a iOS il tempo extra per farlo tramite "beginBackgroundTaskWithExpirationHandler". Abbiamo provato questo codice da solo senza il mio codice "polizza assicurativa". Almeno credo che abbiamo commentato correttamente ogni riga del codice assicurativo.

Si noti che impostiamo la variabile globale UIBackgroundTaskIdentifier bgTask; nel file di intestazione AppDelegate.h con il codice

UIBackgroundTaskIdentifier bgTask; 

Ecco il codice che noi pensiamo sia il modo corretto di fare questo:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIApplication *app = [UIApplication sharedApplication]; 

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     [[GAI sharedInstance] dispatch]; 

     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }); 
} 

Il codice di cui sopra è quello che pensiamo dovrebbe funzionare, ma non non. Nota: l'App Store non è un'app usuale, ma un sito Web all'interno di un'app se questo fa la differenza.

Come una polizza assicurativa che abbiamo fatto un paio di altre cose che inviare l'evento circa il 50% del tempo:

Il primo [[GAI sharedInstance] spedizione] viene chiamato immediatamente nella funzione in cui il tracciamento è stata set

codice sorgente:

- (IBAction)goToAppStore:(id)sender 
{  
    ... 
    // Tracking 
    // Using events (pressing on buttons) 

    id <GAITracker> tracker = [[GAI sharedInstance] defaultTracker]; 

    [tracker sendEventWithCategory:@"App Checkout" 
         withAction:@"Checkout Button Pressed" 
         withLabel:nameApp.text 
         withValue:nil]; 

    [[GAI sharedInstance] dispatch]; 
    ... 
} 

Abbiamo anche messo in "applicationWillResignActive"

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    ... 
    [[GAI sharedInstance] dispatch]; 
} 

E infine quando si chiude completamente l'applicazione un altro dispaccio GA si chiama

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    [[GAI sharedInstance] dispatch]; 
} 

Niente di tutto questo funziona al 100% del tempo. Solo circa il 50% delle volte. Così abbiamo fatto questo: quando si ri-entrare nella app (non importa se dallo sfondo o l'applicazione è stata completamente chiusa) inviamo un dispaccio

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [[GAI sharedInstance] dispatch]; 
} 

Con questo ultimo bit gli eventi vengono inviati, ma solo se un utente torna alla mia app. Anche se non sono sicuro al 100% se si tratta di questo codice che invia gli eventi quando torno all'app o un messaggio di default di Google quando torno all'app.

risposta

2

metodo Utilizzo [[GANTracker sharedTracker] dispatchSynchronous:]

dispatch eseguirà un'operazione asincrona. Quindi ritornerà immediatamente senza attendere che l'operazione di spedizione sia completata. Probabilmente la tua app sarà sospesa prima che l'operazione di spedizione vera e propria finisca.

- EDIT -

Sembra dispatchSynchronous: metodo è andato nella sua ultima versione di libreria di Google Analytics. Dal momento che GANTrackerDelegate è sparito, per quanto posso vedere, non c'è modo di scoprire quando termina un'operazione di spedizione. Pertanto suggerisco di chiamare il metodo endBackgroundTask: dopo un timeout predefinito. Non è perfetto ma è meglio che chiamarlo immediatamente dopo lo dispatch.

Il codice dovrebbe essere simile a questa:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [[GAI sharedInstance] dispatch]; 

    double dispatchTimeout = 10.0; // 10 seconds timeout 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(dispatchTimeout * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_current_queue(), ^(void){ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
    }); 
}); 
+0

Ah, anche il codice di Apple nell'elenco 3-3 dice di usare dispatch_Async? http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html – Will

+0

@Will Intendevo il 'dispatchSynchronous:' metodo di 'GANTracker' ma apparentemente non esiste nella v2 della biblioteca. Aggiornato la risposta per l'ultima versione. – murat

+0

Grazie. Apprezzo molto l'aiuto e proverò l'approccio con il timer. Inoltre, sto provando dispatch_async (dispatch_get_global ... invece di dispatch_async che sembra migliorare un po 'le cose ma causerà problemi imprevisti? – Will

2

come 'dispatch_get_current_queue()' è attualmente deprecato come di iOS 6, è ora possibile utilizzare il seguente codice:

UIApplication *app = [UIApplication sharedApplication]; 
__block UIBackgroundTaskIdentifier bgTask; 

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
}]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [[GAI sharedInstance] dispatch]; 

    double dispatchTimeout = 10.0; // 10 seconds timeout 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(dispatchTimeout * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }); 
}); 
1

In GoogleAnalytics 3.14 c'è dispatchWithCompletionHandler: sto usando in questo modo:

//track any event here as usual and then call: 

GAI.sharedInstance().dispatchWithCompletionHandler({ (_) -> Void in 
    UIApplication.sharedApplication().openURL(URL) 
}) 

e sembra lavorare bene.

Problemi correlati