【问题标题】:How do we dispatch Google Analytics events when iOS app goes to the background?当 iOS 应用程序进入后台时,我们如何调度 Google Analytics 事件?
【发布时间】:2013-03-18 19:03:10
【问题描述】:

我的 iOS 应用中包含指向 Apple 应用商店的链接,我正在尝试将这些链接作为事件进行跟踪。

问题是我们无法让我的应用在进入后台之前正确调度 GA 事件。我们正在使用 iOS SDK v2beta4。

这里是我们正在使用的代码的概述。你可以看到我们已经放入了很多我称之为“保险单”的代码,因为我们认为正确的方法是行不通的。但即使是保险单代码也并不总是在我的应用程序进入后台之前调度事件。它仅在大约 50% 的时间内有效,其余时间我必须返回应用程序才能调度事件。

我们认为正确的方法是在“applicationDidEnterBackground”中调度事件,并通过“beginBackgroundTaskWithExpirationHandler”请求 iOS 额外的时间来执行此操作。我们已经在没有我的“保险单”代码的情况下自行尝试了此代码。至少我相信我们正确地注释掉了每一行保险代码。

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

UIBackgroundTaskIdentifier  bgTask;

这是我们认为正确的代码:

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

上面的代码是我们认为应该工作但没有工作的代码。注意: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];
    ...
}

我们也把它放在“applicationWillResignActive”中

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

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

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

这些都不是 100% 有效的。只有大约 50% 的时间。所以我们这样做了:当您重新进入应用程序时(无论是从后台还是应用程序已完全关闭都没有关系),我们会发送一个调度

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

通过最后一点,事件会被调度,但前提是用户返回我的应用程序。虽然我不能 100% 确定是这段代码在我返回应用程序时调度事件还是在我返回应用程序时 GA 默认调度。

【问题讨论】:

    标签: ios objective-c google-analytics grand-central-dispatch dispatch


    【解决方案1】:

    使用[[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;
      });
    });
    

    【讨论】:

    • 啊,甚至认为 Apple 在清单 3-3 中的代码说要使用 dispatch_Async? developer.apple.com/library/ios/#documentation/iphone/…
    • @Will 我的意思是GANTrackerdispatchSynchronous: 方法,但显然它在库的v2 中不存在。更新了最新版本的答案。
    • 谢谢。我非常感谢您的帮助,并将尝试使用计时器方法。另外,我正在尝试 dispatch_async(dispatch_get_global... 而不是 dispatch_async ,这似乎可以改善一些情况,但这会导致无法预料的问题吗?
    • @canhazbits 不,我们从来没有让它完全工作。据我们所知,这似乎是谷歌 SDK 的一个错误/问题。至少这是我们的猜测。我不确定 Google 从那时起是否更新了 Analytics SDK 来解决这个问题。
    【解决方案2】:

    由于“dispatch_get_current_queue()”目前在 iOS 6 中已被弃用,您现在可以使用以下代码:

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

    【讨论】:

      【解决方案3】:

      在 GoogleAnalytics 3.14 中有 dispatchWithCompletionHandler: 我这样使用它:

      //track any event here as usual and then call:
      
      GAI.sharedInstance().dispatchWithCompletionHandler({ (_) -> Void in
          UIApplication.sharedApplication().openURL(URL)
      })
      

      而且它似乎工作正常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        相关资源
        最近更新 更多