当iOS应用程序进入后台时,我们如何发送Google Analytics事件?

Wil*_*ill 9 google-analytics objective-c dispatch grand-central-dispatch ios

我的iOS应用程序中有Apple Apple App Store的链接,我试图将这些作为事件进行跟踪.

问题是我们无法让我的应用程序在进入后台之前正确发送GA事件.我们正在使用iOS SDK v2beta4.

以下是我们使用的代码的概述.您可以看到我们已经提供了许多我称之为"保险单"的代码,因为我们认为正确的方法是行不通的.但即使是保险政策代码并不总是在我的应用程序进入后台之前发送事件.它只能在大约50%的时间内工作,剩下的时间我必须返回应用程序才能发送事件.

我们认为正确的方法是在"applicationDidEnterBackground"中调度事件,并通过"beginBackgroundTaskWithExpirationHandler"向iOS请求额外的时间来执行此操作.我们在没有"保险单"代码的情况下自己尝试了这段代码.至少我相信我们正确地评论了每一行保险代码.

注意我们设置全局变量UIBackgroundTaskIdentifier bgTask; 在带有代码的AppDelegate.h头文件中

UIBackgroundTaskIdentifier  bgTask;
Run Code Online (Sandbox Code Playgroud)

以下是我们认为正确执行此操作的代码:

- (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;
    });
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是我们认为应该起作用但不起作用的.注意:App Store不是通常的应用程序,而是应用程序中的一个网站,如果它有所作为.

作为一项保险政策,我们做了一些其他的事情,大约50%的时间派遣事件:

在设置了跟踪的函数中立即调用第一个[[GAI sharedInstance] dispatch]

源代码:

- (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];
    ...
}
Run Code Online (Sandbox Code Playgroud)

我们也把它放在"applicationWillResignActive"中

- (void)applicationWillResignActive:(UIApplication *)application
{
    ...  
    [[GAI sharedInstance] dispatch];
}
Run Code Online (Sandbox Code Playgroud)

最后,当您完全关闭应用程序时,将调用另一个GA调度

- (void)applicationWillTerminate:(UIApplication *)application
{
    [[GAI sharedInstance] dispatch];
}
Run Code Online (Sandbox Code Playgroud)

这一切都不是100%的时间.只有约50%的时间.所以我们这样做了:当你重新进入应用程序时(无论是从后台还是应用程序完全关闭都无关紧要)我们发送一个调度

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [[GAI sharedInstance] dispatch];
}
Run Code Online (Sandbox Code Playgroud)

使用最后一位调度事件,但仅当用户返回到我的应用程序时.虽然我不是100%确定是否这个代码在我返回应用程序时调度事件或者当我返回应用程序时调度GA默认调度.

mur*_*rat 2

使用[[GANTracker sharedTracker] dispatchSynchronous:]

dispatch方法将执行异步操作。因此它会立即返回,而不需要等待调度操作完成。在实际调度操作完成之前,您的应用程序可能已暂停。

- 编辑 -

看起来dispatchSynchronous:最新版本的 Google Analytics 库中的方法已经消失了。由于GANTrackerDelegate也消失了,据我所知,无法确定调度操作何时完成。因此我建议endBackgroundTask:在预定义的超时后调用方法。它并不完美,但比之后立即调用它要好dispatch

您的代码应如下所示:

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;
  });
});
Run Code Online (Sandbox Code Playgroud)