2016-10-20 10 views
0

GAに奇妙な問題があります。私のアプリを起動するとすべて正常に動作しますが、別のアプリ(App Store、Testflight、またはテストランチャー)から起動すると、デッドロックが発生します。GoogleアナリティクスがiOSアプリケーションのメインスレッドをロックする

0 libsystem_kernel.dylib   0x000000018d255e1c __psynch_cvwait + 8 
1 libsystem_pthread.dylib   0x000000018d31a9d0 _pthread_cond_wait + 640 
2 Foundation      0x000000018ecc1620 -[NSCondition wait] + 240 
3 Foundation      0x000000018ec84a9c -[NSObject(NSThreadPerformAdditions) performSelector:onThread:withObject:waitUntilDone:modes:] + 792 
4 Foundation      0x000000018ec84764 -[NSObject(NSThreadPerformAdditions) performSelector:onThread:withObject:waitUntilDone:] + 128 
5 Search       0x00000001005d457c -[GAIDataStore performBlockAndWait:withError:] + 260 
6 Search       0x00000001005d69f4 -[GAIDataStore save:] + 92 
7 CoreFoundation     0x000000018e22222c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20 
8 CoreFoundation     0x000000018e221930 _CFXRegistrationPost + 400 
9 CoreFoundation     0x000000018e2216ac ___CFXNotificationPost_block_invoke + 60 
10 CoreFoundation     0x000000018e290b9c -[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1504 
11 CoreFoundation     0x000000018e163bf4 _CFXNotificationPost + 376 
12 Foundation      0x000000018ec6a6bc -[NSNotificationCenter postNotificationName:object:userInfo:] + 68 
13 UIKit       0x00000001941322b0 -[UIApplication _deactivateForReason:notify:] + 828 
14 UIKit       0x0000000194350470 __61-[UIApplication _sceneSettingsPreLifecycleEventDiffInspector]_block_invoke + 124 
[shortened] 

これだけTestflightから各打ち上げ打ち上げで発生:GAブロックは、メインスレッドは、次のスタックトレースをUIApplicationDidBecomeActiveNotification通知を処理します。 Springboardからアプリを開いても問題ありません。

iPad Airでスライドオーバー/スプリットビューアプリとしてアプリを開くのと同様の問題がありました。私はGAの初期化を遅らせることで問題を解決することができました。これは私の初期化コードです

GAI *theGAI = [GAI sharedInstance]; 

[theGAI trackerWithTrackingId:kTrackingId]; 
theGAI.trackUncaughtExceptions = YES; 
#ifdef DEBUG 
    theGAI.logger.logLevel = kGAILogLevelVerbose; 
#endif 

このデッドロックを回避するにはどうすればよいですか?

答えて

0

画面のトラッキングをバックグラウンドスレッドに入れてフリーズを避けることができました。最初の追跡は、GAIの初期化コードとの衝突を避けるために遅延される。

- (void)trackScreen { 
    static NSTimeInterval sDelay = 0.75; 
    NSString *theName = NSStringFromClass([self class]); 
    id<GAITracker> theTracker = self.tracker; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(sDelay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [theTracker set:kGAIScreenName value:theName]; 
     [theTracker send:[[GAIDictionaryBuilder createScreenView] build]]; 
     sDelay = 1.0/16.0; 
    }); 
} 
関連する問題