使用带有 SecKeyGetBlockSize 的 IBM MobileFirst Platform 启动后,应用程序立即失败

Posted

技术标签:

【中文标题】使用带有 SecKeyGetBlockSize 的 IBM MobileFirst Platform 启动后,应用程序立即失败【英文标题】:App fails right after start with IBM MobileFirst Platform with SecKeyGetBlockSize 【发布时间】:2017-05-17 19:39:26 【问题描述】:

我们有很多用户,但只有几个有这个问题。该应用程序在启动后立即崩溃。 Bitcode 和 ATS 都被禁用。什么可能导致此问题?谢谢

Hardware Model:      iPhone9,3          
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Date/Time:           2017-05-16 18:05:01.2852 -0400
Launch Time:         2017-05-16 18:04:57.4399 -0400
OS Version:          iPhone OS 10.3.1 (14E304)
Report Version:      104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000010
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]
Triggered by Thread:  0

Thread 0 name:
Thread 0 Crashed:
SecKeyGetBlockSize + 0 (SecKey.c:696)
WLCertManager signData:privateKey:] + 276 (WLCertManager.m:525)
[WLDeviceAuthManager signDeviceAuth:entity:isPEnabled:] + 1168 (WLDeviceAuthManager.m:173)
[BaseProvisioningChallengeHandler onDeviceAuthDataReady:] + 172 (BaseProvisioningChallengeHandler.m:162)
[BaseDeviceAuthChallengeHandler getDeviceAuthDataAsync:] + 1308 (BaseDeviceAuthChallengeHandler.m:58)
[BaseProvisioningChallengeHandler handleChallenge:] + 1040 (BaseProvisioningChallengeHandler.m:138)
[WLRequest startHandleChallenges:httpRequest:]_block_invoke + 484 (WLRequest.m:606)
[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:]_block_invoke + 136 (NSDictionary.m:680)
[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:] + 180 (NSDictionary.m:692)
[WLRequest startHandleChallenges:httpRequest:] + 256 (WLRequest.m:598)
[WLRequest requestFailed:error:] + 604 (WLRequest.m:505)
[WLAFHTTPRequestOperationManagerWrapper requestFailed:error:] + 2020 (WLAFHTTPRequestOperationManagerWrapper.m:396)
[WLAFHTTPRequestOperationManagerWrapper start]_block_invoke229 + 112 (WLAFHTTPRequestOperationManagerWrapper.m:340)
[WLAFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]_block_invoke42 + 112 (WLAFHTTPRequestOperation.m:141)
dispatch_call_block_and_release + 24 (init.c:963)
_dispatch_main_queue_callback_4CF + 444 (inline_internal.h:2417)
 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12 (CFRunLoop.c:1793)
 __CFRunLoopRun + 1572 (CFRunLoop.c:3004)
CFRunLoopRunSpecific + 424 (CFRunLoop.c:3113)
 GSEventRunModal + 100 (GSEvent.c:2245)
UIApplicationMain + 208 (UIApplication.m:4089)
main + 200 (main.swift:12)
libdyld.dylib       0x000000018eeb559c start + 4

完整日志在这里https://drive.google.com/open?id=0B1GqBSG2XUgZYmhJVGFRakFtWUU

它看起来就像我们正在做的时候发生的那样

private lazy var client: WLClient = WLClient.sharedInstance()
self.client.wlConnectWithDelegate(SomeDelegate)

MFP 版本 = 7.1-2016/07/11

【问题讨论】:

您能解释一下您正在使用哪个应用程序以及它在做什么吗?应用程序似乎首先失败,然后在错误处理中崩溃。代码的堆栈跟踪显示 MFP 版本 7.1 或更低,但了解 MFP 的确切版本会有所帮助。即使是应用程序执行的线路跟踪也将有助于进一步调试。 MFP 版本 = 7.1-2016/07/11。我可以给你发电子邮件吗?这里没有足够的空间来附加跟踪。谢谢 请上传到文件共享服务并共享链接 我添加了更多有问题的数据。谢谢 【参考方案1】:

EXC_BAD_ACCESS 是由空指针引用引起的。我之前在多次调用 wlConnectWithDelegate 时看到过这种情况。 我会尝试像这样使用 Swift 的 dispatch_once_t 单例:

var token: dispatch_once_t = 0
dispatch_once(&token) 
    //Make sure you register all challenge handlers then connect
    WLClient.sharedInstance().wlConnectWithDelegate(SomeDelegate)

【讨论】:

【参考方案2】:

异常看起来像 MobileFirst SDK 中的钥匙串访问错误。 MobileFirst 在 7.1 中不支持后台模式。请确保您的应用未尝试从后台运行 MobileFirst 连接 API。此外,请确保在 Targets->Capabilities 中启用“KeyChain Sharing”。

【讨论】:

1. Xcode 7 是否强制要求“钥匙串共享”?我们仍在使用 Xcode 7。文档说它对于 Xcode 8 (mobilefirstplatform.ibmcloud.com/blog/2016/09/16/…) 是强制性的,并且所有崩溃都发生在真实设备中。 2. 启动后立即发生崩溃,大约 4 秒,日志告诉“前台”中的应用程序。 您的日志显示 ios 版本为“iPhone OS 10.3.1”。当您在设备上运行时,钥匙串共享无关紧要。在后台或锁定手机屏幕上的应用程序曾经出现类似错误。我们为此提供了一些修复。在这一点上,我可以建议你跟随。 1. 尝试使用最新的 ifix for MFP 7.1。从今年开始,我们做了一些钥匙串处理修复。 2. 如果 #1 不能解决您的问题,请在 IBM 支持下打开 PMR,让我们知道您是否可以尝试使用调试版本。以便我们进一步帮助您。【参考方案3】:

已针对 MobileFirst 7.1 修复并发布该问题

【讨论】:

以上是关于使用带有 SecKeyGetBlockSize 的 IBM MobileFirst Platform 启动后,应用程序立即失败的主要内容,如果未能解决你的问题,请参考以下文章

HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是啥?

使用带有 ajax Rest 调用的 Spring CSRF 和带有 Thymeleaf 的 HTML 页面

如何使用带有或不带有 Appium 的 Robot Framework 集成 WinAppDriver?

如何在带有 React 的 Typescript/JSX 中使用带有箭头函数的泛型?

优化数据库有啥更好的方法:使用带有不同过滤器的一堆存储过程,还是使用带有 if 条件的单个存储过程?

使用带有数据数组的 Yii2 和带有排序和过滤的 Gridview