Я работаю с Google Analytics SDK v2beta3, и у меня все работает, за исключением того, что я не могу заставить работать ручную отправку, когда приложение выходит из активного состояния. (к вашему сведению, для моего приложения мне нужно резервировать заряд батареи, поэтому я использую только «[[общий экземпляр GAI] диспетчеризацию]» для отправки данных о событии, когда пользователь заканчивает работу с приложением.)
Я пробовал несколько вещей, но в то время как диспетчерский вызов достигается и запускается во время трассировки, похоже, он ничего не делает... нет вывода журнала (у меня включен режим отладки) и данные не загружены. Он должен как минимум сообщать «GoogleAnalytics 2.0b3 -[GAIDispatcher InitialDispatch:retryNumber:] (GAIDispatcher.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]]; линии, но ничего не делает. Я новичок в фоновых задачах, когда приложение переходит в фоновый режим, поэтому, возможно, я делаю что-то не так. Но в рамках своих исследований я даже упростил applicationWillResignActive до этого (который блокирует/должен блокировать)... но я получаю то же самое: никакой отладочной информации и переданных данных.
- (void)applicationWillResignActive:(UIApplication *)application
{
[[GAI sharedInstance] dispatch];
}
Я пробовал это с неотрицательным интервалом отправки (скажем, 15 секунд), и я получаю обычную передачу с запрошенным интервалом, но вызов ручной отправки не работает.
Вызовы ручной отправки в других частях моего кода работают. Просто кажется, что это не работает, когда приложение закрывается.
Любые мысли, советы о том, что я мог сделать неправильно и как я могу это исправить?