20、Mac OS X 软件开发准备全攻略

Mac OS X 软件开发准备全攻略

在 Mac OS X 系统上开发和部署软件,需要考虑诸多方面,从安装集成到用户界面设计,再到文件所有权和权限设置,以及与 Classic 环境的兼容性等。下面将为大家详细介绍这些关键要点。

安装与集成

在 Mac OS X 上准备软件时,首先要进行一些基础的文件设置:
1. 创建并放置 Info.plist 文件 :创建一个名为 Info.plist 的 XML 属性列表文件,在其中指定所有必要的键值对。然后将该文件直接放在 Contents 目录下。
2. 放置 PkgInfo 文件 :在相同位置,放置一个名为 PkgInfo 的文件,该文件的数据叉中应包含应用程序的类型和创建者代码。
3. 存放应用资源 :按照“如何存储应用程序资源”中的说明,将应用程序的资源放入捆绑包中。

如果你希望将 CFM 可执行文件部署为单文件应用程序,并将其资源管理器样式的资源存储在其资源叉中,若要让 Finder 正确处理该应用程序及其文档,必须将信息属性列表中的键值对指定为类型为 ‘plst’、ID 为 0 的资源。如果单文件可执行文件没有 ‘plst’ 资源,则会被视为仅能在 Classic 环境中运行的应用程序。通过 Finder 信息窗口选项,你可以强制将 CFM 应用程序启动到 Classic 环境中。

用户界面问题

在应用程序准备好部署之前,需要考虑几个用户界面问题:
1. 遵循界面指南 :确保你的应用程序符合《Inside Mac OS X: Aqua Human Interface Guidelines》中的要求。你可以从苹果开发者连接网站的 Mac OS X 技术文档部分获取该书的 PDF 版本,链接为:http://developer.apple.com/techpubs/macosx/
2. 国际化和本地化 :确保你的应用程序针对所有销售地区的语言和区域进行了适当的国际化和本地化处理。作为国际化的一部分,要保证应用程序能够在一个文档中支持多种脚本的显示。

另外,你可以使用 Property List Editor 应用程序(/Developer/Applications/PropertyListEditor)来帮助创建属性列表。如果使用其他编辑器创建属性列表,且文本包含非 ASCII 字符,请确保编辑器可以将文件保存为 UTF - 8 编码。你也可以使用现有应用程序的 Info.plist 文件作为模板。

图标设计

应用程序或文档图标必须是扩展名为 .icns 的文件数据叉中包含的 ‘icns’ 资源。苹果提供了两个应用程序来帮助你创建和管理图标:
1. Icon Composer :可以导入大多数标准位图格式(包括 TIFF、PICT、JPEG 和 GIF)的图像,并将其转换为像素尺寸为 16 x 16、32 x 32、64 x 64 和 128 x 128 的一组图标,还会为前三种尺寸创建位掩码。为了获得最佳效果,你应该为每个尺寸制作图标版本,并且导入的图像高度和宽度应相等。该应用程序会将图标数据保存为扩展名为 .icns 的文件。
2. Pixie :可以以不同的放大倍数显示屏幕的部分区域,并允许你将这些放大的图像复制到剪贴板或保存为 TIFF 文件。

/Applications/Utilities 中的 Grab 应用程序也可用于图标合成,因为它可以捕获整个屏幕或屏幕的一部分(作为 TIFF 文件)。用户可以像在 Mac OS 9 中一样为文档分配自定义图标,只需将自定义图标的副本粘贴到 Finder 信息窗口(文件 > 显示信息)中当前图标所在的位置即可。为了让用户能够这样做,你必须在 Finder 元数据(Finder 信息)中覆盖默认的文档图标。

自定义控件和系统外观

如果你创建了一个自绘制的自定义控件,必须确保它在视觉上符合用户在系统偏好设置应用程序的“通用”面板中选择的 Aqua 外观。目前,外观颜色(应用于按钮、菜单和窗口)有蓝色或石墨色两种。

