Using SDK-Based Development


原文地址:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW5

使用 基于 SDK 的 开发
Mac 开发者 开发人员
搜索
SDK 兼容性 指南 》

NextPrevious
使用 基于 SDK 的 开发

描述了 基于 SDK 的 开发 技术 ,在 解释 如何 Xcode 项目 使用 :

使用 关联 方法 函数 支持 多个 版本 操作系统 运行

链接 整个 框架

有条件地 不同 Sdk 编译

查找 代码 过时 Api 服务 使用

运行 确定 操作系统 版本 框架 版本

链接 背景 链接 苹果 框架
iOS 使用 链接

如果 Xcode 项目 使用 链接 必须 运行 使用 这些 东西 之前 确保 这些 可用性 试图 使用 一个 不可用 可能会 生成 运行时 绑定 错误 动态 链接 可能 终止 相应 过程

使用 iOS 4.2 更高版本 基地 SDK Xcode 项目 使用 NSObject 方法 运行 检查 关联 可用性 简单 高效 机制 利用 NS_CLASS_AVAILABLE 可用性 用于 大多数 框架 iOS

重要事项 : 检查 iOS 发行 说明 框架 支持 NS_CLASS_AVAILABLE 列表

支持 NS_CLASS_AVAILABLE iOS 框架 conditionalize 关联 代码 下面 示例 :

if ([UIPrintInteractionController class]) {
    // Create an instance of the class and use it.
} else {
    // Alternate code path to follow when the
    // class is not available.
}

因为 如果 链接 可用 发送 条消息 发送 消息 如果 子类 链接 超类 不可用 然后 子类 显示 不可用

使用 方法 如下 所示 在这里 需要 确保 框架 支持 NS_CLASS_AVAILABLE 必须 配置 某些 项目 设置 这些 所需 设置 地方 前面 代码 安全 测试 可用性 即使 iOS 当前 版本 运行 这些 设置 如下 所示 :

Xcode 项目 基地 SDK 必须 iOS 4.2 更高版本 生成 设置 编辑器 设置 名称 SDKROOT (基地 SDK)。

部署 目标 项目 必须 iOS 3.1 更高版本 设置 名称 MACOSX_DEPLOYMENT_TARGET (OS X 部署 目标)。

编译器 项目 必须 LLVM GCC 4.2 编译器 更高版本 LLVM 编译器 (铁门) 1.5 更高版本 设置 名称 GCC_VERSION (C/c + + 编译器 版本)。

必须 确保 任何 不适 用于 项目 部署 目标 框架 链接 所需 的性能 请参阅 整个 框架 链接 链接 框架 Xcode 项目 管理 指南 》

有关 使用 Xcode 信息 构建 设置 编辑器 请参阅 Xcode 项目 管理 指南 建材 产品

OS X (和 符合 条件 刚刚 上市 一整套 iOS 项目 ), 不能 使用 方法 确定 一个 链接 可用 相反 使用 NSClassFromString 函数 类似 以下内容 代码 :

Class cls = NSClassFromString (@"NSRegularExpression");
if (cls) {
    // Create an instance of the class and use it.
} else {
    // Alternate code path to follow when the
    // class is not available.
}


使用 链接 方法 函数 符号

如果 项目 使用 链接 方法 函数 外部 符号 必须 运行 使用 这些 东西 之前 确保 它们 可用性 如果 试图 使用 一个 不可用 项目 动态 链接器 可能会 生成 运行时 绑定 错误 终止 相应 过程

假设 设置 基地 SDK iOS 4.0 Xcode 项目 允许 代码 使用 版本 操作系统 功能 ,在 版本 运行 此外 假定 希望 软件 运行 iOS 3.1 即使 不能 版本 操作系统 使用 较新 功能 允许 通过 部署 目标 设置 早期 版本 操作系统

目标 C, instancesRespondToSelector : 方法 就可以 告诉 是否 给定 方法 选择 可用 例如 若要 使用 availableCaptureModesForCameraDevice : 方法 第一次 iOS 4.0 可用 可以 使用 类似 以下 代码 :

清单 3-1 检查 目标 C 方法 有效性

if ([UIImagePickerController instancesRespondToSelector:
              @selector (availableCaptureModesForCameraDevice:)]) {
    // Method is available for use.
    // Your code can check if video capture is available and,
    // if it is, offer that option.
} else {
    // Method is not available.
    // Alternate code to use only still image capture.
}

