我的iOS应用里有指向苹果App Store的链接,我想追踪这些链接作为事件。问题在于,在应用进入后台之前,我们无法让应用正确调度GA事件。我们正在使用iOS SDK v2beta4。
以下是我们使用的代码概述。你可以看到,我们加入了很多所谓的“保险策略”代码,因为我们认为正确的方法并不奏效。但即使是保险策略代码也不能始终在我的应用进入后台之前调度事件。它只能在50%的时间内正常工作,而其余时间我必须返回应用程序以便事件可以被调度。
我们认为正确的方法是在“applicationDidEnterBackground”中调度事件,并通过“beginBackgroundTaskWithExpirationHandler”向iOS请求额外的时间来完成此操作。我们尝试过单独运行此代码,没有使用我所谓的“保险策略”代码。至少我相信我们已经正确注释掉了每一行保险策略代码。
请注意,在AppDelegate.h头文件中,我们使用以下代码设置全局变量UIBackgroundTaskIdentifier bgTask;
上述代码是我们认为应该能够工作但实际上却没有。请注意:App Store不是一个普通的应用程序,而是一个网站内部的应用程序,如果这有区别的话。
为了保险起见,我们还做了其他一些事情,可以使事件被成功分发约50%的时间:
第一个[[GAI sharedInstance] dispatch]是在设置跟踪的函数中立即调用的。
源代码:
我们还在 "applicationWillResignActive" 中添加了它。
最后,在您完全关闭应用程序时,会调用另一个GA分派。
以下是我们使用的代码概述。你可以看到,我们加入了很多所谓的“保险策略”代码,因为我们认为正确的方法并不奏效。但即使是保险策略代码也不能始终在我的应用进入后台之前调度事件。它只能在50%的时间内正常工作,而其余时间我必须返回应用程序以便事件可以被调度。
我们认为正确的方法是在“applicationDidEnterBackground”中调度事件,并通过“beginBackgroundTaskWithExpirationHandler”向iOS请求额外的时间来完成此操作。我们尝试过单独运行此代码,没有使用我所谓的“保险策略”代码。至少我相信我们已经正确注释掉了每一行保险策略代码。
请注意,在AppDelegate.h头文件中,我们使用以下代码设置全局变量UIBackgroundTaskIdentifier bgTask;
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];
}
这些方法并不能百分之百地有效。只有大约50%的概率成功。因此,我们采取了以下措施:当您重新进入应用程序时(无论是从后台还是完全关闭应用程序),我们会发送一个调度指令。
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[GAI sharedInstance] dispatch];
}
在这最后一步中,事件只有在用户返回到我的应用程序时才会被分发。虽然我并不完全确定是这段代码在我返回应用程序时分发事件,还是当我返回应用程序时触发了GA默认分发。
GANTracker
的dispatchSynchronous:
方法,但显然在库的 v2 版本中不存在。已更新答案以适应最新版本。 - murat