dyld: 当尝试运行iOS应用程序时,找不到符号:_NSURLAuthenticationMethodClientCertificate

50
我的应用程序出现崩溃,显示以下信息:
dyld: Symbol not found: _NSURLAuthenticationMethodClientCertificate Referenced from:/var/mobile/Applications/C7B596AD-FB09-4685-BDFC-7E955A5DD185/IRON TRAINERS.app/IRON TRAINERS Expected in:/System/Library/Frameworks/CFNetwork.framework/CFNetwork in /var/mobile/Applications/C7B596AD-FB09-4685-BDFC-7E955A5DD185/IRON TRAINERS.app/IRON TRAINERS (lldb)
在构建和运行时出现此问题。当我从项目中移除 CFNetwork 后它能够正常工作,但我不知道原因。
我刚刚安装了 Xcode6Beta 并打开了我的项目,在 Xcode5.1 上它一切正常。
更新:
在使用 Xcode 6 的 iOS 模拟器上它能够正常工作,问题只存在于我的设备上,其运行的是 iOS 7.1.1。
更新2:
下面所选的答案对我有用,尽管我已经将基础框架显式添加到了我的项目中,但我不得不将其删除并重新添加。问题解决了,至少目前是这样 :)

3
是的,我的应用也会出现这种情况。在Xcode 5.1 iOS 7.1中运行良好,但在Xcode6 iOS8中出现了完全相同的错误(当然除了目标名称)。我怀疑这与我在应用程序中进行的一些HTTPS调用有关。但由于我在这方面没有进行任何高级操作或手动设置,所以我认为这可能是测试版本中的一个漏洞。 - Elechtron
1
是的,我认为你是对的。由于我使用parse.com作为后端,我甚至不知道这是在哪里发生的。但是我肯定是在使用某些parse命令进行网络调用并返回错误。 - Jorge
我不确定我们是否可以在公共场合谈论xcode6,因为苹果公司只在测试版中分享此应用程序。Xcode5及更早版本没有这个问题。但也许下一个测试版会解决这个问题。 - Vinh
这篇帖子解决了我的问题:https://dev59.com/aWAg5IYBdhLWcg3wBXAR - WOODE Soft
11个回答

89

编辑后包含两个可能需要进行的步骤:

  1. 确保将基础框架添加到您的项目中(删除并再次添加以确保它已添加)。
  2. 确保基础框架在CFNetwork之前被包括。

在iOS 8.0中,头文件包含了一些改变(例如,glextensions文件不再在顶级头文件中)。如果您显式地将基础框架添加到您的项目中,它将能够成功建立。将CFNetwork设为可选项,只是针对构建错误而非总体解决方案。

输入图像描述


2
它已经在我的项目中了,但我将其删除并重新插入。现在看起来它正在工作。不过我不确定发生了什么。让我运行几个测试,然后我会给你反馈。谢谢。 - Jorge
1
为了方便起见,我只需要取消Foundation.framework的目标成员资格复选框并重新勾选即可。 - Gary Makin
2
实际上,这并没有解决问题!真正解决问题的是Lap.felix提供的另一个答案:重新排列你的框架,让Foundation在CFNetwork之前。 - João Nunes
@JoãoNunes 感谢您的澄清。对我来说,我根本没有基础,这就是我在iOS8中看到的问题/变化。如果您已经添加了基础,则需要在CFNetwork之前进行,以便新的包含有所不同。 - plluke
我可以确认它有效,并且顺序确实很重要。将Foundation.framework拖到CFNetwork.framework的顶部即可解决问题! - Claus
显示剩余7条评论

38

我也遇到了和UIAlertAction类似的问题。

dyld: Symbol not found: _OBJC_CLASS_$_UIAlertAction Referenced from: /var/mobile/Applications/ ....app/ ... Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/ ....app/ ...

UIKit.frameWork的状态改为Optional后,问题得以解决。我猜测在你的情况下,将CFNetwork.framework的状态改为optional也会解决你的问题。

将<code>CFNetwork.framework</code>的状态改为可选


谢谢,我会尝试。但我担心在这样做时,当需要框架时可能会崩溃。而且我不会知道直到它发生,因为我使用了一些可以进行网络连接的API。这有意义吗? - Jorge
@Jorge 我找不到任何关于那个的文档。但是我的崩溃问题已经解决了,应用程序也像往常一样工作。我知道这是因为我已经测试过了。如果没有在应用程序上测试网络连接,我们永远无法确定。 - Warif Akhand Rishi
@Jorge 顺便问一下,将框架变为可选项后还会崩溃吗? - Warif Akhand Rishi

16

XCode中重新排序并不能解决问题。我正在使用Cocoapods,这会创建一个Pods.xcconfig文件。其中有一行OTHER_LDFLAGS。我将-framework Foundation作为第一个条目放置,这使得我的项目能够工作。

OTHER_LDFLAGS = -framework Foundation -ObjC …

请注意,每次执行pod update命令时,该文件都会被重新生成。


谢谢,这帮了我大忙。Cocoapods配置覆盖了Xcode。这是Cocoapods的解决方案。 - Nickolas

11

将你的框架重新排序,使Foundation在CFNetwork之前。

这是一种暂时解决方案,显然是Xcode 6中的一个bug。


@dasblinkenlight,我刚刚编辑了我的答案,现在它真正有效。谢谢。 - Felix Lapalme

6

我在WWDC时遇到了这个确切的问题。 我与几位苹果工程师交谈,他们告诉我这是SDK中一个bug,由于移动了CFNetwork和Foundation之间的某些符号而引起的,这将在下一个版本中解决,很快就会发布。 在某些情况下,您可以通过调整导入框架的顺序来解决它,但并非总是有效。


4
谢谢提供信息。顺便说一下,我在 beta 2 中仍然看到这个错误。 - Graham Perks
Beta 5中仍存在问题,只是提供信息。 - Ruben Martinez Jr.

2

我在使用Xcode 6.3开发运行iOS 8.1.3设备上的sqlite3 v3.7.13时遇到了同样的问题。

sqlite3 v3.7.15引入了C函数sqlite3_errstr()。

我的代码调用了sqlite3_errstr()。

应用程序在启动时崩溃。

将libsqlite3.dylib设置为可选项(而不是必需项)即可解决问题。


1
几次我遇到这种情况时,简单的清理(shift + cmd + K)就解决了问题。

1
在我的情况下,这发生在我使用CocoaPods更新第三方库时。

简单地清空构建文件夹有帮助。K


1

0

将CFNetwork.framework设为可选项,这对我有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接