我一直在跟踪项目中的错误,该错误导致应用程序冻结,迫使用户重新启动。

仅在发行版本中才有可能,因此要进行跟踪一直很棘手。这是一个社交应用程序,用户可以将照片上传到他们的个人资料。仅在首次下载后首次运行或重置隐私设置后,然后再通过流程发布照片,才出现此问题。在发布期间,系统会要求用户授予访问照片以及访问其位置的权限。

在定位服务请求上选择“允许”后,应用程序将无响应。

因此,我最初的调查是围绕使用CLLocationManager,我怀疑委托回调存在问题。

我无法使用调试配置进行复制,但是可以在设备上运行发布配置,并且当应用对调试器无响应而暂停调试器时,调用堆栈会指向Google Analytics(分析)库。

0   0x37a9fb38 in __psynch_cvwait ()<br>
1   0x37b1c3f8 in _pthread_cond_wait ()<br>
2   0x37b1d2dc in pthread_cond_wait ()<br>
3   0x2aa3b482 in -[__NSOperationInternal _waitUntilFinished:] ()<br>
4   0x29c5799e in _CFXNotificationPost ()<br>
5   0x2a9879b8 in -NSNotificationCenter postNotificationName:object:userInfo: ()<br>
6   0x29a87b96 in -NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges ()<br>
7   0x29a6e12e in -[NSManagedObjectContext save:] ()<br>
8   0x002d2e82 in __21-[GAIDataStore save:]_block_invoke ()<br>
9   0x002d16b8 in -GAIDataStore performBlockAndWait:withError: ()<br>
10  0x002d2dc2 in -[GAIDataStore save:] ()<br>
11  0x002db62a in -[GAIBatchingDispatcher persist:] ()<br>
12  0x002dc7aa in -[GAIBatchingDispatcher queueDispatch:] ()<br>
13  0x002dc5b0 in -[GAIBatchingDispatcher queueModel:] ()<br>
14  0x2aa5259e in __NSThreadPerformPerform ()<br>
15  0x29d0958e in _CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION_ ()<br>
16  0x29d0899e in __CFRunLoopDoSources0 ()<br>
17  0x29d07004 in __CFRunLoopRun ()<br>
18  0x29c55620 in CFRunLoopRunSpecific ()<br>
19  0x29c55432 in CFRunLoopRunInMode ()<br>
20  0x2a98d42c in -NSRunLoop(NSRunLoop) runMode:beforeDate: ()<br>
21  0x2a9db8ec in -NSRunLoop(NSRunLoop) run ()<br>
22  0x002cf270 in +[GAI threadMain:] ()<br>
23  0x2aa5238a in _NSThreadmain_ ()<br>
24  0x37b1ce92 in _pthread_body ()<br>
25  0x37b1ce06 in _pthread_start ()<br>

该问题仅出现在iOS8中,并且我正在运行Google Analytics iOS SDK 3.07版。

该应用程序已上线,并且在显示bug之前(iOS8上线时),GAI已集成了几个月。关于GAI集成问题的几篇文章都报告了链接库的问题,但是我认为情况并非如此,因为它在大多数情况下都能正常工作。

如果有人看到过任何类似的问题或有任何建议,这将是有帮助的。

谢谢,

最佳答案

您正在听NSManagedObjectContextDidSaveNotification时,GAI SDK会发布此通知,而GAI SDK正在使用与您的持久存储协调器不同,因此,如果GAI SDK发布了此通知并尝试合并该通知,则您要合并两个更改不同的持久性存储,可能会导致问题。

解决方案很简单,当您监听NSManagedObjectContextDidSaveNotification时,您仅响应来自背景上下文的通知。
通过使用object参数

[NSNotificationCenter -addObserver:selector:name:object:]

您只能收听后台上下文,那么GAI上下文不会触发上下文合并。

关于ios - iOS8卡住在[GAIDataStore保存],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26548112/

10-10 09:55