我们如何派遣谷歌分析事件时,iOS应用转到后台?(How do we dispatch Google

2019-08-17 17:48发布

我的iOS应用中有链接,苹果的App Store,我试图跟踪这些作为事件。

问题是,我们不能让我的应用程序正确地分派GA事件它进入后台之前。 我们使用的是iOS SDK v2beta4。

下面是我们所使用的代码的概述。 你可以看到,我们已经投入了很多我称之为“保险”的代码,因为我们认为这是正确的做法是行不通的。 但是,即使保险单码并不总是分派事件我的应用程序进入后台之前。 它只适用的时间约50%的我要回到该应用获取的事件调度休息的时间。

我们认为,正确的做法是指派该事件中“applicationDidEnterBackground”,并要求iOS的额外时间通过“beginBackgroundTaskWithExpirationHandler”要做到这一点。 我们试图在自己的代码没有我的“保险单”的代码。 至少我相信,我们的保险每一行代码正确注释掉。

请注意,我们设置了全局变量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]调度]是在跟踪已设置的功能立即调用

源代码:

- (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默认的调度,当我回去的应用程序,被分派的事件。

Answer 1:

使用[[GANTracker sharedTracker] dispatchSynchronous:]

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

- 编辑 -

它看起来像dispatchSynchronous:方法是在去了谷歌分析库的最新版本。 由于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;
  });
});


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


Answer 3:

在Google分析3.14有dispatchWithCompletionHandler:我使用的是这样的:

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

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

它似乎正常工作。



文章来源: How do we dispatch Google Analytics events when iOS app goes to the background?