代码 iOS 4.0 更高版本 运行 可以 调用 availableCaptureModesForCameraDevice : 确定 如果 视频 捕获 设备 可用 iOS 3.1 运行 但是 必须 承担 捕获 图像 仍然 可用

如果 具有 各种 设置 生成 代码 看到 以下 结果 :

如果 指定 iphoneos3.1 基地 SDK 设置 :

生成 失败 因为 availableCaptureModesForCameraDevice : 系统 版本 定义 方法

如果 指定 iphoneos4.0 基地 SDK 设置 然后 部署 目标 设置 :

iphoneos4.0 : 软件 iOS 4.0 更高版本 运行 启动 较早 系统

iphoneos3.1 : 软件 运行 iOS 4.0 iOS 3.1 无法 早期 系统 启动 运行 iOS 3.1 软件 使用 备用 代码 捕获 图像

检查 目的 C 属性 可用性 通过 传递 instancesRespondToSelector getter 方法 名称 (这 属性 名称 相同 ) :。

若要 确定 链接 C 函数 是否 可用 使用 链接器 不可用 函数 地址 设置 NULL 事实 检查 函数的 地址 — — 因此 可用性 — — 通过 比较 NULL 地址 例如 一个 项目 部署 目标 OS X v10.5 使用 CGColorCreateGenericCMYK 函数 之前 , 使用 类似 如下 代码 :

清单 3-2 C 函数 可用性 检查

if (CGColorCreateGenericCMYK != NULL) {
    CGColorCreateGenericCMYK (0.1,0.5.0.0,1.0,0.1);
} else {
    // Function is not available.
    // Alternate code to create a color object with earlier technology
}

注意 : 为了 床位 一个 函数 显式 比较 地址 NULL 不能 使用 否定 运算符 (!) 否定 函数 地址 检查 可用性 另外 请注意 C 函数 名称 地址 代名词 & myFunction 等于 myFunction

检查 外部 (extern) 常量 通知 名称 可用性 通过 显式地 地址 — — 而 符号的 光秃 名称 — — 为 NULL
链接 整个 框架

如果 使用 最近 添加 框架 — — 一个 部署 目标 成为 可用 — — 你 必须 显式 薄弱 环节 框架 本身 比如说 链接 加速 框架 第一次 iOS 4.0 使用 功能 他们 可用 系统 可用 此外 设置 部署 目标 iOS 3.1.3 允许 那个 版本 iOS 用户 使用 应用程序 不用 特点 示例 必须 加速 框架 薄弱 环节

使用 部署 目标 框架 应该 要求 框架 (和 链接 它)。

如何 链接 一个 框架 信息 请参阅 链接 框架 Xcode 项目 管理 指南 》
有条件地 编译 不同 Sdk

如果 使用 源代码 生成 基地 sdk 可能 需要 基地 SDK 使用 conditionalize 这样 通过 预处理器 指令 使用 Availability.h 定义

: Availability.h 标头 针对 iOS 针对 OS X v10.6 更高版本 OS X v10.2 介绍 AvailabilityMacros.h 这些 文件 驻留 /usr/include 目录


假设 编译 代码 清单 3-2 使用 基地 SDK 设置 macosx10.4 所示 的是 CGColorCreateGenericCMYK 函数 代码 部分 — — 介绍 OS X v10.5 — — 必须 生成 期间 蒙面 因为 任何 不可用 CGColorCreateGenericCMYK 函数 引用 导致 编译器 错误

若要 允许 代码 生成 使用 __MAC_OS_X_VERSION_MAX_ALLOWED :

确保 项目的 目标 OS X iOS

基地 SDK 不可 用的 隐藏 代码

下面 代码 摘录 演示 操作 请注意 数值 1050年 而不是 符号 __MAC_10_5 #if 比较 子句 使用 : 如果 包含 符号 定义 系统 加载 代码 比较 仍然 工作

清单 3-3 使用 条件 编译 预处理器 指令

#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED
    // code only compiled when targeting OS X and not iOS
    // note use of 1050 instead of __MAC_10_5
#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050
    if (CGColorCreateGenericCMYK != NULL) {
        CGColorCreateGenericCMYK(0.1,0.5.0.0,1.0,0.1);
    } else {
#endif
    // code to create a color object with earlier technology
#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050
    }
#endif
#endif
}