为了使 Carbon 自定义控件符合系统外观,自定义控件定义必须利用 Appearance Manager API(在 Appearance.h 中声明)。对于自定义 Cocoa 控件,要与所选的 Aqua 外观兼容,应用程序套件类的自定义子类应使用 NSColor colorWithControlTint: 方法获取与当前 Aqua 色调选择对应的 NSColor 对象,然后使用该对象为自己的绘图着色。

通常情况下,应避免创建自绘制的自定义控件,因为可能会与 Aqua 存在一些不兼容性。如果确实创建了自定义控件,新行为最好不涉及绘制。

Carbon Nib 文件

Carbon 项目现在可以像 Cocoa 项目一样使用 Interface Builder 从“对象”面板创建用户界面。面板上的对象包括按钮、文本字段、滑块、菜单项、窗口和进度条等。你可以为这些对象设置属性、尺寸和控制信息。Interface Builder 会将界面保存为扩展名为 .nib 的 XML 存档,即 nib 文件。

Carbon nib 文件可以包含大多数 Carbon 应用程序中常见的用户界面对象的定义,还包含了诸如 Carbon 事件模型等功能。特殊的 Carbon API 使你的应用程序能够访问 nib 文件中定义的对象。nib 文件不仅是存储界面规范的便捷方式,还可用于本地化用户界面版本。由于 nib 文件基于 XML,因此本质上更易于导出到其他环境。

苹果建议 Carbon 开发者将以前作为资源管理器样式资源存储的许多用户界面元素转换为 Interface Builder 对象。你可以查看 /Developer/Examples/InterfaceBuilder/IBCarbonExample 中的项目示例,了解其可行性。需要注意的是,由于过程式和面向对象编程模型的差异,Carbon nib 文件缺乏 Cocoa nib 文件中定义的许多功能(例如目标 - 动作连接)。

所有权和权限

Mac OS X 从根本上说是一个 BSD 系统,BSD 实现文件系统中文件和文件夹的所有权和权限的方式是其基础的一部分。这种模型控制着谁可以读取、写入、重命名和执行文件,以及谁可以在文件夹之间复制和移动文件。虽然该模型通常与 UFS 或类似的文件系统相关,但 Mac OS X 将其扩展到所有支持的文件系统,包括 Mac OS Standard (HFS) 和 Mac OS Extended (HFS +)。

BSD 权限概述

对于文件系统中的每个文件夹和文件,BSD 有三类用户:所有者、组和其他。对于每种类型的用户,有三种特定的权限会影响对文件或文件夹的访问:读取、写入和执行。例如,如果用户在任何类别中都没有应用程序的执行权限,则无法运行该应用程序。
- 所有者 :文件夹或文件的所有者通常是创建它的用户。所有者通常对该文件或文件夹具有完全权限(读取、写入和执行),他们可以为其他类别的用户设置权限,如果是“root”用户(下面会解释),甚至可以转移所有权。
- :每个用户都属于一个或多个组。组是具有共同特征的用户的命名集合,组权限适用于该集合。例如,你可能有一个名为“projectx”的组,其中包含参与某个工程项目的所有用户。该假设组的成员被授予代码仓库中源文件的写入权限。文件夹的组所有者是该文件夹中创建的任何文件的默认组所有者。系统管理员负责设置适当的组。
- 其他 :其他类别的用户是除所有者和组用户之外的所有人,他们对文件或文件夹的权限通常是最严格的。

在 BSD 系统中,有一个特殊的“root”用户,也称为超级用户。root 用户对其所使用计算机连接的设备上的文件夹和文件具有无限访问权限,他们可以读取、写入和执行任何文件,复制、移动和重命名任何文件或文件夹,转移所有权并为任何用户重置权限。还有一个特殊的组称为 wheel 组,属于该组的用户在命令行输入 su 并提供密码后,可以成为超级用户。

