Xcode12 CoreNFC 模拟器库未加载

Posted

技术标签:

【中文标题】Xcode12 CoreNFC 模拟器库未加载【英文标题】:Xcode12 CoreNFC simulator library not loaded 【发布时间】:2020-09-16 08:07:13 【问题描述】:

我们的应用程序使用 CoreNFC 扫描 NFC 标签,如果不支持 NFC,您可以使用 QR。这工作得很好,我们能够在模拟器中运行应用程序以进行(ui)测试。 直到 Xcode12 / ios14 GM 构建。在 iOS13(或更低版本)中,我们在模拟器上运行它不会有任何问题。

但在 Xcode12 中,在 iOS14 模拟器 iPhone11 上运行它,我们会得到以下结果:

dyld: launch, loading dependent libraries
DYLD_SHARED_CACHE_DIR=/Users/xxx/Library/Developer/CoreSimulator/Caches/dyld/19G73/com.apple.CoreSimulator.SimRuntime.iOS-14-0.18A372
DYLD_ROOT_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot
DYLD_LIBRARY_PATH=/Users/xxx/Library/Developer/Xcode/DerivedData/xxx-awnlestrbvesqqbynrhmluzhbcsc/Build/Products/Debug-iphonesimulator:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/introspection
DYLD_INSERT_LIBRARIES=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libBacktraceRecording.dylib:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSi
dyld: Library not loaded: /usr/lib/libnfshared.dylib
  Referenced from: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreNFC.framework/CoreNFC
  Reason: no suitable image found.  Did find:
    /usr/lib/libnfshared.dylib: mach-o, but not built for platform iOS-sim

模拟器崩溃对我来说很有意义,因为模拟器无法扫描 NFC 标签,但这就是我所做的:

我已经链接到 CoreNFC 框架并将其设为可选,如下所述:Xcode 10, Swift 4 app with CoreNFC crashes in review on iOS 12 将#if canImport(CoreNFC) 放在import CoreNFC 周围,它是底层NFC 代码。 清理构建文件夹并删除派生数据。 创建了一个空的 Xcode12 项目:https://github.com/basvankuijck/CoreNFCCrashProject,结果相同。 删除了所有列出的模拟器并重新添加了一个 在其他链接器标志构建设置中添加了-weak_framework "CoreNFC"

通过注释掉代码部分并删除框架链接来删除对 CoreNFC 框架的任何引用,显然会使崩溃消失。但这不是一个合适的选择。

在 iOS13 模拟器“设备”上从 Xcode12 运行它可以完美运行。所以我似乎无法弄清楚是什么导致了这种行为

【问题讨论】:

【参考方案1】:

Apple 显然忘记在 iOS 14 模拟器的 Xcode 12 最终版本中添加 libnfshared.dylib。在 Apple 修复此问题之前,一个可行的解决方法是从 Xcode 12 beta 6 复制缺少的库(从 Apple 的开发人员下载部分下载 beta)。可以在此处找到缺少的库,并且必须进入最终 Xcode 12 的同一目录

这对我有用。 ?

如果您想避免为单个文件下载 11.25GB Xcode 12.2 测试版的麻烦。我有文件要分享。

您可以执行以下命令下载并放入Xcode包中:

sudo curl https://storage.googleapis.com/mobile-simulator-build/libnfshared.dylib -o /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libnfshared.dylib

希望对你有帮助?

【讨论】:

谢谢,这省去了下载 Xcode 的麻烦:D Apple 开发人员似乎应该为此添加单元测试以避免将来:) 为我完美工作并拯救了我的一天:) @arif【参考方案2】:

Apple 显然忘记在 iOS 14 模拟器的 Xcode 12 最终版本中添加libnfshared.dylib。在 Apple 修复此问题之前,一个可行的解决方法是从 Xcode 12 beta 6 复制缺少的库(从 Apple 的开发人员下载部分下载 beta)。可以在此处找到缺少的库,并且必须进入最终 Xcode 12 的同一目录:

Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib

【讨论】:

【参考方案3】:

链接器说文件 libnfshared (mach-o) 不包含模拟器的二进制文件,这很奇怪,因为它是 Apple 核心框架。

使用 Xcode 12 创建一个新项目并导入 NFC 框架。构建它并在模拟器上运行它。如果它没有崩溃,那么比较这些项目之间专门针对 DYLD 的构建设置。

如果这没有帮助,请删除所有模拟器并重新创建新的。

更新:

这是IOS 14的bug,有人提交了雷达:openradar.appspot.com/FB8699389

【讨论】:

感谢您的建议,但不幸的是我得到了相同的结果:github.com/basvankuijck/CoreNFCCrashProject @basvk 删除所有模拟器并重新创建它们 看起来这是苹果方面的问题。 @basvk 我认为您应该提交雷达。 在收到反馈或找到任何解决方法时让我们发布! 是的,其他人提交了雷达:openradar.appspot.com/FB8699389【参考方案4】:

稍后,但可能对其他人有用...

场景:

应用必须使用 NFC(如果可用) 也必须在预 NFC 设备上工作(即 iPhone 6 和 iOS12) 为 iOS12 构建

一些“好用”的技术:

#if canImport(CoreNFC)

import CoreNFC
...

而不是旧的:

 @available(iOS 11.0, *) .. and similar..

注意事项:

“canImport”在编译时起作用,所以如果你想解决:

“dyld:库未加载:/System/Library/Frameworks/CoreNFC.framework/CoreNFC 引用自:/var/... 原因:找不到图像” 消息

我们必须注意 LINK 部分。

链接部分:

Xcode 12.5 不允许在其菜单中进行“可选”链接 我们必须转到“其他链接器标志”并添加:

-weak_framework 核心NFC

两行

(在文本中将是: OTHER_LDFLAGS = -weak_framework CoreNFC -lstdc++ )

【讨论】:

【参考方案5】:

我的应用程序遇到了同样的问题,虽然我没有使用 CoreNFC 框架。这可以解决

Xcode-12.2 beta 2. 2020 年 9 月 29 日发布

【讨论】:

以上是关于Xcode12 CoreNFC 模拟器库未加载的主要内容,如果未能解决你的问题,请参考以下文章

dyld:库未加载 Xcode11

dyld:库未加载Xcode11

Xcode 13 dyld:库未加载:/System/Library/Frameworks/LinkPresentation.framework/LinkPresentation

dyld:库未加载...原因:找不到合适的图像 Xcode Swift

dyld:库未加载:@rpath/libswiftCore.dylib

Xcode 10.2 无法在 iOS < 10 的模拟器上运行应用程序