适用于iOS的应用程序编程指南(一)
关于iOS应用程序架构
应用程序需要与iOS一起工作,以确保他们提供出色的用户体验。 除了为您的应用程序的设计和用户界面设计一个很好的设计,一个伟大的用户体验包含许多其他因素。 用户期望iOS应用程序能够快速响应,同时期待应用程序尽可能少地使用电能。应用程序针对当前设备但是需要支持所有最新的iOS设备 。开始执行这些行为似乎有点困难,但是iOS能提供帮助。
该文档突出显示了使您的应用程序在iOS上正常运行的核心行为。 您可能不会实现本文档中描述的每个功能,但您应该为您创建的每个项目考虑这些功能。
注意:开发iOS应用程序需要安装了iOS SDK的基于Intel的Macintosh计算机。 有关如何获取iOS SDK的信息,请转到iOS Dev Center。
简述
当您准备好将您的想法转化为应用程序时,您需要了解系统和应用之间发生的互动。
应用程序期望支持的主要功能
该系统期望每个应用程序都具有一些特定的资源和配置数据,例如应用程序图标和有关应用程序功能的信息。 Xcode为每个新项目提供一些信息,但必须提供资源文件,并且在提交应用程序之前必须确保项目中的信息正确无误。
相关章节:预期应用行为 Expected App Behaviors
应用程序遵循良好的执行路径
从用户启动应用程序到它退出的时候,应用程序遵循一个定义良好的执行路径。在应用程序的生命周期中,它可以在前台和后台执行之间转换,它可以被终止和重新启动,并且可以暂时进入睡眠状态。每次转换到新的状态时,应用程序的期望都会改变。前台应用程序几乎可以做任何事情,但后台应用程序必须尽可能少地执行。您可以使用状态转换来相应地调整应用的行为。
相关章节:应用程序生命周期,处理应用程序状态转换的策略 The App Life Cycle,Strategies for Handling App State Transitions
应用程序必须在多任务环境中高效运行
电池寿命对于用户来说非常重要,性能,响应能力和良好的用户体验也是如此。尽量减少应用程序的电池使用量,确保用户可以全天候运行应用程序,而无需为设备充电,但启动和准备快速运行也很重要。 iOS多任务实现提供良好的电池寿命,而不会牺牲用户期望的响应性和用户体验,但运行起来需要应用程序采用系统提供的行为。
相关章节:后台执行,处理应用程序状态转换的策略 Background Execution,Strategies for Handling App State Transitions
应用程序之间的通信遵循具体的途径
为了安全起见,iOS应用程序在沙盒中运行,并且减少与其他应用程序的交互。当您想与系统中的其他应用程序进行通信时,有具体的相关方法。
相关章节:应用间通信 Inter-App Communication
性能调整对于应用程序来说非常重要
应用程序执行的每个任务都有与之相关联的电力成本。不会一次充电运行几天而很快耗尽用户电池的应用程序会产生消极的用户体验,并且更有可能被删除。所以要注意不同操作的成本,并利用系统提供的省电措施。
相关章节:性能提示 Performance Tips
如何使用本文档
本文档不适合新手。对于准备好将其应用程序发布到App Store之前的开发人员。使用此文档作为指导,以了解应用程序如何与系统进行交互,以及必须做什么才能使这些交互顺利进行。
先决条件
本文档提供有关iOS应用程序架构的详细信息,并向您展示如何实现许多应用级功能。本书假设您已经安装了iOS SDK,配置了开发环境,并了解了在Xcode中创建和实现应用程序的基础知识。
如果您是iOS应用程序开发的新手,请阅读开始开发iOS Apps(Swift)Start Developing iOS Apps (Swift)。该文档为开发过程提供了一步一步的介绍,以帮助您快速上手。它还包括一个动手教程,从开始到结束,引导您完成应用创建过程,向您展示如何创建一个简单的应用程序并快速运行。
也可以看看
如果您正在学习iOS,请阅读iOS技术概述iOS Technology Overview,您可以将其纳入iOS应用程序技术。
预期的应用行为
每个新的Xcode项目配置为立即在iOS模拟器或相应设备上运行。但只需能够在设备上运行并不意味着您的应用程序已准备好在App Store上发布。每个应用程序都需要定制化,以确保用户有良好的体验。可以为您的应用程序提供自定义的图标,用更好的想法来制定有关应用程序使用界面。本章介绍了您应该在早期规划的过程中考虑所有应用程序预期行为。
提供所需资源
您创建的每个应用都必须具有以下资源和元数据集,才能在iOS设备上正确显示:
信息属性列表文件。
Info.plist文件包含您的应用程序的元数据,系统用于与您的应用程序交互。 Xcode将根据项目的配置和设置自动创建此文件。如果要直接查看或修改此文件的内容,可以从项目的信息选项卡中进行修改。有关编辑此文件的信息以及有关应包含哪些键的建议,请参阅信息属性列表文件。The Information Property List File.
应用程序所需功能的声明。
每个应用程序必须声明运行所需的硬件功能或特性。 App Store使用此信息来确定用户是否可以在特定设备上运行您的应用。您可以使用项目的“信息”选项卡中的“必需设备”功能条目来编辑应用程序的要求列表。有关如何配置此密钥的信息,请参阅声明所需的设备功能。Declaring the Required Device Capabilities
一个或多个图标。
系统在用户设备的主屏幕上显示您的应用程序图标。系统还可以在“设置”应用程序中使用其他版本的图标,或者在显示搜索结果时使用。有关如何指定应用程序图标的信息,请参阅应用程序图标。App Icons
一个或多个启动图像。
启动应用程序后,系统会显示一个临时图片,直到应用程序能够显示其用户界面。这个临时图片是您应用程序的启动图片,它向用户提供应用程序启动的即时反馈,并很快消失。您必须为应用程序提供至少一个启动图片,您可以提供其他启动图片以解决具体情况。有关创建启动图片的信息,请参阅应用启动(默认)图片。App Launch (Default) Images
这些资源是所有应用程序所必需的,但不是您应该包含的唯一资源。默认情况下,Xcode不包含在应用的Info.plist文件中的许多键。只有将特定功能合并到应用程序中,一些附加键才显得重要。例如,使用麦克风的应用程序应包含NSMicrophoneUsageDescription键,并向用户提供有关应用程序如何使用它的信息。
应用程序包
当您构建您的iOS应用程序时,Xcode将其作为捆绑包进行打包。bundle 是文件系统中的一个目录,将相关资源组合在一起。 iOS应用程序包包含应用程序可执行文件和支持的资源文件,如应用程序图标,图像文件和本地化内容。表1-1列出了典型的iOS应用程序包的内容,为了演示的目的,该应用程序捆绑包称为MyApp。此示例仅用于说明目的。本表中列出的某些文件可能不会出现在您自己的应用程序包中。
表1-1典型的应用程序包
应用程序可执行文件 App executable
MyApp
可执行文件包含应用程序的编译代码。应用程序的可执行文件的名称与您的应用程序名称相同。减去.app扩展名。
此文件是必需的。
信息属性列表文件
Info.plist
Info.plist文件包含应用程序的配置数据。系统使用这些数据来确定如何与应用程序交互。
此文件是必需的,必须称为Info.plist。有关详细信息,请参阅信息属性列表文件。
应用程式图示
icon.png
Icon@2x.png
ICON-Small.png
Icon-Small@2x.png
您的应用图标用于在设备的主屏幕上表示您的应用。系统在适当的地方使用其他图标。文件名中带有@ 2x的图标适用于带有Retina显示器的设备。
需要应用图标。有关指定图标图像文件的信息,请参阅应用程序图标。
启动图像
Default.png
Default Portrait.png
Default Landscape.png
系统在您的应用程序启动时将此文件用作临时背景。只要您的应用程序准备好显示其用户界面,它就会被删除。
至少需要一个启动映像。有关指定启动映像的信息,请参阅应用启动(默认)图片。App Launch (Default) Images.
故事板文件(或nib文件)
MainBoard.storyboard
故事板包含应用程序在屏幕上显示的视图和视图控制器。故事板中的视图根据呈现它们的视图控制器进行组织。故事板还会识别将用户从一组视图转移到另一组视图的转换(称为段 segues )。
当您创建项目时,主要故事板文件的名称由Xcode设置。您可以通过为Info.plist文件中的UIMainStoryboardFile键分配不同的值来更改名称。)使用nib文件而不是故事板的应用程序可以使用NSMainNibFile键替换UIMainStoryboardFile键,并使用该键指定其主要nib文件。
故事板(或nib文件)的使用是可选的,但推荐使用。
临时分发图标
iTunesArtwork
如果您正在分发您的应用程序,请添加512 x 512像素版本的应用程序图标。该图标通常由App Store从您提交给iTunes Connect的资料提供。但是,由于分发的应用程序不会通过App Store,您的图标必须存在于应用程序包中。 iTunes使用此图标表示您的应用程序。 (如果您以这种方式分发您的应用程序,则您指定的文件应与App Store中提交的文件相同)。
该图标的文件名必须是iTunesArtwork,不得包含文件扩展名。此文件是临时分发所必需的,否则为其他选项。
设置包
Settings.bundle
如果要通过“设置”应用程序公开自定义应用程序首选项,则必须包含设置包。此软件包包含属性列表数据和定义应用程序首选项的其他资源文件。 “设置”应用程序使用此包中的信息来组合应用程序所需的界面元素。
此捆绑是可选的。有关首选项和指定设置包的详细信息,请参阅首选项和设置编程指南。Preferences and Settings Programming Guide.
非本地化资源文件
sun.png
mydata.plist
非本地化资源包括您的应用使用的图像,声音文件,电影和自定义数据文件。所有这些文件应该放置在应用程序包的顶层。
本地化资源的子目录
en.lproj
fr.lproj
es.lproj
必须将本地化资源放置在特定于语言的项目目录中,其名称由ISO 639-1语言缩写加上.lproj后缀组成。 (例如,en.lproj,fr.lproj和es.lproj目录包含本地化为英文,法文和西班牙文的资源。)
iOS应用应该是国际化的,并且为它支持的每种语言都有一个language.lproj目录。除了提供应用程序自定义资源的本地化版本之外,还可以通过在特定于语言的项目目录中放置具有相同名称的文件来本地化应用程序图标,启动映像和设置图标。
有关更多信息,请参阅国际化您的应用程序。Internationalizing Your App.
注意:iOS应用程序包不能包含名为“资源”的自定义目录。
有关iOS应用程序包结构的更多信息,请参阅“捆绑编程指南”Bundle Programming Guide。有关如何从包中加载资源文件的信息,请参阅资源编程指南。Resource Programming Guide
信息属性列表文件
Xcode使用您项目的“常规”General ,“功能”Capabilities 和“信息”Info 选项卡中的信息,以在编译时生成应用程序的信息属性列表(Info.plist)文件。 Info.plist文件是一个结构化文件,其中包含有关应用程序配置的重要信息。它由App Store和iOS用于确定您的应用程序的功能并查找关键资源。每个应用都必须包含此文件。
虽然Xcode提供的Info.plist文件包含所有必需条目的默认值,但大多数应用程序需要进行一些更改或添加。只要有可能就使用“常规”和“功能”选项卡来指定应用程序的配置信息。这些选项卡包含可用于应用程序的最常见的配置选项。如果在这些选项卡中没有看到特定选项,请使用“信息”选项卡。
对于Xcode不提供自定义配置界面的选项,您必须使用Xcode属性列表编辑器直接提供适当的键和值。 “信息”选项卡的“自定义iOS目标属性”部分包含要包含在Info.plist文件中的条目的摘要。默认情况下,Xcode显示预期功能的可读描述,但每个功能实际上对应于Info.plist文件中的唯一键。大多数键是可选的,很少使用,但在定义任何新项目时,您应该考虑几个键:
在“信息”选项卡中声明应用程序所需的功能。所需的设备功能部分包含有关您的应用程序运行所需的设备级功能的信息。 App Store使用此条目中的信息来确定应用程序的功能,并防止将其安装在不支持应用程序功能的设备上。有关详细信息,请参阅声明所需的设备功能。Declaring the Required Device Capabilities
需要持续Wi-Fi连接的应用程序必须事先声明。如果您的应用程序与网络上的服务器通信,则可以将应用程序使用Wi-Fi条目添加到项目的“信息”选项卡。此条目对应于Info.plist文件中的UIRequiresPersistentWiFi键。将此键设置为YES将阻止iOS在长时间不活动时关闭活动的Wi-Fi连接。对于使用网络与服务器进行通信的所有应用程序,建议使用此密钥。
报亭应用程序必须声明自己。包括UINewsstandApp密钥,以表明您的应用程序提供了报亭应用程序的内容。
定义自定义文档类型的应用程序必须声明这些类型。使用“信息”选项卡的“文档类型”部分为您支持的文档格式指定图标和UTI信息。系统使用此信息来识别能够处理特定文件类型的应用程序。有关向您的应用程序添加文档支持的更多信息,请参阅基于文档的iOS应用程序编程指南。Document-Based App Programming Guide for iOS.
应用程序可以声明他们支持的任何自定义URL方案。使用“信息”选项卡的“URL类型”部分来指定应用程序处理的自定义URL方案。应用程序可以使用自定义URL方案进行通信。有关如何实现对此功能的支持的更多信息,请参阅使用URL方案与Apps进行通信。Using URL Schemes to Communicate with Apps
应用程序必须提供用于访问用户数据和某些应用程序功能的目的字符串(有时称为“使用说明”)。当有关于访问用户数据或设备功能的应用程序存在隐私权时,iOS会提示用户并代表您的应用程序请求许可。应用程序必须通过在其Info.plist文件中定义的目的字符串向用户解释为什么需要访问。如果您的应用尝试在没有提供相应的目的字符串的情况下访问,则您的应用程序将退出。
需要用户许可的数据和功能如表1-2所示。Purpose strings are described in theCocoa Keyschapter ofInformation Property List Key Reference.
有关可以包含在Info.plist文件中的键和值的详细信息,请参阅信息属性列表键参考。Information Property List Key Reference
声明所需的设备功能
所有应用程序必须声明其运行所需设备的特定功能。 Xcode包括项目信息选项卡中的必需设备功能条目,并填写一些最低要求。您可以向此条目添加值以指定应用程序的其他要求。所需的设备功能条目对应于应用的Info.plist文件中的UIRequiredDeviceCapabilities密钥。
UIRequiredDeviceCapabilities键的值是数组或字典,其中包含标识应用程序需要的功能的其他键(或明确禁止)。如果使用数组指定键的值,则键的存在表示该功能是必需的;没有键表示该功能不是必需的,并且应用程序可以在没有它的情况下运行。如果您指定字典,字典中的每个键都必须有一个布尔值,表示该功能是必需还是被禁止。值为true表示功能是必需的,值为false表示该功能不能在设备上显示。如果给定的功能是您的应用程序可选的,请勿在字典中包含相应的键。
有关可以为UIRequiredDeviceCapabilities键包含的值的详细信息,请参阅信息属性列表键参考。Information Property List Key Reference
应用图标
每个应用程序必须提供一个图标显示在设备的主屏幕和App Store中。一个应用程序实际上可以指定几个不同的图标,以便在不同的情况下使例如,当显示搜索结果时,应用程序可以提供一个小图标,并且可以为Retina显示器的设备提供高分辨率图标。
新的Xcode项目包括应用程序图标图像的图像资源条目。要添加图标,请将相应的图像文件分配给项目的图像资源。在构建时,Xcode会将相应的密钥添加到应用的Info.plist文件中,并将图像放置在应用程序包中。
有关设计应用图标(包括这些图标的大小)的信息,请参阅iOS人机界面指南。iOS Human Interface Guidelines
应用启动(默认)图像
当系统首次在设备上启动应用程序时,它会在屏幕上临时显示静态启动映像。这个图像是您应用程序的启动映像,它是您在Xcode项目中指定的资源。启动图像为用户提供应用程序启动的即时反馈,同时让应用程序准备初始用户界面。当您的应用程序的窗口已配置并准备好显示时,系统会切换该窗口的启动图片。
当您的应用程序的用户界面的最新快照可用时,系统会更喜欢使用该映像作为应用程序的启动映像。当您的应用程序从前台转换到后台时,系统会收到应用程序用户界面的快照。当您的应用程序返回到前台时,尽可能使用该映像而不是启动映像。如果用户已经杀死了您的应用程序,或者您的应用程序未运行很长时间,则系统将放弃快照,并再次依赖于启动映像。
新的Xcode项目包括您的应用程序启动图像的图像资源条目。要添加启动图片,请将相应的图片文件添加到项目的图片资产(image assets)。在构建时,Xcode会将相应的密钥添加到应用的Info.plist文件中,并将图像放置在应用程序包中。
有关设计应用程序启动映像(包括这些映像的大小)的信息,请参阅“iOS人机界面指南”。iOS Human Interface Guidelines
支持用户隐私
设计用户隐私很重要。大多数iOS设备都包含用户可能不想暴露给应用或外部实体的个人数据。如果您的应用访问或不正确地使用数据,则用户可能会通过删除您的应用。
只有在根据适用法律获得的用户知情同意的情况下才能访问用户或设备数据。此外,采取适当步骤保护用户和设备数据,并对您如何使用它们进行透明化。以下是您可以采取的一些最佳做法:
审查政府或行业来源的指导方针,包括以下文件:
联邦贸易委员会关于移动隐私的报告:移动隐私披露:通过透明度建立信任。
欧盟数据保护委员对移动应用数据保护的意见:http://ec.europa.eu/justice/data-protection/article-29/documentation/opinion-recommendation/files/2013/wp202_en.pdf
日本内政部智能手机隐私举措:
智能手机隐私计划(2012):
英文:http://www.soumu.go.jp/main_sosiki/joho_tsusin/eng/presentation/pdf/Initiative.pdf
日语:http://www.soumu.go.jp/main_content/000171225.pdf
智能手机隐私计划II(2013):
英文:http://www.soumu.go.jp/main_sosiki/joho_tsusin/eng/presentation/pdf/Summary_II.pdf
日语:http://www.soumu.go.jp/main_content/000247654.pdf
加利福尼亚州总检察长关于移动隐私的建议:隐私权:移动生态系统的建议
这些报告为保护用户隐私提供了有用的建议。您还应该与公司的法律顾问一起审查这些文件。
在您的应用程序需要数据时,请求访问受iOS系统授权设置保护的敏感用户或设备数据。您必须在应用程序的Info.plist文件中提供用途字符串(有时称为使用说明字符串),以解释您的应用程序需要您尝试访问的数据或资源的原因。由iOS系统授权设置保护的数据包括位置,联系人,日历活动,提醒,照片,媒体和许多其他类型;参见表1-2。在用户未授权访问所请求的数据的情况下提供合理的回退行为。
与用户透明地了解他们的数据将如何使用。例如,当您将应用程序提交到App Store时,请将您的隐私政策或声明的URL指定为iTunes Connect元数据的一部分。您可能还想在您的应用说明中总结该政策或声明。
有关在iTunes Connect中提供应用隐私政策的更多信息,请参阅在iTunes Connect中添加应用程序。
给用户控制其用户或设备数据。提供设置,以便用户可以根据需要禁用对某些类型的敏感信息的访问。
请求并使用完成给定任务所需的最少量的用户或设备数据。不要因为不明显的原因寻求访问或收集数据,因为不必要的原因,或者您认为以后可能会有用。
采取合理的步骤来保护您在应用程序中收集的用户和设备数据。在本地存储此类信息时,请尝试使用iOS数据保护功能(使用“使用磁盘加密保护数据”中的描述)将其存储为加密格式。通过网络发送用户或设备数据时,使用应用传输安全性(如NSAppTransportSecurity所述)。
如果您的应用程序使用ASIdentifierManager类,则必须遵守其advertisingTrackingEnabled属性的值。如果用户将该属性设置为否,则仅对有限广告目的使用ASIdentifierManager类。 “有限广告用途”是指频次上限,归因,转换事件,估计唯一用户数量,广告欺诈检测,仅用于广告目的的调试,以及Apple可能允许的广告支持API在文档中可能允许的其他用途。
如果还没有这样做,请停止使用由UIDevice类的uniqueIdentifier属性提供的唯一设备标识符(UDID)。该属性在iOS 5.0中已被弃用,App Store不接受使用该标识符的新应用或应用更新。相反,应用程序应该根据需要使用UIDevice类的identifierForVendor属性或ASIdentifierManager类的advertisingIdentifier属性。
如果您的应用程序支持音频输入,请将音频会话配置为仅在实际计划开始录制时进行录制。如果您不打算马上录制,请勿在启动时配置您的音频会话进行录制。当应用程序配置他们的音频会话进行录制时,该系统会提醒用户,并为用户提供禁用应用程序录制的选项。
表1-2列出了iOS支持的资源和数据授权类型。对于每个项目,表格显示用途字符串密钥和用于检查授权状态的API。
重要提示:当您的应用程序尝试使用受保护的项目时,系统会提示用户提示要求访问的权限。从iOS 10开始,Info.plist文件必须包含用于显示在权限警报中的每个这样的项目的用途字符串。如果您的应用程序尝试访问受保护的项目,而您没有提供相应的目的字符串,则应用程序将退出。 (此行为同样适用于iMessage应用程序,在应用程序访问设备的相机或麦克风之前必须包含表1-2中列出的相关键。)
对于一些受保护的数据和资源,iOS框架提供专门的API来检查和请求授权,如表1-2所示。
由于用户可以随时使用“设置”来更改授权,请在访问任何这些项目之前检查授权状态。 (某些功能,特别是运动和HomeKit,不提供用于检查系统授权状态的专用API,具体请参见表1-2)
表1-2受系统授权设置保护的数据和资源
查看表1-2作为应用程序隐私行为的起点,而不是一个全面的清单。此表的内容随iOS更新而变化。
国际化您的应用程序
由于iOS应用程序分布在许多国家/地区,因此本地化应用的内容可以帮助您吸引更多客户。当用户本地化为母语时,用户更有可能使用该应用。当您将面向用户的内容视为资源文件时,本地化该内容是一个相对简单的过程。
在您可以本地化您的内容之前,您必须将您的应用程序国际化,以方便本地化过程。将您的应用程序国际化包括将任何面向用户的内容分解为可本地化的资源文件,并提供用于存储该内容的特定于语言的项目(.lproj)目录。它还意味着在使用特定于语言的区域设置内容时使用适当的技术(如日期和数字格式化程序)。
对于完全国际化的应用程序,本地化过程将创建新的特定于语言的资源文件,以供您添加到项目中。典型的iOS应用程序需要以下类型资源文件的本地化版本:
故事板文件(或nib文件) - 工作台可以包含需要本地化的文本标签和其他内容。您可能还需要调整界面项的位置以适应文本长度的更改。 (类似地,nib文件可以包含需要本地化的文本或需要更新的布局。)
字符串文件 - 字符串文件(由于它们的.strings文件扩展名而被命名)包含应用程序显示的静态文本的本地化版本。
图像文件 - 您应避免本地化图像,除非图像包含文化特定的内容。尽可能避免将文本直接存储在图像文件中。对于您在应用程序中加载和使用的图像,将文本存储在字符串文件中,并在运行时将该文本与基于图像的内容合并。
视频和音频文件 - 您应该避免本地化多媒体文件,除非它们包含语言特定或特定于文化的内容。例如,您将需要本地化包含语音跟踪轨道的视频文件。
有关国际化和本地化流程的信息,请参阅国际化和本地化指南。Internationalization and Localization Guide 有关在应用程序中使用资源文件的正确方法的信息,请参阅资源编程指南。 Resource Programming Guide