9

私の iOS アプリには Apple の App Store へのリンクがあり、それらをイベントとして追跡しようとしています。

問題は、アプリがバックグラウンドに入る前に GA イベントを適切にディスパッチできないことです。iOS SDK v2beta4 を使用しています。

ここでは、使用しているコードの概要を示します。私たちが「保険証券」コードと呼んでいるものをたくさん入れたことがわかるでしょう。私たちが正しいと思っている方法が機能していないからです。しかし、保険証券のコードでさえ、アプリがバックグラウンドに入る前に常にイベントをディスパッチするとは限りません。約 50% の時間しか機能せず、残りの時間はアプリに戻ってイベントをディスパッチする必要があります。

「applicationDidEnterBackground」でイベントをディスパッチし、「beginBackgroundTaskWithExpirationHandler」を介して iOS に追加の時間を要求するのが正しい方法であると考えています。このコードは、「保険ポリシー」コードなしで単独で試しました。少なくとも、保険コードのすべての行を正しくコメントアウトしたと思います。

グローバル変数 UIBackgroundTaskIdentifier bgTask を設定していることに注意してください。コードを含む AppDelegate.h ヘッダー ファイル

UIBackgroundTaskIdentifier  bgTask;

これを行う正しい方法であると思われるコードは次のとおりです。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplication *app = [UIApplication sharedApplication];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [[GAI sharedInstance] dispatch];

        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

上記のコードは動作するはずですが、動作しません。注: App Store は通常のアプリではなく、アプリ内の Web サイトです。

保険として、約 50% の確率でイベントをディスパッチする他のいくつかのことを行いました。

最初の [[GAI sharedInstance] dispatch] は、トラッキングが設定された関数ですぐに呼び出されます

ソースコード:

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

「applicationWillResignActive」にも入れます

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

最後に、アプリを完全に閉じると、別の GA ディスパッチが呼び出されます

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

これのどれもが 100% 常に機能するわけではありません。時間の約 50% のみ。アプリを再起動すると (バックグラウンドからか、アプリが完全に閉じられたかは関係ありません)、ディスパッチが送信されます。

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

この最後のビットでイベントがディスパッチされますが、ユーザーがアプリに戻った場合のみです。アプリに戻ったときにイベントをディスパッチしているのはこのコードなのか、アプリに戻ったときに GA のデフォルトのディスパッチなのかは 100% わかりません。

4

3 に答える 3

2

使用する[[GANTracker sharedTracker] dispatchSynchronous:]

dispatchメソッドは非同期操作を実行します。したがって、ディスパッチ操作が完了するのを待たずにすぐに戻ります。実際のディスパッチ操作が完了する前に、アプリが中断されている可能性があります。

- 編集 -

dispatchSynchronous:Google アナリティクス ライブラリの最新バージョンではメソッドがなくなっているようです。もなくなったのでGANTrackerDelegate、私が見る限り、発送作業がいつ終了するかを知る方法はありません。endBackgroundTask:したがって、定義済みのタイムアウト後にメソッドを呼び出すことをお勧めします。完全ではありませんが、 の直後に呼び出すよりはましですdispatch

コードは次のようになります。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  [[GAI sharedInstance] dispatch];

  double dispatchTimeout = 10.0;  // 10 seconds timeout
  dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(dispatchTimeout * NSEC_PER_SEC));
  dispatch_after(popTime, dispatch_get_current_queue(), ^(void){
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
  });
});
于 2013-03-18T22:22:41.977 に答える
2

「dispatch_get_current_queue()」は現在 iOS 6 で非推奨になっているため、次のコードを使用できるようになりました。

UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [[GAI sharedInstance] dispatch];

    double dispatchTimeout = 10.0;  // 10 seconds timeout
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(dispatchTimeout * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
});
于 2014-11-11T15:54:18.977 に答える
1

GoogleAnalytics 3.14 では、次のdispatchWithCompletionHandler:ように使用しています。

//track any event here as usual and then call:

GAI.sharedInstance().dispatchWithCompletionHandler({ (_) -> Void in
    UIApplication.sharedApplication().openURL(URL)
})

そして、それは適切に機能しているようです。

于 2015-11-23T08:46:31.497 に答える