Como enviamos eventos do Google Analytics quando o aplicativo iOS vai para o segundo plano?

9

Meu aplicativo para iOS tem links para a App Store da Apple e estou tentando rastreá-los como eventos.

O problema é que não podemos fazer com que meu aplicativo envie adequadamente os eventos do GA antes que ele entre em segundo plano. Estamos usando o iOS SDK v2beta4.

Aqui está uma visão geral do código que estamos usando. Você pode ver que colocamos muito do que eu chamo de código de "apólice de seguro" porque o que achamos que é a maneira correta não está funcionando. Mas mesmo o código da apólice de seguro nem sempre despacha os eventos antes que meu aplicativo entre em segundo plano. Funciona apenas cerca de 50% do tempo e o resto do tempo eu tenho que retornar ao aplicativo para obter os eventos a serem despachados.

Acreditamos que a maneira correta é despachar o evento em "applicationDidEnterBackground" e pedir tempo extra ao iOS para fazer isso via "beginBackgroundTaskWithExpirationHandler". Nós tentamos este código por conta própria sem o meu código de "apólice de seguro". Pelo menos eu acredito que comentamos todas as linhas de código de seguro corretamente.

Observe que definimos a variável global UIBackgroundTaskIdentifier bgTask; no arquivo de cabeçalho AppDelegate.h com o código

UIBackgroundTaskIdentifier  bgTask;

Aqui está o código que achamos ser a maneira correta de fazer isso:

- (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;
    });
}

O código acima é o que achamos que deveria funcionar, mas não funciona. Observação: a App Store não é um aplicativo comum, mas um site dentro de um aplicativo, se isso fizer diferença.

Como uma apólice de seguro, fizemos algumas outras coisas que despacham o evento cerca de 50% do tempo:

O primeiro despacho [[GAI sharedInstance]] é chamado imediatamente na função em que o rastreamento foi definido

Código-fonte:

- (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];
    ...
}

Também o colocamos em "applicationWillResignActive"

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

E, finalmente, quando você fechar completamente o aplicativo, outro chamado do GA é chamado

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

Nada disso funciona 100% do tempo. Apenas cerca de 50% do tempo. Então, fizemos isso: quando você entra novamente no aplicativo (não importa se o plano de fundo ou o aplicativo foi completamente fechado), enviamos um envio

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

Com este último bit, os eventos são enviados, mas apenas se um usuário retornar ao meu aplicativo. Embora eu não tenha 100% de certeza se é esse código que está enviando os eventos quando eu retornar ao aplicativo ou um despacho padrão do GA quando eu voltar ao aplicativo.

    
por Will 18.03.2013 в 20:03
fonte

3 respostas

2

Use [[GANTracker sharedTracker] dispatchSynchronous:]

O método

dispatch executará uma operação assíncrona. Portanto, ele retornará imediatamente sem esperar que a operação de envio seja concluída. Seu aplicativo provavelmente está suspenso antes que a operação de envio real seja concluída.

- EDITAR

Parece que o método dispatchSynchronous: desapareceu na versão mais recente da biblioteca do Google Analytics. Como GANTrackerDelegate também desapareceu, até onde eu posso ver, não há como descobrir quando uma operação de despacho termina. Portanto, sugiro chamar o método endBackgroundTask: após um tempo limite pré-definido. Não é perfeito, mas é melhor do que chamá-lo imediatamente após dispatch .

Seu código deve ficar assim:

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;
  });
});
    
por murat 18.03.2013 / 23:22
fonte
2

como 'dispatch_get_current_queue ()' está atualmente suspenso no iOS 6, agora você pode usar o seguinte código:

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;
    });
});
    
por Antoine 11.11.2014 / 16:54
fonte
1

No GoogleAnalytics 3.14, há dispatchWithCompletionHandler: Estou usando assim:

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

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

E parece funcionar corretamente.

    
por Kubba 23.11.2015 / 09:46
fonte