我一直在使用 Google 的 Analytics SDK v2beta3 并且一切正常,除了当应用程序离开活动状态时我无法手动调度工作。(仅供参考,对于我的应用程序,我需要保留电池电量,因此仅在用户完成应用程序时使用“[[GAI sharedinstance] dispatch]”来调度我的事件数据。)
我已经尝试了几件事,但是在跟踪期间到达并运行调度调用时,它似乎没有做任何事情......没有日志输出(我打开了调试模式)并且没有上传数据。它应该最低限度地报告“GoogleAnalytics 2.0b3 -[GAIDispatcher initialDispatch:retryNumber:] (GAIDispatcher.m:479) DEBUG: No pending hits”。或者我想的那种东西。但日志中没有任何内容,也没有发送数据。
相反,当应用程序从后台恢复时,点击会被传输,我会在控制台上看到所有调试语句,并且数据已成功发送到我的 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] dispatch];” 行,但什么也不做。当应用程序进入后台时,我是一个后台任务的新手,所以也许我做错了什么。但作为我调查的一部分,我什至将 applicationWillResignActive 简化为这个(这是/应该是阻塞的)......但我得到了同样的东西:没有调试信息,也没有传输的数据。
- (void)applicationWillResignActive:(UIApplication *)application
{
[[GAI sharedInstance] dispatch];
}
我已经用非负的调度间隔(比如 15 秒)进行了尝试,并且我在请求的间隔内得到了定期传输,但是手动调度的调用不起作用。
在我的代码的其他部分调用手动调度确实有效。当应用程序关闭时,它似乎不起作用。
关于我可能做错了什么以及如何解决这个问题的任何想法建议?