在 BSD 外壳中,如果输入命令 ls -l 查看文件系统中的某个位置(例如,~steve/Documents),会得到类似以下的输出:

total 3704
drwxrwxrwx  5 steve  staff  264 Oct 24 20:56 General
drwxrwxr-x  5 steve  admin  264 Oct 21 21:47 ProjectDocs
drwxr-xr-x  6 steve  staff  160 Oct 25 12:00 Planning
drwx--x--x  6 steve  staff  160 Oct 21 15:22 Private
-rwxrwxrwx  1 steve  staff    0 Oct 23 09:55 picture clipping
[spongebob:~/Documents] steve%

此输出显示了文件或文件夹的所有者、主要组以及每个类别用户的权限。用户显示在第三列,主要组显示在第四列。第一列是一组十个编码“位”,表示文件系统实体的类型和该实体的权限。开头的 d 表示该项是文件夹(目录);如果开头是破折号,则该项是普通文件。其余九个位分为三个隐式组,分别代表所有者、组和其他。如果存在 r、w 和 x 字符,则表示对该组位所适用的用户类型,读取、写入和执行权限已打开。

例如,~steve/Documents 中 Planning 文件夹的权限为:

drwxr-xr-x  6 steve  staff  160 Oct 25 12:00 Planning

该文件夹的所有者权限为 rwx,这意味着文件夹的所有者(steve 账户持有者)可以将文件和文件夹复制到该目录,可以将其设为当前工作目录(通过 cd 命令),并可以执行其中的任何程序。staff 组的成员和其他用户的权限均为 r - x,这意味着这些用户可以读取 steve 文件夹中的文件,并可以将其设为当前工作目录,但不能向该文件夹写入文件,也不能修改或删除其中的文件。

ProjectDocs 文件夹的权限为:

drwxrwxr-x  5 steve  admin  264 Oct 21 21:47 ProjectDocs

这里,组的读取、执行和写入访问权限已打开(rwx),但只有属于 admin 组的成员才能获得此访问权限。

如果你有适当的权限,可以在终端外壳中分别使用 chown、chgrp 和 chmod 命令更改所有者、组和个人权限。有关详细信息,请参阅相关的手册页。你还可以在 Finder 信息窗口的“共享”面板中查看所选文件或文件夹的相同所有权和权限信息。如果你是文件或文件夹的所有者,也可以在此窗口中更改权限。

Mac OS X 上的文件权限

传统 BSD 权限语义与 Mac OS X 实现之间最大的区别可能是,系统安装后,Mac OS X 上的 root 用户默认是禁用的。即使用户属于 wheel 组(授予超级用户权限的传统方式),也无法通过 su 命令成为超级用户。这样做的原因很明显:安全。由于 root 用户对文件系统拥有无限权力,可能会有意或无意地造成严重破坏。如果启用远程登录或其他形式的远程访问,安全问题就更加值得关注。

不过,Mac OS X 提供了“管理员”用户来代替 root 用户。管理员几乎可以执行 root 用户能执行的所有功能,并且可以使用 Finder 来完成这些操作(即无需使用命令行)。管理员唯一不能直接做的是在系统域中添加、修改或删除文件,但他们可以使用 Installer 或 Software Update 等特殊应用程序来完成此操作。管理员不是真正意义上的用户(即没有“admin”账户的用户),任何属于 admin 组的用户都可以成为管理员。

在系统上安装 Mac OS X 并向设置助理应用程序提供信息的用户会自动成为系统的第一个管理员。此后,该用户(或任何其他管理员)可以使用多用户系统偏好设置为本地系统上的新用户创建账户。这些用户可以具有管理员权限(属于 admin 组),也可以是没有此类权限的普通用户,普通用户默认属于“staff”组。

虽然 root 用户默认是禁用的,但如果你是管理员,可以重新启用它并获得超级用户身份。但出于安全原因,只有在绝对必要的情况下才应该这样做。要重新启用 root 用户,请运行 /Applications/Utilities 中的 NetInfo Manager 应用程序,并以本地管理员身份进行身份验证。然后从“域”>“安全”菜单中选择“启用 root 用户”命令,只有当你属于本地 admin 组且之前已在本地域中进行身份验证时,此菜单项才会启用。

