在 iOS 6 但不是 iOS 7 上运行时出错
Posted
技术标签:
【中文标题】在 iOS 6 但不是 iOS 7 上运行时出错【英文标题】:Error when running on iOS 6 but not iOS 7 【发布时间】:2013-09-29 00:05:53 【问题描述】:我正在尝试在 ios 6 上运行我的项目,并且我已经设置了所有适当的构建设置以允许我这样做,但是当我在 iOS 6 上运行时出现此错误:
dyld: Symbol not found: _OBJC_CLASS_$_NSURLSession
Referenced from: /var/mobile/Applications/8AC09960-A403-413E-B70A-E03DB2AF5844/Flywheel.app/Flywheel
Expected in: /System/Library/Frameworks/Foundation.framework/Foundation
in /var/mobile/Applications/8AC09960-A403-413E-B70A-E03DB2AF5844/Flywheel.app/Flywheel
什么给了? iOS 7 运行良好。
【问题讨论】:
在你使用NSURLSession
的地方显示你的代码。
有点不公平的评论,我不知道它是 NSURLSession(我正在导入的一个库正在使用它)。
您的部署目标设置是什么?如果您想在 iOS 6 上运行,则需要将其设置为 6 或更少,并且需要为您的应用中的所有代码正确设置,包括您要导入的库。
【参考方案1】:
这里的问题是该符号在 iOS 6 上不可用。因此您必须通过在 Build Phases -> Link Binary With Libraries 中将其状态设置为“可选”来弱链接 Foundation Framework。
【讨论】:
这是我的问题的解决方案。 Xcode/Cocoapods 似乎突然开始给我这个错误。弱链接 Foundation.Framework 是我可以继续使用 AFNetworking 2.0.x 并支持 iOS 6.0+ 部署的唯一方法。 谢谢,问题解决了。【参考方案2】:如果您使用的是 cocoapods,请检查您的 Podfile。可能有
platform :ios, '7.0'
而不是
platform :ios, '6.0'
【讨论】:
【参考方案3】:NSURLSession
是在 iOS 7 中添加的。在您的应用程序中对它的任何不当引用都会在 iOS 6 设备上运行时导致此问题。您需要使用适当的技术来确保在 iOS 6 下永远不会引用该类。
【讨论】:
【参考方案4】:NSURLSession
仅适用于 iOS7。遗憾的是,您将不得不在 iOS 6 中使用旧的 NSURLConnection
。
【讨论】:
【参考方案5】:NSURLSession
在 iOS 7 以上可用。您可以在 NSURLSession.h
中找到定义。
NS_CLASS_AVAILABLE(10_9, 7_0)
@interface NSURLSession : NSObject
请在检查系统版本或检查该类是否可用之前使用。
if (NSClassFromString(@"NSURLSession") != nil)
// available
// your code
else
// not available
// other solutions
更新
解释:
有些朋友觉得NSClassFromString()
不推荐,我这里不用了。
我同意一半。一般不推荐NSClassFromString()
用于新建实例或操作类。但是我现在用来判断类是否可用(是nil
还是不是),我不产生带字符串的类指针。
我相信有时我们可以灵活一些。
不管怎样,如果你不喜欢使用NSClassFromString()
,我终于找到了一个更好的方法来检查类是否可用:
if ([NSURLSession class])
// available
else
// not available
【讨论】:
NSClassFromString() 不再是推荐的技术。 一般不推荐使用NSClassFromString()新建实例或操作类。但是......我现在用来判断类是否可用(是否为nil),并且我不会产生带有字符串的类指针。有时我们可以很灵活。 在这种情况下很危险,只是不应该使用该类以上是关于在 iOS 6 但不是 iOS 7 上运行时出错的主要内容,如果未能解决你的问题,请参考以下文章