在 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 上运行时出错的主要内容,如果未能解决你的问题,请参考以下文章

iOS 6 应用程序在 iOS 7 风格上运行

在iOS 7.0 上运行的应用程序具有iOS 6.0 界面

iOS 7 模拟器显示屏幕但不显示手机

XCode 6项目在ios 7.1上segue后崩溃

在设备上运行 beta iOS 应用程序时出错

在 iOS 7 下运行我的 iOS 6 应用程序时,为啥我的视图上没有正确显示阴影?