【问题标题】:iOS Xcode: Warn about methods not in minimum target SDKiOS Xcode:警告方法不在最低目标 SDK 中
【发布时间】:2012-06-03 04:09:40
【问题描述】:

当我调用的方法在支持的最小目标的 SDK 中不可用时,有没有办法让 Xcode 告诉我?

例如方法[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]。此方法适用于 iOS5 及更高版本。但我的应用程序的最低目标是 iOS4。

如果我使用该方法 (sendAsync),我希望 Xcode 告诉我该方法不适用于我尝试支持的最小目标。

我尝试将 __IPHONE_OS_VERSION_MAX_ALLOWED=40000 放入预处理器设置中,但这只会触发一堆无用的 Apple SDK 错误。 (可能是因为我激活的SDK是iOS5.1)

是获取旧 SDK 并在 Xcode 中安装它们的唯一解决方案吗?

有没有更简单的解决方案?

【问题讨论】:

  • 我不确定我是否理解这个问题。即使您以旧版本为目标,您也始终使用最新的 SDK。事实上,如果您不使用最新的 SDK,Apple 不会在 App Store 中接受您的应用程序。但只要您只使用可用于目标版本的 API 子集,您就是黄金。
  • 对,但是如果有人在 iOS4 上安装应用程序,我需要确保我不使用任何 iOS5+ API。所以我正在寻找一种方法让 xcode 警告我,而不必查看每一行代码并仔细检查它是否是 iOS 4 安全的。
  • 也许this Apple techdoc也许有帮助?
  • 在我看来没有办法做到这一点。在您的部署目标之后在 SDK 中引入的任何 API 都是弱链接。但是因为基础 SDK 确实有问题的方法,你不会从 Xcode 收到任何抱怨,因为它只是方法的弱链接。这正是我的问题,我想让 Xcode “帮助”我,并就弱链接的方法给我警告,所以我可以确保在它们周围放置必要的 respondsToSelector: 检查,而我必须手动查看代码库并手动找到它们。
  • 不完全是 XCode 中的解决方案,但可能对你们中的某些人有用:使用 AppCode。它会警告您不属于您的应用支持的版本的方法(例如,在 iOS 8 + 9 应用中使用 iOS 9 方法)。

标签: ios xcode sdk


【解决方案1】:

从 Xcode 7.3 开始,编译器现在可以为您生成这些警告。您需要做的就是在构建设置中设置-Wpartial-availability 警告标志,如this answer 中所述。

【讨论】:

  • 这在 2020 年仍然有效,注意 -Wunguarded-availability 不会警告 API 使用不正确
【解决方案2】:

在做了一些研究之后,阅读了关于它的Apple Doc,并尝试了很多事情。解决方案是从 Apple 下载旧的 Xcode DMG,获取与您的部署目标相同的 SDK 的 .pkg 文件,并将其安装在您的 Xcode 版本中。方法如下:

  1. 从 Apple 下载旧版 Xcode.dmg
  2. 打开 DMG
  3. 在终端中,进入包:“cd /Volumes/[DMG]/Packages; open .”
  4. 找到所需的 SDK,例如 iPhoneSDK_4.0.pkg
  5. 安装该软件包,但将安装目录更改为 /Applications/Xcode/Contents/Developer
  6. 如果 Xcode 已打开,请重新启动它。

既然您拥有与部署目标相同的 SDK,请将您的 BaseSDK 设置为相同。构建时,您会收到有关缺少方法的警告。您的项目可能会或可能不会在新版本的 Xcode 中使用较旧的 BaseSDK 成功构建,但这并不重要 - 您刚刚找到了需要使用 respondsToSelector 进行功能检查的方法调用:。

【讨论】:

    【解决方案3】:

    不幸的是,没有标准的方法可以做到这一点。通过将目标操作系统设置为比基础 SDK 更低的数字,Xcode 将弱链接库和框架。这样做时,Xcode 不会警告您使用目标操作系统上可能不可用的方法。

    您可以暂时将基础 SDK 设置得较低,但这可能并不总是有效。由于您想忽略产生的大多数错误和警告(因为它们仅在您的代码路径中有条件地调用),并且许多警告和错误取决于您可能需要在编译器给出任何有意义的输出之前解决的其他错误。

    我认为不存在任何静态分析工具,无论是来自 Apple 还是第三方。

    【讨论】:

    • 同意,我发现了同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多