我们仍然有一些旧的NewsstandKit
代码,几年内没有更新。
出于某种原因,我们的应用程序自2017年以来一直在商店中的版本现在正在遭遇iOS 11.3的一系列崩溃,这似乎是在我们第一次在应用程序启动时调用[NKLibrary sharedLibrary]
时引起的。 / p>
堆栈跟踪指向NewsstandKit
深处的网络呼叫。
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000000
Crashed: com.apple.main-thread
0 CoreFoundation 0x1810b63d4 CFBooleanGetValue + 80
1 CFNetwork 0x181823944 URLRequest::initialize(long, void const**, long, __CFDictionary const*) + 328
2 CFNetwork 0x1817d7298 _CFURLRequestCreateFromArchiveList + 136
3 CFNetwork 0x18195bfd4 -[NSURLRequest initWithCoder:] + 1660
4 Foundation 0x181ba01e8 _decodeObjectBinary + 1720
5 Foundation 0x181b9fa88 _decodeObject + 308
6 Foundation 0x181b2e8bc -[NSKeyedUnarchiver decodeObjectOfClasses:forKey:] + 432
7 NewsstandKit 0x1a24031a4 -[NKAssetDownload initWithCoder:] + 216
8 Foundation 0x181ba01e8 _decodeObjectBinary + 1720
9 Foundation 0x181b4d010 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1388
10 Foundation 0x181b53c54 -[NSArray(NSArray) initWithCoder:] + 220
11 Foundation 0x181ba01e8 _decodeObjectBinary + 1720
12 Foundation 0x181b9fa88 _decodeObject + 308
13 Foundation 0x181b2e8bc -[NSKeyedUnarchiver decodeObjectOfClasses:forKey:] + 432
14 NewsstandKit 0x1a2401a08 -[NKIssue initWithCoder:] + 316
15 Foundation 0x181ba01e8 _decodeObjectBinary + 1720
16 Foundation 0x181b4d010 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1388
17 Foundation 0x181b53c54 -[NSArray(NSArray) initWithCoder:] + 220
18 Foundation 0x181ba01e8 _decodeObjectBinary + 1720
19 Foundation 0x181b4d010 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1388
20 Foundation 0x181b4d340 -[NSDictionary(NSDictionary) initWithCoder:] + 224
21 Foundation 0x181ba01e8 _decodeObjectBinary + 1720
22 Foundation 0x181b9fa88 _decodeObject + 308
23 Foundation 0x181b2e8bc -[NSKeyedUnarchiver decodeObjectOfClasses:forKey:] + 432
24 Foundation 0x181bcac84 -[NSCoder(Exceptions) __tryDecodeObjectForKey:error:decodeBlock:] + 80
25 Foundation 0x181bca9e4 -[NSCoder decodeTopLevelObjectOfClasses:forKey:error:] + 92
26 Foundation 0x181c088e4 +[NSKeyedUnarchiver(NSKeyedUnarchiverSecureCodingInitializers) unarchivedObjectOfClasses:fromData:error:] + 140
27 NewsstandKit 0x1a240042c -[NKLibrary _load] + 272
28 NewsstandKit 0x1a23fe8b8 -[NKLibrary init] + 568
29 NewsstandKit 0x1a23fe628 __26+[NKLibrary sharedLibrary]_block_invoke + 92
30 libdispatch.dylib 0x180ae0ae4 _dispatch_client_callout + 16
31 libdispatch.dylib 0x180ae42ec dispatch_once_f$VARIANT$mp + 60
32 NewsstandKit 0x1a23fe5c8 +[NKLibrary sharedLibrary] + 112
33 MY_APP 0x1007d29e4 -[MYAPPCLASS MYAPPMETHOD] (MYFILE.m:90)
第33行是我们调用[NKLibrary sharedLibrary].currentlyReadingIssue
的点,这就是我们现在获得的所有信息。这似乎是在应用程序启动后发生的,但如果在后台或前台触发,则没有任何信息。
只是好奇其他人是否见过这个?我唯一的想法是我们需要删除NewsstandKit
。
答案 0 :(得分:2)
我联系了Apple开发人员的技术支持。我收到了非常完整的答复。
我的理解是:
Apple的回复,为标记轻微编辑:
我抓住了你的bug(
2018-04-12_08-08-18.4485_+0100-41f4ffc57b5f5e16c05c0baaa6a426ff9321cdb5.crash
)的崩溃报告并深入了解了一下。首先,这是崩溃回溯的编辑版本:第37帧是调度你的代码 第36至34帧是启动报亭套件的代码 框架33到30是
+[NKLibrary sharedLibrary]
做单身事物 第29帧和第28帧是NKLibrary
的初始化者。通过取消归档密钥存档(第27至5帧),这显然可以完成大部分工作 最后,第4帧表示库中的一个对象是NSURLRequest
,并指向通向崩溃帧的帧, 第0帧是通常的NSURLRequest
解码逻辑。基于以上所述,我开始研究
NKLibrary
如何处理其归档和取消归档。虽然这样做我偶然发现了我认为是这个错误的根本原因,即在11.3中我们更新了报亭套件以使用其库34837823>的安全编码。这通常是一件好事,但似乎在NSURLRequest
内的安全编码支持中暴露了一个潜在的问题。考虑附加的测试项目(
Test39132525
)。它有两个按钮:
Save Insecure会创建一个包含
NSURLRequest
的简单密钥存档。加载安全尝试使用安全编码器加载它。
如果你以明显的方式运行它(运行,保存,加载),它会像这样的回溯崩溃:
Thread 6 Crashed:
0 … CFBooleanGetValue + 80 (CFInternal.h:713)
…
4 … -[NSURLRequest initWithCoder:] + 1660 (NSURLRequest.mm:280)
5 … _decodeObjectBinary + 1720 (NSKeyedArchiver.m:2391)
…
27 … +[NSKeyedUnarchiver(NSKeyedUnarchiverSecureCodingInitializers) unarch…
28 … -[NKLibrary _load] + 272 (NKLibrary.m:470)
29 … -[NKLibrary init] + 568 (NKLibrary.m:108)
30 … __26+[NKLibrary sharedLibrary]_block_invoke + 92 (NKLibrary.m:75)
31 … _dispatch_client_callout + 16 (object.m:507)
32 … dispatch_once_f$VARIANT$mp + 60 (once.c:63)
33 … +[NKLibrary sharedLibrary] + 112 (once.h:84)
34 … static NewsstandUtilities.allIssues() + 36 (NewsstandUtilities.swift:…
35 … closure #1 in static NewsstandIOUtility.deleteAllLegacyImagesFromExis…
36 … thunk for @callee_owned () -> () + 36 (WelcomeViewController.swift:0)
37 … _dispatch_call_block_and_release + 24 (init.c:994)
…
看起来很熟悉,嗯?
我相信这正是您的用户所发生的事情:
他们在11.2.6上运行您的应用,并拥有一个有效下载的资源。结果是
NKLibrary
保存了包含NSURLRequest
的不安全密钥存档。他们更新为11.3。
- 醇>
NKLibrary
尝试安全加载其存档,但崩溃了。大多数用户看不到这一点,因为他们在11.2.6中没有有效下载,因此密钥存档不包含
NSURLRequest
。我已经要求CFNetwork工程师看看他们是否可以尽快解决这个问题。根据对话的内容,我可能会或可能不会与报亭套件人聊天,看看他们对潜在解决方案的看法。
答案 1 :(得分:0)
检查文档以查看NewsKit的工作方式是否发生了变化。从docs开始,看起来sharedLibrary
可以返回nil,这与你看到的崩溃排成一行。
sharedLibrary
返回代表报亭的共享实例 内容库。
返回值
NKLibrary类的单例实例或 nil 如果是 无法创建实例。