Google Analytics(分析)iOS v2beta3 - 手动调度在applicationWillResignActive中不起作用

Ste*_*son 9 google-analytics dispatch ios

我一直在使用谷歌的Analytics SDK v2beta3并且一切正常,但是当应用程序离开活动状态时我无法手动调度.(fyi,对于我的应用程序,我需要预留电池电量,所以我只使用'[[GAI sharedinstance] dispatch]'来在用户完成应用程序时发送我的事件数据.)

我已经尝试了几件事,但是在跟踪调度到达并在跟踪期间运行时,它似乎没有做任何事情......没有日志输出(我打开了调试模式)并且没有上传数据.它应该最低限度报告 "Google分析2.0b3 - [GAIDispatcher initiateDispatch: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;
     }
}
Run Code Online (Sandbox Code Playgroud)

该应用程序到达并执行'[[GAI sharedInstance] dispatch];' 但没有做任何事情.当应用程序进入后台时,我是一个有背景任务的新手,所以也许我做错了什么.但作为我的调查的一部分,我甚至简化了applicationWillResignActive(这应该是/应该阻止)...但我得到同样的事情:没有调试信息和没有传输数据.

 - (void)applicationWillResignActive:(UIApplication *)application
{
    [[GAI sharedInstance] dispatch];
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了调度间隔非负(比如15秒),并且我按照请求的间隔进行常规传输,但是手动调度的调用不起作用.

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

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

Wil*_*ill 0

我们遇到了这个问题,但能够将成功率提高到 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];
    ...
}
Run Code Online (Sandbox Code Playgroud)

另外,查看主要问题中的示例代码 - Apple 声明将执行后台任务的代码放在

applicationDidEnterBackground:
Run Code Online (Sandbox Code Playgroud)

代替

applicationWillResignActive:
Run Code Online (Sandbox Code Playgroud)

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

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

另外,如果您想更仔细地了解我们如何获得大约 50% 的成功,我还发布了一篇关于我们对代码示例所做的较长的文章:当 iOS 应用程序进入后台时,我们如何调度 Google Analytics 事件?

但在这一点上,如果有人找到的话,我仍然想要一个达到 100% 的解决方案。