【发布时间】:2012-09-17 16:11:55
【问题描述】:
最新的发布说明显示不支持4.2.1及更低版本,现在支持旧设备时必须使用2版本的Xcode开发??如果我们想开发 iOS6 并支持 4.2 及更低版本,这将很难支持旧设备。
我认为 Xcode 4.4 不会支持 iOS6。所以这就是问题所在。开发人员如何轻松支持这些平台而没有那么多麻烦?
【问题讨论】:
标签: ios xcode cocoa-touch
最新的发布说明显示不支持4.2.1及更低版本,现在支持旧设备时必须使用2版本的Xcode开发??如果我们想开发 iOS6 并支持 4.2 及更低版本,这将很难支持旧设备。
我认为 Xcode 4.4 不会支持 iOS6。所以这就是问题所在。开发人员如何轻松支持这些平台而没有那么多麻烦?
【问题讨论】:
标签: ios xcode cocoa-touch
你可以做到这一点,但它需要一些小的 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;
您还需要将架构设置为armv6 和armv7。您不能直接也定位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
【讨论】:
*.mm 的构建规则,也指向 LLVM GCC 4.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 个选择:
如果您愿意超越 Xcode 直接支持的内容,请参阅 Nate 的回答。
【讨论】:
lipo 将 armv6、armv7 和 armv7s 的可执行文件合并到一个捆绑包中,然后提交给 Apple。
最初的 iPhone 和 iPhone 3G 是唯一不支持 iOS 5 的设备。iPhone 3G 现在已经使用了 4 年。您可能需要考虑放弃对 iOS 4 的支持。如果您不想这样做,我认为您将不得不在两个不同版本的 Xcode 中进行开发。
【讨论】:
我认为放弃对 iOS 4.2.1 的支持不是核心问题。事实上,我试图解决这个问题并执行以下操作:
但是,安装失败。这里的原因是 - 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。对吧?
【讨论】:
尝试使用IPHONEOS_DEPLOYMENT_TARGET=4.0 手动设置项目设置。不过不知道有没有副作用。
【讨论】:
我认为定位到 4.3 是最好的选择,根据ios version statistics
【讨论】: