私の 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% わかりません。