Google Analytics iOS v2beta3 - 手动调度在应用程序中不起作用WillResignActive



我一直在使用谷歌的Analytics SDK v2beta3,除了在应用程序离开活动状态时无法手动调度外,其他一切都正常工作。(请注意,对于我的应用程序,我需要保留电池电量,所以当用户完成应用程序时,我只使用"[[GAI sharedinstance]dispatch]"来调度我的事件数据。)

我已经尝试了几种方法,但虽然在跟踪过程中到达并运行了调度调用,但它似乎没有任何作用。。。没有日志输出(我打开了调试模式),也没有上传数据。它应该最低限度地报告"GoogleAnalytics 2.0b3-[GAIDispatcher initiateDispatch:retryNumber:](GAIDisplayer.m:479)DEBUG:没有挂起的点击。"或我认为的类似情况。但日志中没有任何内容,也没有发送任何数据。

相反,当应用程序从后台恢复时,点击量会被传输,我会在控制台上看到所有调试语句,数据会成功发送到我的Google Analytics帐户。

下面是我的代码。。。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
// set up Google Analytics tracker
[GAI sharedInstance].trackUncaughtExceptions = YES; // automatically track uncaught exceptions with Google Analytics - sent with stack trace.
[GAI sharedInstance].dispatchInterval = -1;         // set Google Analytics dispatch off, will do manually when app goes into background.
[GAI sharedInstance].debug = YES;                   // set debug to YES for extra debugging information.
id<GAITracker> tracker = [[GAI sharedInstance] trackerWithTrackingId:GOOGLE_ANALYTICS_TRACKING_ID_FOR_TEST];    // Create tracker instance.
[tracker setSessionTimeout:600];                     // set min time between sessions to be 10 minutes
[GAI sharedInstance].defaultTracker = tracker;   // reset the default tracker if needed
[[GAI sharedInstance] setOptOut:NO];
...
}
- (void)applicationWillResignActive:(UIApplication *)application
{
UIDevice * device = [UIDevice currentDevice];
BOOL backgroundTasksSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {
backgroundTasksSupported = device.multitaskingSupported;
}
if (backgroundTasksSupported) {
self.uploadAnalyticsBackgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{[self endBackgroundUploadTask];}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{        // put block on Global run queue...
[[GAI sharedInstance] dispatch];                                                    // for dispatch of collected metric/analysis data...
[self endBackgroundUploadTask];
});
}
else {
[[GAI sharedInstance] dispatch];
}
}
- (void) endBackgroundUploadTask
{
if(self.uploadAnalyticsBackgroundTask != UIBackgroundTaskInvalid) {          // if background task running, end it
[[UIApplication sharedApplication] endBackgroundTask: self.uploadAnalyticsBackgroundTask];
self.uploadAnalyticsBackgroundTask = UIBackgroundTaskInvalid;
}
}

应用程序到达并执行"[[GAI sharedInstance]调度];"行,但什么也不做。当应用程序进入后台时,我是一个熟悉后台任务的新手,所以可能我做错了什么。但作为我调查的一部分,我甚至简化了应用程序WillResignActive(这是/应该是阻止的)。。。但我得到了同样的东西:没有调试信息,也没有传输数据。

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

我尝试过将调度间隔设为非负(比如说15秒),并在请求的间隔内获得常规传输,但手动调度的调用不起作用。

在我的代码的其他部分调用手动调度确实有效。当应用程序关闭时,它似乎不起作用。

关于我可能做错了什么以及如何解决这个问题,有什么想法和建议吗?

与以前的Google Analytics SDK版本不同,由于v2手动调度机制不会同步运行,即它不会等待调度完成,而是立即返回。因此,如果您在变为非活动状态之前使用调度,则调度不会发生,因为在实际调度发生之前,应用程序的运行队列将暂停。作为一种变通方法,我正在启动一个后台任务,该任务会休眠几秒钟,并使应用程序运行足够长的时间以完成调度。

希望Google能在未来版本的SDK中重新添加dispatchSynchronously方法。

另外,请注意,在applicationWillTerminate上,只有5秒钟的时间才能终止应用程序,所以不要等待太久。

- (void)dispatchAndWait:(NSTimeInterval)waitTime {
UIBackgroundTaskIdentifier backgroundTask = 0;
backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// GAI dispatch runs asynchronously and dispatches on the main
// thread, so we're giving it some time to dispatch and keep the
// app running in background by sleeping on a background thread
[[GAI sharedInstance] dispatch];
[NSThread sleepForTimeInterval:waitTime];
[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
});
}

截至2013年8月,这是正确答案。

只要该应用程序正常关闭,即收到UIApplicationWillResignActiveNotification,那么下次打开该应用程序时就会发送点击量。

你没有看到这一点的原因可能是从Xcode退出应用程序并不能正常关闭它。按下主页按钮,紧接着Xcode停止,它将正常关闭,它将工作。

这里的问题是,即使点击被发送,如果点击在第二天凌晨4点之后到达Analytics配置文件的时区,它们也会被Analytics丢弃。这有点棘手,可能会证明像安德烈亚斯这样的解决方案是合理的。

我们遇到了这个问题,但成功率提高到了50%。以下是我们的做法。

我们输入了"保险代码",随着应用程序过渡到后台,大约50%的时间我们的活动都会被发送。在返回应用程序之前,其他50%的时间不会发送事件。

让我们达到50%的保险代码是将调度电话放入按钮按下代码中:

- (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];
...
}

此外,查看主要quesiton中的示例代码-苹果表示将用于执行后台任务的代码放在中

applicationDidEnterBackground:

而不是

applicationWillResignActive:

但这似乎并没有对我们产生巨大影响。以下是苹果关于这个主题的文档(见清单3-3)

http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

此外,如果你想更深入地了解我们是如何获得大约50%的成功的,我还发布了一篇关于我们对代码样本所做工作的较长帖子:当iOS应用程序进入后台时,我们如何调度谷歌分析事件?

不过,在这一点上,如果有人找到了100%的解决方案,我仍然希望它。

相关内容

最新更新