我一直在追踪我的项目中的一个错误,该错误导致应用程序冻结,迫使用户重新启动。
只有在发布版本中才有可能,所以追踪是很棘手的。这是一个社交应用,用户将照片上传到他们的个人资料。问题仅在首次下载后或重置隐私设置后首次运行时发生,然后通过流程发布照片。在帖子期间,要求用户访问照片以及访问他们的位置。
在位置服务请求中选择“允许”后,应用程序无响应。
所以我的初步调查是围绕CLLocationManager的使用,我怀疑委托回调有问题。
我无法使用调试配置重现,但可以在设备上运行发布配置,当应用程序无响应时暂停调试器,callstack指向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版。
该应用程序已上线,并且在出现错误之前已经整合了几个月,这是iOS8上线的时候。关于GAI集成问题的几个帖子报告了链接库的问题,但我不认为这是因为它在大多数情况下工作正常。
如果有人看到任何类似问题或有任何建议,这将有所帮助。
谢谢,
答案 0 :(得分:1)
您正在收听NSManagedObjectContextDidSaveNotification
,GAI SDK会发布此通知,而GAI SDK正在使用您的不同的持久性商店协调员,因此,如果GAI SDK发布此通知,那么尝试合并通知,您正在合并两个不同持久存储的更改,这可能会导致问题。
解决方案很简单,在收听NSManagedObjectContextDidSaveNotification
时,您只会回复来自您的背景情况的通知
使用
object
参数
[NSNotificationCenter -addObserver:selector:name:object:]
你只能听背景上下文,那么GAI上下文不会触发上下文合并。