ディスパッチ - iOS SDK

このドキュメントでは、iOS 向け Google アナリティクス SDK v3 を使って、Google アナリティクスへのデータのディスパッチを管理する方法を説明します。

概要

iOS 向け Google アナリティクス SDK を使って収集されたデータは、 別のスレッドで Google アナリティクスにディスパッチされるまでローカルに保存されます。

データのディスパッチと受け取りは、各ビューのローカル タイムゾーンで翌日の午前 4 時 までに行う必要があります。それ以降に受信された データはレポートに表示されません。たとえば、午後 11 時 59 分にローカルなキューに送られたヒットをレポートに表示するには、4 時間以内(午前 3 時 59 分まで)にディスパッチする必要があります。一方、午前 12 時にキューに送られたヒットをレポートに表示するには、28 時間以内(翌日の午前 3 時 59 分まで)にディスパッチする必要があります。

定期的なディスパッチ

iOS 向け Google アナリティクス SDK では、デフォルトで 2 分おきにデータがディスパッチされます。

// Set the dispatch interval in seconds.
// 2 minutes (120 seconds) is the default value.
[GAI sharedInstance].dispatchInterval = 120;

負の値を設定すると定期的なディスパッチが無効となり、Google アナリティクスにデータを送るには手動によるディスパッチが必要になります。

// Disable periodic dispatch by setting dispatch interval to a value less than 1.
[GAI sharedInstance].dispatchInterval = 0;

ディスパッチを待つヒットが残っている間に、ネットワーク接続が切れたり、ユーザーがアプリを終了したりした場合、残りのヒットはローカル ストレージで保持され、次にアプリが起動するか、ディスパッチが呼び出されたときにディスパッチされます。

手動によるディスパッチ

ヒットを手動でディスパッチする方法は次のとおりです。手動によるディスパッチは、対象端末の無線が既に別のデータの送信に使われているとわかっている場合などに使用します。

[[GAI sharedInstance] dispatch];

バックグラウンドでのディスパッチ

iOS アプリでバックグラウンドでのディスパッチを有効にする方法は次のとおりです。

dispatchHandler のプロパティを追加する

AppDelegate クラスの実装ファイル(AppDelegate.m)で、@implementation AppDelegate の前に次のプロパティを追加します。

@interface AppDelegate ()
@property(nonatomic, copy) void (^dispatchHandler)(GAIDispatchResult result);
@end

@implementation AppDelegate
// ...

sendHitsInBackground メソッドを実装する

AppDelegate クラスでsendHitsInBackground メソッドを実装して、アプリがバックグラウンドに移行するタイミングでヒットを送信します。

// This method sends any queued hits when the app enters the background.
- (void)sendHitsInBackground {
  __block BOOL taskExpired = NO;

  __block UIBackgroundTaskIdentifier taskId =
  [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    taskExpired = YES;
  }];

  if (taskId == UIBackgroundTaskInvalid) {
    return;
  }

  __weak AppDelegate *weakSelf = self;
  self.dispatchHandler = ^(GAIDispatchResult result) {
    // Send hits until no hits are left, a dispatch error occurs, or
    // the background task expires.
    if (result == kGAIDispatchGood && !taskExpired) {
      [[GAI sharedInstance] dispatchWithCompletionHandler:weakSelf.dispatchHandler];
    } else {
      [[UIApplication sharedApplication] endBackgroundTask:taskId];
    }
  };

  [[GAI sharedInstance] dispatchWithCompletionHandler:self.dispatchHandler];
}

dispatchWithCompletionHandler メソッドは、パラメータとして完了ブロックを受け取り、1 つ以上の Google アナリティクス ビーコンが含まれるリクエストが完了するたびにその完了ブロックを呼び出します。このメソッドは、送信するデータが残っているかどうか、または最後のリクエストが正常に送信されたかどうかを結果として返します。このメソッドを使用することで、アプリがバックグラウンドに移行するタイミングで、効率的にビーコンをディスパッチできます。

applicationDidEnterBackground メソッドをオーバーライドする

AppDelegate クラスの applicationDidEnterBackground メソッドをオーバーライドして sendHitsInBackground メソッドを呼び出します。このメソッドは、アプリがバックグラウンドに移行したタイミングでヒットを送信します。

- (void)applicationDidEnterBackground:(UIApplication *)application {
  [self sendHitsInBackground];
}

applicationWillEnterForeground メソッドをオーバーライドする

AppDelegate クラスの applicationWillEnterForeground メソッドをオーバーライドして、ディスパッチの間隔を元に戻します。次に例を示します。

- (void)applicationWillEnterForeground:(UIApplication *)application {
  // Restores the dispatch interval because dispatchWithCompletionHandler
  // has disabled automatic dispatching.
  [GAI sharedInstance].dispatchInterval = 120;
}