我的 iOS 应用程序中有指向 Apple App Store 的链接,我正在尝试将它们作为事件进行跟踪。
问题是我们无法让我的应用程序在进入后台之前正确调度 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 默认调度。