9

私はGoogleのAnalytics SDK v2beta3を使用しており、アプリがアクティブな状態を離れたときに手動ディスパッチが機能しないことを除いて、すべてが機能しています。(fyi、私のアプリではバッテリー電源を確保する必要があるため、ユーザーがアプリを終了したときにイベントデータをディスパッチするために「[[GAI sharedinstance] dispatch]」のみを使用しています。)

いくつかのことを試しましたが、トレース中にディスパッチ呼び出しに到達して実行されている間、何もしていないようです...ログ出力がなく(デバッグモードがオンになっています)、データがアップロードされません。最小限、「GoogleAnalytics 2.0b3 -[GAIDispatcher initializeDispatch:retryNumber:] (GAIDispatcher.m:479) DEBUG: 保留中のヒットはありません」と報告する必要があります。またはそのようなものだと思います。しかし、ログには何も記録されておらず、データも送信されていません。

代わりに、アプリがバックグラウンドから再開すると、ヒットが送信され、コンソールにすべてのデバッグ ステートメントが表示され、データが Google アナリティクス アカウントに正常に送信されます。

以下は私のコードです...

- (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 秒) で試してみましたが、要求された間隔で定期的に送信されますが、手動でディスパッチする呼び出しは機能しません。

コードの他の部分での手動ディスパッチの呼び出しは機能します。アプリが閉じているときは機能しないようです。

私が間違っていた可能性があることと、これを修正する方法について何かアドバイスはありますか?

4

3 に答える 3

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

また、メインの質問のサンプル コードを見ると、Apple はバックグラウンド タスクを実行するためのコードを

applicationDidEnterBackground:

それ以外の

applicationWillResignActive:

しかし、それが私たちに大きな影響を与えているようには見えません。この件に関する Apple のドキュメントは次のとおりです (リスト 3-3 を参照)。

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

また、どのようにして約 50% の成功を達成したかを詳しく知りたい場合は、コード サンプルで何を行ったかについての長い投稿を掲載しました。

現時点では、誰かが見つけた場合は 100% になるソリューションが必要です。

于 2013-03-18T20:31:23.470 に答える