Xcode 4.5和iOS 4.2.1不兼容
最新版本注释表明4.2.1和更低版本将不被支持,我们现在必须使用2版本的Xcode来开发支持旧设备时? 如果我们想要开发iOS6并且支持4.2和更低版本,这将很难支持较旧的设备。
我不认为Xcode 4.4将支持iOS6。 所以这是问题。 开发人员如何轻松地支持这些平台,没有太多的麻烦?
你可以做到这一点,但它需要一些小的Xcode黑客入侵,以及一些牺牲。 根据“支持iOS 6”的意思 ,这可能会或可能不足以满足您的需求。 如果你只是想让你的应用程序在iOS 6上运行,那么这应该工作。 如果你还需要你的应用程序来结合新的iOS 6function,那么它不会。
(请注意其他使用多个版本的Xcode没有问题的人: 这个类似的问题有答案,你也可以使用新的iOS 6 APIs,直接定位到armv7s)
在这里查看chpwn博客的基本说明 (但是请阅读下面的其他内容!)
基本上,您可以使用Xcode 4.5为iOS 4或更高版本构build,但是无法利用新的仅支持iOS 6的function。 所以,你真的为iOS 4和iOS 5构build,并假设应用程序将在iOS 6上运行良好(这应该是真实的,但你需要自己testing)。
您需要复制iOS 5 SDK文件夹
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.*.sdk
从一个旧的Xcode安装(你需要简单地保留,或者重新安装到一个非标准的位置)。 然后,您将在“生成设置”中将“ 部署目标 ”设置为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.objctypes的文件'$(PROJECT_DIR)/main.m'
为了解决这个问题,你需要为你的目标设置一个定制的构build规则 ,告诉Xcode使用LLVM GCC 4.2来生成armv6代码。 定义匹配模式*.[mc]
文件的规则:
这将是一个不同于Xcode默认的编译器,您可能需要调整Objective-C代码中的一些语法。 即使很多想要这样做的人可能在ARC之前写了他们的应用程序,注意到LLVM gcc 4.2不支持ARC是很重要的。
最后,你可能仍然会看到Xcode有关iOS部署目标小于4.3的警告,而armv6
不受支持。 我发现,这些不是问题,可以忽略:
在显示所需结果之后,在我的应用程序可执行文件中运行lipo -info
:
lipo -info MyAppName Architectures in the fat file: MyAppName are: armv6 armv7
Xcode 4.5使得iOS 4.3成为最早支持的操作系统,它有效地孤立了原来的iPhone和3G。
如果您想要支持4.3以前的iOS版本,则需要保留Xcode的4.4版本。
为了更清楚一点:你不能轻易地 (这意味着Xcode不是开箱即可的)支持4.3之前的设备,并在同一个应用程序中使用iOS 6function。 这是因为iOS 6function需要XCode 4.5,它也将iOS 4.3设置为支持的最低操作系统。
所以,你有三个select:
- 继续使用XCode 4.4。 你将能够瞄准4.3之前的iOS。 您将无法利用iOS 6的function,但假设您在实际的iOS 6设备上执行了足够的testing,则应用程序应该可以正常运行。
- 迁移到XCode 4.5。 您将无法定位4.3之前的iOS版本,但是您将能够利用iOS 6function。
- 制作两个版本的应用程序。 使用XCode 4.4(如选项1)构build一个版本,另一个版本使用4.5(如选项2)。 从发行的angular度来看,这将是2个独立的应用程序,他们将有自己的捆绑ID等,你将在应用程序商店有两个条目。
如果您愿意超越Xcode直接支持的内容,请参阅Nate的答案。
原来的iPhone和iPhone 3G是唯一不支持iOS 5的设备。iPhone 3G现在已经4岁了。 你可能要考虑放弃对iOS 4的支持。如果你不想这样做,我想你将不得不开发两个不同版本的Xcode。
我认为,iOS 4.2.1的下降支持不是核心问题。 事实上,我试图解决这个问题,并执行以下操作:
- 使用iOS 6 SDK构build应用程序,将部署目标设置为iOS 4.2.1(可用)。
- 打包应用程序进行临时安装,并在iOS 4.2.1设备(iPod touch 2G)上安装应用程序。
- testing应用程序。
但是,安装失败。 这里的原因是 – afaik – 不是iOS版本。 原因是架构。 XCode 4.5不再允许你为armv6构build。 它只为armv7build造。 另一方面,所有armv7或更好的设备都可以运行iOS 5.唯一不支持armv7的设备是iPhone,iPhone 3G,iPod touch 1G和iPod touch 2G。
所以对于我来说,问题是:你可以使用XCode 4.5和iOS 6作为基础SDK来构buildarmv6吗?
编辑:你不能这样做,因为iOS 6基础SDK不适用于armv6。 对?
尝试使用IPHONEOS_DEPLOYMENT_TARGET=4.0
手动设置项目设置。 但是,我不知道是否有任何副作用。
根据ios版本的统计 ,我认为针对4.3是最好的select