启用为 root 用户后,你的密码为空,建议你通过“域”>“安全”>“更改 root 密码”命令为 root 设置密码。完成需要 root 访问权限的任务后,应从同一菜单中选择“禁用 root 用户”来放弃超级用户权限。

应用程序和文档的权限

使用 Project Builder 构建应用程序时,构建子系统会自动将可执行文件的权限设置为 - rwxr - xr - x。此设置允许应用程序的所有者(即安装应用程序的人)执行和写入该应用程序,而其他所有人只能执行它。其他 IDE 也会为构建的可执行文件设置类似的权限。

  • rwxr - xr - x 设置通常就足够了,但在极少数情况下,应用程序需要特权(root)访问,例如磁盘修复程序需要通过内核进行底层硬件访问。在这种情况下,应安装设置了 setuid 的应用程序以获取 root 访问权限,然后使用 NetInfo Kit 和系统框架的功能对管理员进行身份验证。有关 setuid 的更多信息,请参阅 setuid (2) 和 chmod (1) 手册页。

虽然应用程序的权限集(特别是“x”位)决定了谁可以启动应用程序,但应用程序启动后,该进程由启动它的用户拥有。这意味着应用程序具有与登录用户相同的访问权限,具体取决于该用户的所有者和组身份。因此,如果该用户有权将文档写入某个位置,应用程序就能够在该位置保存文档。

当 Carbon、Cocoa 或 Java 应用程序保存文档时,相应的应用程序环境会自动根据用户的 umask 值设置文档的权限,默认情况下,umask 值禁止组和其他用户的写入访问。文档的常见权限设置为 - rw - r – r –,这允许所有者读取和写入文件,而其他所有人只能读取文件。如果你希望应用程序的文档具有不同的权限,必须使用允许设置权限的文件管理 API,Carbon 应用程序可使用文件管理器提供的 API,Cocoa 应用程序可使用 NSFileManager 类。

Classic 环境与你的应用程序

Classic 兼容环境(简称 Classic)使最新版本的 Mac OS 9 以及所有能够在该版本上运行的应用程序能够在 Mac OS X 系统上运行。正如你所期望的,Classic 中的 Mac OS 9 与“原生”Mac OS 9 系统有很多相似之处,但也存在一些差异,其中一些差异对应用程序开发者来说尤为重要。

本文介绍了 Classic 环境,特别是它与原生 Mac OS 9 系统的兼容性以及与 Mac OS X 其他部分的集成。它告知了 Mac OS 9 应用程序开发者在其应用程序在 Classic 环境中运行时应考虑的事项,也提醒了 Mac OS X 应用程序环境(Carbon、Cocoa 和 Java)的软件开发者,某些设计方面可能会给在 Classic 环境中运行的应用程序带来问题。

在开发和部署 Mac OS X 应用程序时,需要全面考虑上述各个方面,以确保应用程序的顺利运行和良好的用户体验。

Mac OS X 软件开发准备全攻略

Classic 环境详细剖析

为了更好地理解 Classic 环境对应用程序的影响,我们可以通过一个流程图来展示 Classic 环境与 Mac OS X 系统以及应用程序之间的交互关系。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(Mac OS X System):::process --> B(Classic Environment):::process
    B --> C(Mac OS 9 Applications):::process
    A --> D(Carbon Applications):::process
    A --> E(Cocoa Applications):::process
    A --> F(Java Applications):::process
    D --> B & A
    E --> B & A
    F --> B & A
    C --> A

从这个流程图可以看出,Mac OS X 系统是核心,Classic 环境作为一个特殊的兼容层,使得 Mac OS 9 应用程序能够在其中运行。同时,Carbon、Cocoa 和 Java 应用程序既可以与 Mac OS X 系统直接交互,也可能与 Classic 环境产生关联。

