在iOS 11.3中,NKLibrary在init上崩溃

时间:2018-03-31 18:07:42

标签: ios newsstand-kit

我们仍然有一些旧的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

2 个答案:

答案 0 :(得分:2)

我联系了Apple开发人员的技术支持。我收到了非常完整的答复。

我的理解是:

  • 这是iOS 11.3 NewsStand中的一个错误。
  • 它会影响在升级到iOS 11.3时已经排队的报亭资产下载的用户
  • 只能由用户删除其应用并重新安装来修复。可能的Apple会解决iOS 11.4中的错误,这可能会将它们从死亡循环中拯救出来,但在此之前,重新安装是唯一的选择。

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)
…
  

看起来很熟悉,嗯?

     

我相信这正是您的用户所发生的事情:

     
      
  1. 他们在11.2.6上运行您的应用,并拥有一个有效下载的资源。结果是NKLibrary保存了包含NSURLRequest的不安全密钥存档。

  2.   
  3. 他们更新为11.3。

  4.   
  5. NKLibrary尝试安全加载其存档,但崩溃了。

  6.         

    大多数用户看不到这一点,因为他们在11.2.6中没有有效下载,因此密钥存档不包含NSURLRequest

         

    我已经要求CFNetwork工程师看看他们是否可以尽快解决这个问题。根据对话的内容,我可能会或可能不会与报亭套件人聊天,看看他们对潜在解决方案的看法。

答案 1 :(得分:0)

检查文档以查看NewsKit的工作方式是否发生了变化。从docs开始,看起来sharedLibrary可以返回nil,这与你看到的崩溃排成一行。

  

sharedLibrary

     

返回代表报亭的共享实例   内容库。

     

返回值

     

NKLibrary类的单例实例或 nil 如果是   无法创建实例。