单个应用程序二进制文件如何支持64位和32位应用程序

时间:2014-01-18 05:59:21

标签: ios iphone app-store 32bit-64bit

我们可以看到苹果公告here.。根据这个文档,我们可以提交相同的二进制文件,支持32位和64位。我发现一个堆栈溢出回答here。但根据这个答案,我们should设置了deployment target as IO7+。但是苹果医生说,您可以通过IOS 7和IOS 6支持提交吗?我的问题是,如何通过部署目标IOS6 +生成支持32位和64位的二进制文件?

注意:我正在使用xcode 5.0

更新: Question above is fixed by using xcode 5.0.2。但我很困惑如何为32位以及64位编写代码。我知道一件事,我们必须在某些时候分别做两个代码。但是How can I do?。例如,如果在ios6中不推荐使用一种方法,我们也为ios 6和ios7提供代码。在同样的情况下也遵循这里或为此做一些其他技术。

6 个答案:

答案 0 :(得分:19)

  

Xcode可以构建包含32位和64位二进制文​​件的应用程序   所以它适用于运行iOS 7的所有设备。如果你想继续   为了支持iOS 6,你需要只为32位构建。下一个   一个月我们将进行更改,以便您创建单个   在iOS 6上支持32位的app二进制文件,以及32位和64位   在iOS 7上。

     

将您的应用转换为64位二进制文​​件

     

在较高级别,以下是创建同时针对两者的应用的步骤   32位和64位运行时环境:

     

1.安装Xcode 5.0.1。

     

2.打开你的项目。 Xcode会提示您使项目现代化。项目现代化增加了新的警告和错误   在为64位编译应用程序时很重要。

     

3.更新您的项目设置以支持iOS 5.1.1或更高版本。如果它早于iOS版本,则无法构建64位项目   iOS 5.1。

     

4.将项目中的体系结构构建设置更改为“标准体系结构(包括64位)”。

     

5.更新您的应用以支持64位运行时环境。新的编译器警告和错误将指导您完成此过程。   但是,编译器不会为您完成所有工作;使用   本文档中的信息可帮助指导您进行调查   你自己的代码。

     

6.在实际的64位硬件上测试您的应用。 iOS模拟器在开发过程中也很有用,但有些变化,比如功能   调用约定只有在您的应用程序运行时才可见   设备

     

7.使用Instruments调整应用程序的内存性能。

     

8.提交包含两种架构以供批准的应用程序。

     

本章的其余部分描述了经常出现的问题   将Cocoa Touch应用程序移植到64位运行时环境时。使用   这些部分将指导您自己调查代码的工作。

来自https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html#//apple_ref/doc/uid/TP40013501-CH3-SW1

答案 1 :(得分:5)

iOS应用程序依赖于Objective-C语言和系统框架建立的低级应用程序二进制接口和编码约定。从iOS 7开始,一些iOS设备使用64位处理器,并提供32位和64位运行时环境。对于大多数应用程序,64位运行时环境与32位运行时环境的区别在于两个重要方面:

在64位运行时中,Cocoa Touch框架使用的许多数据类型(以及Objective-C语言本身)的大小已经增加或者内存对齐规则更加严格。请参阅“Changes to Data Types”。 64位运行时需要在进行函数调用时使用正确的函数原型。请参阅“Changes to Function Calling。”

application binary interface (ABI)

对64位运行时的其他更改

64位ARM指令集与32位指令集明显不同。如果您的应用程序包含任何汇编语言代码,则需要重写它以使用新的指令集。您还需要更详细地描述iOS中的64位调用约定,因为这些约定与ARM标准不完全匹配。有关详细信息,请参阅iOS ABI Function Call Guide

在较高级别,要使代码保持64位清洁,您必须执行以下操作:

  1. 避免将64位长整数分配给32位整数。
  2. 避免将64位指针分配给32位整数。
  3. 在算术运算期间避免指针和长整数截断(或整数类型更改导致的其他算术问题)。
  4. 修复因数据类型大小更改而导致的对齐问题。
  5. 确保32位和64位运行时共享的内存结构共享相似的布局。
  6. 重写任何汇编语言代码,以便您的代码使用新的64位操作码和运行时。
  7. 避免将可变参数函数转换为采用固定数量参数的函数,反之亦然。

答案 2 :(得分:2)

在较高级别,以下是创建针对32位和64位运行时环境的应用程序的步骤:

安装Xcode 5.0.2(我只使用了这个,可能更高更好)

打开您的项目。 Xcode会提示您使项目现代化。现代化项目会在编译64位应用程序时添加新的警告和错误。

更新项目设置以支持iOS 5.1.1或更高版本。如果它的目标是早于iOS 5.1的iOS版本,则无法构建64位项目。

将项目中的体系结构构建设置更改为“标准体系结构(包括64位)”。

更新您的应用以支持64位运行时环境。新的编译器警告和错误将指导您完成此过程。但是,编译器不会为您完成所有工作;使用本文档中的信息来指导您调查自己的代码。

在实际的64位硬件上测试您的应用。 iOS模拟器在开发过程中也很有用,但只有当您的应用程序在设备上运行时,某些更改(例如函数调用约定)才可见。

使用Instruments调整应用的内存性能。 提交包含两种架构的应用程序以供批准。

本章的其余部分描述了将Cocoa Touch应用程序移植到64位运行时环境时经常出现的问题。使用这些部分来指导您自己调查代码的工作。

按照Apple {/ p>的guide for supporting the 32 and 64 bit架构

答案 3 :(得分:0)

编译的程序xcode 5包含两个二进制代码:32位和64位。在32位系统中将调用32位代码。在64位系统中将调用64位代码。 同时,考虑到同一个程序只有32位代码,64位系统包含两个框架:一个32位,一个64位。当运行32位程序的64位系统将调用底层支持的32位框架,运行64位程序将调用64位框架作为底层支持。更多详细信息,您可以看到Apple的官方文档“Cocoa Touch的64位转换指南”。

使用xcode 5可以很容易地将程序编译成64个。基本步骤如下。

  1. 将支持设备设置为“ios7”

  2. “构建设置”中的“架构”已更改为“标准架构(包括64位)”。

答案 4 :(得分:0)

至于问题的第一部分 - 基础SDK应该是“最新iOS SDK”,即iOS 7.0。最低部署目标应该是iOS 6.0,否则您将无法为体系结构选择“标准体系结构,包括64位(armv7,armv7s,armv8)”。选择这些设置后,您的应用程序将构建为32位和64位。

至于更新 - 切换到32 / 64bit拱门后,分析您的项目并修复可能出现的新警告。然后在真正的64位设备(iPhone 5s / iPad Air / iPad mini retina)上测试您的应用程序。如果您的应用使用iCloud,请测试32位和64位设备之间的同步。有用的信息在Apple's guide中(摘要来自@iDev答案)。

修改

实际上是,最小值为5.1.1,但您应该手动设置它或将部署目标设置为低于6.0,并选择体系结构为incl。 64位Xcode会要求您将其设置为5.1.1。无论如何,如果你想使用64位拱门,我不确定你为什么要特别支持5.1.1。

答案 5 :(得分:0)