对于 Mac OS 9 应用程序开发者来说,需要注意 Classic 环境与原生 Mac OS 9 系统的差异。例如,在文件系统的权限管理上,Mac OS X 采用了 BSD 权限模型,而 Mac OS 9 有其自己的权限机制。当 Mac OS 9 应用程序在 Classic 环境中运行时,可能会遇到文件访问权限方面的问题。开发者需要确保应用程序在 Classic 环境中能够正确处理这些权限差异,避免出现文件读取或写入失败的情况。

对于 Mac OS X 应用程序环境(Carbon、Cocoa 和 Java)的开发者而言,某些设计可能会导致在 Classic 环境中出现问题。比如,在界面设计上,如果应用程序使用了 Mac OS X 特有的一些界面元素或特效,而这些元素或特效在 Classic 环境中不被支持,就可能会影响应用程序在 Classic 环境中的显示效果。因此,开发者在设计应用程序时,需要考虑到 Classic 环境的兼容性,尽量避免使用过于特殊的界面设计。

综合实践建议

在实际开发过程中,我们可以将上述各个方面的要点进行总结,形成一个开发实践的步骤列表,帮助开发者更好地进行 Mac OS X 应用程序的开发和部署。

  1. 前期准备阶段
    • 创建 Info.plist 文件并放置在 Contents 目录下,确保包含所有必要的键值对。
    • 放置 PkgInfo 文件,包含应用程序的类型和创建者代码。
    • 规划应用资源的存储方式,遵循相关说明将资源放入捆绑包。
    • 如果使用 CFM 可执行文件,处理好 ‘plst’ 资源,确保 Finder 能正确处理应用和文档。
  2. 用户界面设计阶段
    • 遵循《Inside Mac OS X: Aqua Human Interface Guidelines》进行界面设计,可从指定网站获取 PDF 版本参考。
    • 对应用程序进行全面的国际化和本地化处理,保证多语言和多脚本支持。
    • 使用合适的工具创建图标,如 Icon Composer、Pixie 和 Grab 应用程序,注意图标尺寸和格式要求。
    • 谨慎创建自定义控件,若创建则确保符合系统外观,避免与 Aqua 不兼容。
    • 对于 Carbon 项目,利用 Interface Builder 创建用户界面,使用 nib 文件存储界面规范。
  3. 权限管理阶段
    • 了解 BSD 权限模型,清楚所有者、组和其他用户的权限设置。
    • 注意 Mac OS X 上 root 用户禁用的情况,使用管理员用户进行相关操作。
    • 根据应用程序需求设置合理的权限,如使用 Project Builder 构建时的默认权限设置,特殊情况下使用 setuid 获取 root 访问权限。
    • 在保存文档时,根据需要调整文档的权限设置,使用相应的文件管理 API。
  4. 兼容性测试阶段
    • 对应用程序在 Classic 环境中进行全面测试,检查是否存在兼容性问题,如文件权限、界面显示等方面。
    • 根据测试结果进行相应的调整和优化,确保应用程序在 Mac OS X 系统和 Classic 环境中都能正常运行。
总结

开发 Mac OS X 应用程序是一个复杂的过程,涉及到多个方面的技术和细节。从安装与集成、用户界面设计、图标制作、自定义控件处理、权限管理到 Classic 环境的兼容性,每个环节都需要开发者认真对待。通过遵循相关的规范和指南,使用合适的工具和技术,以及进行充分的测试和优化,开发者可以开发出高质量、兼容性好的 Mac OS X 应用程序,为用户提供良好的使用体验。

同时,随着技术的不断发展,Mac OS X 系统也在不断更新和完善。开发者需要持续关注系统的变化,及时调整开发策略和方法,以适应新的技术要求和用户需求。希望本文提供的信息和建议能够对 Mac OS X 应用程序开发者有所帮助,让大家在开发过程中少走弯路,提高开发效率和质量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值