Xcode 4.5和iOS 4.2.1不兼容

36

最新的发布说明指出将不再支持4.2.1及以下版本,如果要支持旧设备,我们现在必须使用两个版本的Xcode来开发??如果我们想要开发iOS6并支持4.2及以下版本,这将会是一个困难。

我认为Xcode 4.4将不支持iOS6。所以这是问题所在。开发人员如何能够轻松地支持这些平台而不需要太多麻烦呢?

6个回答

29

你可以这样做,但需要进行一些小的Xcode修改和一些牺牲。根据你对“支持iOS 6”的理解,这可能足够你使用。如果你只是想让你的应用程序在iOS 6上运行,那么这应该可以。如果你还需要你的应用程序融合新的iOS 6功能,那么就不行了。

(其他人如果没有使用多个版本的Xcode的问题,请注意:这个类似的问题有答案可以让你同时使用新的iOS 6 API并直接针对armv7s)

在chpwn的博客上查看基本说明(但也请阅读下面的内容!)

基本上,你可以使用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安装中(您需要暂时保留或重新安装到非标准位置),您将设置构建设置中的部署目标为iOS 4.0(或任何您想要的最低操作系统版本)。您可能需要在文本编辑器中打开project.pbxproj文件手动设置此项:

IPHONEOS_DEPLOYMENT_TARGET = 4.0;

你还需要将架构设置为armv6armv7。你不能直接同时针对armv7s。但是,这并不意味着你的应用程序无法在iPhone 5上运行。armv7可执行文件应该可以在iPhone 5上运行,只是没有添加在armv7s中的任何优化。只是兼容性不能往反方向发展(例如,armv7可执行文件无法在armv6 iPhone 3G上运行)。

enter image description here

除了chpwn的博客中没有提到的步骤,可能还需要一步。你可能会收到以下警告(实际上是错误,因为Xcode无法正确生成可执行文件):

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

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

enter image description here

这将是一个不同于Xcode默认的编译器,你可能需要调整一些Objective-C代码的语法。尽管许多想要这样做的人可能在ARC之前编写了他们的应用程序,但重要的是要注意LLVM gcc 4.2不支持ARC
最后,你可能仍然会看到来自Xcode的警告,指出iOS部署目标低于4.3,并且不支持armv6。我发现这些并不是问题,可以忽略。

enter image description here

在此之后,对我的应用程序可执行文件运行lipo -info命令将显示所需的结果。
lipo -info MyAppName
Architectures in the fat file: MyAppName are: armv6 armv7 

非常感谢,你让我的晚上变得美好!我一直在尝试使用chpwn的文章来解决XCode的问题,但是一直没有成功。 - Nikita Ivaniushchenko
如果我有一个文件是*.mm,我该如何在*.[cm]语法中包含它们?谢谢。 - malhal
@indiekiduk,在我的iOS项目中我并不经常使用C++,但是我想你可以只需添加一次“构建规则”的操作,然后再定义*.mm的构建规则,并指向LLVM GCC 4.2编译器。 - Nate
3
请注意,您还可以将 armv7s 添加到支持的架构中:https://dev59.com/w2cs5IYBdhLWcg3wu2Yp#12836808。 - ıɾuǝʞ
1
我想强调的重点是使用LLVM GCC 4.2(而不是Apple LLVM GCC 4.2)。 - Freeman

22

Xcode 4.5将iOS 4.3作为最早支持的操作系统,这实际上使原始iPhone和3G变得无用。

如果要支持早于4.3版本的iOS,您需要保留一个Xcode 4.4版本。

更明确地说:您不能轻松地(意味着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个单独的应用程序,它们将各自拥有自己的包标识等。您将在应用商店中有两个条目。

如果您愿意超出Xcode直接支持的范围,请参考Nate的答案。


8
对于回答而非猜测他的业务需求给予加1。 - Tom Redman
你不能在同一个应用程序中同时支持4.3以下的设备和使用iOS 6功能。 - Paul Lalonde
+1给你的回答,保罗,但是你之前的评论(“你不能在同一个应用程序中同时支持4.3以下的设备和使用iOS 6功能”)实际上并不正确。请参见此答案的解决方案。我知道这在Xcode中是默认情况,但有办法绕过默认限制。基本上,您要做您在(3)中建议的事情,然后使用lipo将armv6、armv7和armv7s的可执行文件合并到一个捆绑包中,提交给Apple。 - Nate
@Nate,我改口了。我应该说“你不能轻松地支持...”。 - Paul Lalonde
那是一个很好的说法 :) - Nate
显示剩余2条评论

2
我认为不支持iOS 4.2.1并不是核心问题。实际上,我尝试绕过这个问题并进行以下操作:
  • 使用iOS 6 SDK构建应用程序,并将部署目标设置为iOS 4.2.1(可以正常工作)。
  • 为Ad Hoc安装打包应用程序,并在iOS 4.2.1设备(iPod touch 2G)上安装应用程序。
  • 测试应用程序。
然而,安装失败。原因在于 - 据我所知 - 不是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。对吗?

2

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


5
iOS 4设备仍占有相当大的市场份额,特别是对于商业应用来说,这些设备的性能仍足以运行它们。我想大多数应用程序至少会支持它们一年,直到它真正退出市场。 - mskw
大多数仍在使用iOS 4.X的用户将升级到iPhone 5。随着iOS 6的推出,继续为4.X耗费精力已经没有意义。在我们的下一个版本中,我们正式放弃4.X。 - ahwulf
3
很有趣,为什么没有人回答我的问题?尽管有很多人试图说服我不支持4.2.1版本,但由于业务需要,我仍然需要使用这个版本。所以,是否有人还需要同时支持4.2.1和4.3及以上版本?如果是这样,他们是如何应对的呢? - mskw
@Scott 第一代和第二代iPod touch也不支持iOS 5。http://en.wikipedia.org/wiki/List_of_iOS_devices#Highest_Version_of_iOS_Supported - Basil Bourque

0
尝试手动设置项目设置,使用IPHONEOS_DEPLOYMENT_TARGET=4.0。然而,我不知道是否会有任何副作用。

0

3
相反,任何使用iOS 4.3的设备都可以升级到iOS 5和/或6。支持iOS 4.3是浪费时间的。瞄准iOS 4.2.1才能获得你本可以放弃的数百万设备。请参见我在上面回答中的评论。 - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接