Google Analytics锁定iOS应用中的主线程

时间:2016-10-20 13:34:10

标签: ios objective-c google-analytics-v4

我对GA有一个奇怪的问题。当我启动我的应用程序时一切正常,但从另一个应用程序(App Store,Testflight或测试启动器)启动它会导致死锁。 GA阻止主线程使用以下堆栈跟踪处理UIApplicationDidBecomeActiveNotification通知:

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的每次启动时。从Springboard打开应用程序可以正常工作。

我在iPad Air上滑动/拆分视图应用程序时打开应用程序时出现类似问题。我可以通过延迟初始化GA来解决问题。这是我的初始化代码:

GAI *theGAI = [GAI sharedInstance];

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

如何避免这种僵局?

1 个答案:

答案 0 :(得分: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;
    });
}
相关问题