除了 使用 预处理器 前面 代码 假定 代码 可能 编译 使用 较新 基地 SDK 运行 OS X v10.4 计算机 部署 更早版本 具体来说 检查 链接 CGColorCreateGenericCMYK 符号 之前 试图 调用 存在 可以防止 代码 生成 运行时 错误 如果 建立 针对 较新 SDK 代码 部署 较旧 系统 可能 会出现 关于 建立 运行时 检查 确定 存在 符号 详细 信息 请参阅 使用 链接 iOS 使用 链接 方法 函数
过时 API 使用 实例

随着 iOS OS X Api 它们 包含 技术 有时 更改 满足 开发人员 需要 作为 演变 一部分 效率 较低 接口 支持 较新 否决 可用性 附加 文件 声明 帮助 找到 弃用 接口 参考 文档 标志 过时 接口

注意 : 弃用 意味着 立即 删除 框架 接口 方式 标记 接口 存在 更好 选择 可以 代码 使用 过时 Api 然而 苹果 建议 将迁移 较新 接口 尽快 因为 不建议使用 Api 可能 删除 未来 版本 操作系统 检查 文件 任何 建议 更换 接口 信息 过时 API 文档

如果 编译 OS X v10.5 部署 目标 项目 使用 接口 标记 已弃用 编译器 发出 相应 警告 警告 包含 过时 接口 代码 使用 名称 例如 如果 HPurge 函数 弃用 那么 得到 错误 类似 以下内容 :

'HPurge' 弃用 ( /Users/steve/MyProject/main.c:51 声明 )

代码 查找 过时 API 使用 实例 寻找 类型 警告 如果 项目 具有 很多 警告 使用 Xcode 搜索 字段 筛选 基于 "弃用" 关键字 警告 列表
确定 版本 操作系统 框架

罕见 情况下 符号 运行 时间 可用性 检查 一个 完整 解决方案 例如 如果 方法 行为 一个 OS 版本 更改 另一个 先前 可用 方法 修复 bug 必须 编写 代码 考虑 这些 变化

技术 用于 检查 操作系统 版本 取决 目标 平台 如下 所示 :

若要 运行 检查 iOS 版本 使用 这样 代码 :。

NSString * osVersion = [[UIDevice currentDevice] systemVersion];

若要 运行 检查 版本 OS X 使用 格式塔 功能 系统 版本 选择器 常量

另外 对于 很多 框架 可以 运行 检查 一个 具体 框架 版本 做到 这一点 使用 全球 框架版本 常数 — — 如果 他们 提供 框架 例如 应用程序 套件 ( NSApplication.h) 声明 NSAppKitVersionNumber 常量 可以使用检测不同版本应用程序套件框架:

APPKIT_EXTERN NSAppKitVersionNumber;

#define NSAppKitVersionNumber10_0 577

#define NSAppKitVersionNumber10_1 620

#define NSAppKitVersionNumber10_2 663

#define NSAppKitVersionNumber10_2_3 663.6

#define NSAppKitVersionNumber10_3 743

#define NSAppKitVersionNumber10_3_2 743.14

#define NSAppKitVersionNumber10_3_3 743.2

#define NSAppKitVersionNumber10_3_5 743.24

#define NSAppKitVersionNumber10_3_7 743.33

#define NSAppKitVersionNumber10_3_9 743.36

#define NSAppKitVersionNumber10_4 824

#define NSAppKitVersionNumber10_4_1 824.1

#define NSAppKitVersionNumber10_4_3 824.23

#define NSAppKitVersionNumber10_4_4 824.33

#define NSAppKitVersionNumber10_4_7 824.41

#define NSAppKitVersionNumber10_5 949

#define NSAppKitVersionNumber10_5_2 949.27

#define NSAppKitVersionNumber10_5_3 949.33

可以 比较 常数的 确定 哪个 版本 应用程序 套件 针对 运行 代码 一个 典型 方法 地板 全局 常量 检查 结果 反对 NSApplication.h 声明 常数 例如 :

if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_0) {
  /* On a 10.0.x or earlier system */
} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_1) {
  /* On a 10.1 - 10.1.x system */
} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_2) {
  /* On a 10.2 - 10.2.x system */
} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_3) {
  /* On 10.3 - 10.3.x system */
} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_4) {
  /* On a 10.4 - 10.4.x system */
} else if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_5) {
  /* On a 10.5 - 10.5.x system */
} else {
  /* 10.6 or later system */
}

同样 Foundation ( NSObjCRuntime.h) 声明 每个 版本 NSFoundationVersionNumber 全球 不断 特定

某些 个别 标头 其他 对象 组件 声明 版本号 NSAppKitVersionNumber 一些 bug 修复 功能 一个 给定 更新 可用



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值