2016-10-20 1 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 통지를 처리합니다. 스프링 보드에서 응용 프로그램을 여는 것이 좋습니다.

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; 
    }); 
}