【问题标题】:Xcode 4.5 and iOS 4.2.1 incompatibilityXcode 4.5 和 iOS 4.2.1 不兼容
【发布时间】:2012-09-17 16:11:55
【问题描述】:

最新的发布说明显示不支持4.2.1及更低版本,现在支持旧设备时必须使用2版本的Xcode开发??如果我们想开发 iOS6 并支持 4.2 及更低版本,这将很难支持旧设备。

我认为 Xcode 4.4 不会支持 iOS6。所以这就是问题所在。开发人员如何轻松支持这些平台而没有那么多麻烦?

【问题讨论】:

    标签: ios xcode cocoa-touch


    【解决方案1】:

    你可以做到这一点,但它需要一些小的 Xcode 黑客攻击和一些牺牲。根据您所说的“支持 iOS 6” 的含义,这可能对您来说足够,也可能不够。如果您只是希望您的应用程序在 iOS 6 上运行,那么这应该可以。如果您还需要您的应用程序包含新的 iOS 6 功能,那么它不会。

       (对于使用多个 Xcode 版本没有问题的其他人请注意:this similar question 的答案确实允许您也使用新的 iOS 6 API 并直接针对 armv7s) p>

    See basic instructions on chpwn's blog here(但也请阅读下面的其余内容!)

    基本上,您可以使用 Xcode 4.5 为 iOS 4 及更高版本构建,但您无法利用新的仅限 iOS 6 的功能。因此,您实际上是在为 iOS 4 和 5 构建,并假设应用程序可以在 iOS 6 上正常运行(这应该是正确的,但您需要自己进行测试)。

    您需要复制 iOS 5 SDK 文件夹

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.*.sdk
    

    来自旧的 Xcode 安装(您需要暂时保留它,或者重新安装到非标准位置)。然后,您将在 Build Settings 中将 Deploy Target 设置为 iOS 4.0(或您想要的任何最低操作系统)。您可能需要在文本编辑器中打开 project.pbxproj 文件才能手动设置:

    IPHONEOS_DEPLOYMENT_TARGET = 4.0;
    

    您还需要将架构设置为armv6armv7。您不能直接定位armv7s。但是,这并不意味着您的应用程序不能在 iPhone 5 上运行。armv7 可执行文件应该可以在 iPhone 5 上运行,只是没有在 armv7s 中添加任何优化。只是兼容性在另一个方向上不起作用(例如,armv7 可执行文件不能在armv6 iPhone 3G 上运行)。

    还有一个步骤可能是必要的,在 chpwn 的博客中没有提到。您可能会收到这些警告(实际上是错误,因为 Xcode 不会正确生成您的可执行文件):

    警告:没有规则为架构 armv6 处理 sourcecode.c.objc 类型的文件“$(PROJECT_DIR)/main.m”

    为了解决这个问题,您需要为您的目标设置一个自定义构建规则,告诉 Xcode 使用 LLVM GCC 4.2 来生成 armv6 代码。为匹配*.[mc]模式的文件定义规则:

    这将是一个不同于 Xcode 默认编译器的编译器,您可能需要调整 Objective-C 代码中的一些语法。尽管许多想要这样做的人可能在 ARC 之前编写了他们的应用程序,但重要的是要注意 LLVM gcc 4.2 does not support ARC

    最后,您可能仍会看到来自 Xcode 的关于 iOS 部署目标低于 4.3 的警告,以及不支持 armv6。我发现这些都不是问题,可以忽略:

    在我的应用程序可执行文件上运行lipo -info,这会显示所需的结果:

    lipo -info MyAppName
    Architectures in the fat file: MyAppName are: armv6 armv7 
    

    【讨论】:

    • 非常感谢,你让我度过了一个美好的夜晚!我使用 chpwn 的文章在 XCode 上苦苦挣扎,但没有任何运气
    • 如果我有 *.mm 的文件,我该如何在 *.[cm] 语法中包含这些文件?谢谢
    • @indiekiduk,我并没有在我的 iOS 项目中真正使用 C++,但我想你可以添加构建规则 第二次 i>,这一次,定义 *.mm 的构建规则,也指向 LLVM GCC 4.2 编译器。
    • 请注意,您还可以将 armv7s 添加到支持的拱门:stackoverflow.com/a/12836808/536308
    • 我想强调一点是使用 LLVM GCC 4.2(而不是 Apple LLVM GCC 4.2)
    【解决方案2】:

    Xcode 4.5 使 iOS 4.3 成为最早支持的操作系统,它有效地孤立了最初的 iPhone 和 3G。

    如果您想支持早于 4.3 的 iOS 版本,则需要保留大约 4.4 版本的 Xcode。

    更清楚一点:您不能轻松(意味着 Xcode 不是开箱即用的)支持 4.3 之前的设备并在同一个应用程序中使用 iOS 6 功能。这是因为 iOS 6 功能需要 XCode 4.5,这也将 iOS 4.3 设置为最低支持操作系统。

    所以,你有 3 个选择:

    1. 继续使用 XCode 4.4。您将能够以 4.3 之前的 iOS 为目标。您将无法利用 iOS 6 的功能,但假设您在实际的 iOS 6 设备上进行了充分的测试,您的应用应该可以正常运行。
    2. 迁移到 XCode 4.5。您将无法以 4.3 之前的 iOS 为目标,但您将能够利用 iOS 6 的功能。
    3. 为您的应用制作两个版本。使用 XCode 4.4 构建一个版本(如选项 1),另一个使用 4.5(如选项 2)。从分发的角度来看,这将是 2 个独立的应用,它们每个都有自己的捆绑 ID,等等。您将在应用商店中有两个条目。

    如果您愿意超越 Xcode 直接支持的内容,请参阅 Nate 的回答。

    【讨论】:

    • +1 用于回答而不是推测他的业务需求。
    • 如何在 2 个版本的 Xcode 中开发?我知道您可以如何创建 2 个不同的二进制文件,但是如何在 App Store 中管理这两个二进制文件?这是关于这个主题的讨论:stackoverflow.com/questions/12574851/…
    • 您不能同时支持 4.3 之前的设备并在同一个应用中使用 iOS 6 功能。
    • 与 ios 5 相同,但 xcode 支持 4.2.1。我不认为你知道你在说什么,或者我们在说什么。
    • +1 作为答案,Paul,但您之前的评论(“您不能同时支持 4.3 之前的设备并在同一个应用程序中使用 iOS 6 功能”)实际上不是真的。 See the solutions to this answer。我知道在 Xcode 中 default 是这样,但有一些方法可以绕过默认限制。基本上,您按照 (3) 中的建议进行操作,然后使用 lipo 将 armv6、armv7 和 armv7s 的可执行文件合并到一个捆绑包中,然后提交给 Apple。
    【解决方案3】:

    最初的 iPhone 和 iPhone 3G 是唯一不支持 iOS 5 的设备。iPhone 3G 现在已经使用了 4 年。您可能需要考虑放弃对 iOS 4 的支持。如果您不想这样做,我认为您将不得不在两个不同版本的 Xcode 中进行开发。

    【讨论】:

    • iOS 4 设备仍然占有重要的市场份额。这尤其适用于商业应用程序,这些设备仍然有足够的能力来运行它们。我想大多数应用程序仍然希望支持它们,至少再支持一年,直到它真正淡出。
    • 大部分剩余的 iOS 4.X 用户将升级到 iPhone 5。随着 iOS 6 的推出,在 4 上浪费精力是没有意义的。在我们的下一个版本中,我们将正式放弃 4.X .
    • 很有趣,为什么没有人回答我的问题,毕竟人们尝试/说服我不支持 4.2.1,但出于商业原因,我仍然需要这样做。那么,再一次,是否有人需要支持 4.2.1 和 4.3 及更高版本,如果有,他们是如何应对的?
    • @Scott 第一代和第二代 iPod touch 也不支持 iOS 5。en.wikipedia.org/wiki/…
    【解决方案4】:

    我认为放弃对 iOS 4.2.1 的支持不是核心问题。事实上,我试图解决这个问题并执行以下操作:

    • 使用 iOS 6 SDK 构建应用,将部署目标设置为 iOS 4.2.1(可行)。
    • 打包应用程序以进行临时安装并将应用程序安装在 iOS 4.2.1 设备 (iPod touch 2G) 上。
    • 测试应用程序。

    但是,安装失败。这里的原因是 - afaik - 不是 iOS 版本。原因是架构。 XCode 4.5 不再允许您为 armv6 构建。它仅适用于 armv7。另一方面:所有具有armv7或更高版本的设备都可以运行iOS 5。唯一不支持armv7的设备是iPhone、iPhone 3G、iPod touch 1G和iPod touch 2G。

    所以对我来说,问题是:你能用 XCode 4.5 和 iOS 6 作为基础 SDK 为 armv6 构建吗?

    编辑:您不能这样做,因为 iOS 6 基础 SDK 不适用于 armv6。对吧?

    【讨论】:

      【解决方案5】:

      尝试使用IPHONEOS_DEPLOYMENT_TARGET=4.0 手动设置项目设置。不过不知道有没有副作用。

      【讨论】:

        【解决方案6】:

        我认为定位到 4.3 是最好的选择,根据ios version statistics

        【讨论】:

        • 相反,每台 iOS 4.3 设备都可以升级到 iOS 5 和/或 6。麻烦地支持 iOS 4.3 是浪费时间。以 iOS 4.2.1 为目标可以让您获得数以百万计的设备,否则您会放弃这些设备。请参阅我对上面答案的评论。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多