2016-07-05 4 views
0

Googleタグマネージャのコンテナがこの関数でインスタンス化されています。これは、iOSがメインスレッドを制御してコンテナの設定が遅くなるため、googleTagContainerはnilGoogleタグマネージャのコンテナがiOSアプリケーションの後半に設定されています

-(void)containerAvailable:(TAGContainer *)container { 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     //Register custom function call tag or variable handler here if necessary 

     [self setGoogleTagContainer:container]; 

    }); 
} 

次の関数が呼び出されると、コンテナはまだ設定されていないので、if文をエスケープしてトラッキングデータを失います。

-(void)trackScreen:(NSString *)screen section:(NSString *)section location:(TWNLocation *)location additionalData:(NSDictionary *)data { 

    [super trackScreen:screen section:section location:location additionalData:data]; 

    //2016.1.8 Google Analytics 

    if ([self googleTagContainer] != nil) { 

     NSDictionary *googleTrackData = [self googleScreenDataForOmnitureScreen:screen section:section location:location data:data]; 

     if (googleTrackData != nil) { 

      [self submitGoogleTrackingData:googleTrackData]; 

     } else { 

      DMLogDebug(DebugLogTypeTracking, @"Google Analytics tracking data not available for screen: %@, section: %@", screen, section); 
     } 

    } //end if valid tag 

} 

Googleのコンテナが使用可能になった後にこの関数を呼び出すためにどのような方法やデータを保存して、コンテナの設定プロセスが終了します後に追跡データを送信する方法はありますか?

答えて

0

Googleタグマネージャの3.15 SDKではこれを直接サポートしていませんが、トラッキングデータを中間のキューにプッシュしてから、containerAvailableが呼び出されたときにそのキューをフラッシュすることができます。

あなたのコンテナをロードするユーティリティクラスを持っていると仮定し、NSMutableDictionaryはqueuedEventsと呼ばれており、およびディスパッチキュー_emitQueueは、次のような方法があるとします。

- (void)pushDataLayerUpdate:(NSDictionary*)update { 
    if (self.container) { 
    dispatch_async(_emitQueue, ^{ 
     [_tagManager.dataLayer push:update]; 
    }); 
    } else { 
    // The container is not loaded, queue the block. 
    [_queuedEvents addObject:update]; 
    } 
} 

コンテナの負荷、あなたがフラッシュするだろうしqueuedEventsように:

-(void)containerAvailable:(TAGContainer *)container { 
    // dispatch any pending events in the background. 
    dispatch_async(_emitQueue, ^{ 
    self.container = container; 
    TAGDataLayer *dataLayer = _tagManager.dataLayer; 
    for (NSDictionary *update in _queuedEvents) { 
     [dataLayer push:update]; 
    } 
    [_queuedEvents removeAllObjects]; 
    }); 
} 
+0

ありがとうEric !!!あなたのソリューションは魅力的な働きをしました。私はqueuedEventsをNSMutabaleArrayとして定義しました。 – Samira

+0

私は_emitQueueを使用せず、containerAvailableメソッドでdispatch_async(dispatch_get_main_queue()、^ {})を作成しました。代わりに。 – Samira

関連する問題