APP编程指南 (二) —— 应用程序必须实现的行为(一)

版本记录

版本号 时间
V1.0 2018.05.29

前言

我们在做一个APP时候需要注意哪些方面呢,接下来我们就看一下APP编程指南。里面有些可能大家在平时编程中都经历过,但是再系统的了解下也不是坏事。感兴趣的可以看上面写的几篇。
1. APP编程指南 (一) —— 基本概览(一)

Expected App Behaviors - 应用程序必须实现的行为

每个新的Xcode项目都配置为在iOS模拟器或设备上立即运行。 但仅仅能够在设备上运行并不意味着您的应用程序已准备好在App Store上发布。 每个应用程序都需要一定量的定制以确保为用户提供良好的体验。 自定义的范围可以从为应用程序提供图标,到关于应用程序如何呈现和使用信息的架构级决策。 本章描述了所有应用程序预期要处理的行为,并且应该在规划过程中尽早考虑。


Providing the Required Resources - 提供所需的资源

您创建的每个应用都必须具有以下一组资源和元数据,才能在iOS设备上正确显示:

  • An information property-list file - 一个信息属性列表文件Info.plist文件包含有关您的应用的元数据,系统用于与您的应用进行交互。 Xcode会根据您的项目配置和设置自动为您创建该文件。如果您想直接查看或修改此文件的内容,可以从项目的Info选项卡中执行此操作。有关编辑此文件的信息以及有关应包含哪些密钥的建议,请参阅The Information Property List File

  • A declaration of the app’s required capabilities - 声明应用程序的必需功能。每个应用程序都必须声明运行所需的硬件功能或功能。 App Store使用此信息来确定用户是否可以在特定设备上运行您的应用。您可以使用项目的Info选项卡中的必需设备功能条目编辑应用程序的需求列表。有关如何配置此密钥的信息,请参阅Declaring the Required Device Capabilities

  • One or more icons - 一个或多个图标。系统在用户设备的主屏幕上显示您的应用程序图标。系统也可能会在“设置”应用中或显示搜索结果时使用其他版本的图标。有关如何指定应用程序图标的信息,请参阅App Icons

  • One or more launch images - 一个或多个启动图像。当应用程序启动时,系统会显示临时图像,直到应用程序能够呈现其用户界面。此临时图片是您的应用的启动图片,它向用户提供即时反馈,即您的应用正在启动并即将准备就绪。您必须至少为您的应用提供一个启动图像,并且您可以提供其他启动图像以解决特定情况。有关创建启动图像的信息,请参阅App Launch (Default) Images

这些资源对于所有应用程序都是必需的,但不是您应该包含的唯一资源。默认情况下,Xcode在您的应用程序的Info.plist文件中不包含许多键。只有将特定功能合并到您的应用程序中时,大多数附加键才是重要的。例如,使用麦克风的应用程序应包含NSMicrophoneUsageDescription项,并向用户提供有关应用程序打算如何使用它的信息。

1. The App Bundle - App包

当你构建你的iOS应用程序时,Xcode将它打包成一个包。 一个包是文件系统中的一个目录,它将相关资源集中在一起。 iOS应用程序包包含应用程序可执行文件和支持资源文件,如应用程序图标,图像文件和本地化内容。表1-1列出了典型的iOS应用程序包的内容,用于演示目的称为MyApp。 此示例仅用于说明目的。 此表中列出的某些文件可能不会显示在您自己的应用程序包中。

Table 1-1 A typical app bundle

文件 示例 描述
App executable MyApp 可执行文件包含应用程序的编译代码。 应用程序可执行文件的名称与您的应用程序名称减去.app扩展名相同。该文件是必需的。
The information property list file Info.plist Info.plist文件包含应用程序的配置数据。 系统使用这些数据来确定如何与应用进行交互。该文件是必需的,必须取名Info.plist。 有关更多信息,请参阅The Information Property List File
App icons Icon.png、Icon@2x.png、Icon-Small.png、Icon-Small@2x.png 您的应用图标用于在设备的主屏幕上表示您的应用。 其他图标由系统在适当的地方使用。 带有@ 2x文件名的图标适用于带有Retina显示器的设备。应用程序图标是必需的。 有关指定图标图像文件的信息,请参阅App Icons
Launch images Default.png、Default-Portrait.png 、Default-Landscape.png 系统在启动应用程序时将此文件用作临时背景。 只要您的应用准备好显示其用户界面,它就会被删除。至少需要一个启动图像。 有关指定启动图像的信息,请参阅App Launch (Default) Images
Storyboard files (or nib files) MainBoard.storyboard Storyboards包含应用在屏幕上呈现的视图和视图控制器。 故事板中的视图根据呈现它们的视图控制器进行组织。 故事板还标识将用户从一组视图转移到另一组视图的转换(称为segues)。主要故事板文件的名称在创建项目时由Xcode设置。 您可以通过为Info.plist文件中的UIMainStoryboardFile键指定一个不同的值来更改名称。)使用nib文件而不是storyboard的应用程序可以用NSMainNibFile键替换UIMainStoryboardFile键,并使用该键指定它们的主要nib文件。故事板(或nib文件)的使用是可选的,但建议使用。
Ad hoc distribution icon iTunesArtwork 如果您要专门发布您的应用,请添加512 x 512像素版本的应用图标。 此图标通常由App Store根据您提交给iTunes Connect的资料提供。 但是,因为ad hoc分发的应用程序不通过App Store,您的图标必须出现在应用程序包中。 iTunes使用此图标来表示您的应用程序。 (如果您是以这种方式发布您的应用程序,则您指定的文件应该与提交给App Store的文件相同。)此图标的文件名必须为iTunesArtwork,且不得包含文件扩展名。 此文件是ad hoc分发所必需的,但在其他情况下是可选的。
Settings bundle Settings.bundle 如果您想通过设置应用公开自定义应用首选项,则必须包含设置包。 该软件包包含用于定义应用程序首选项的属性列表数据和其他资源文件。 Settings应用程序使用此包中的信息来组装应用程序所需的界面元素。该bundle是可选的。 有关首选项和指定设置包的更多信息,请参阅 Preferences and Settings Programming Guide
Nonlocalized resource files sun.png、mydata.plist 非本地化资源包括应用程序使用的图像,声音文件,电影和自定义数据文件等内容。 所有这些文件都应放置在应用程序包的顶层。
Subdirectories for localized resources en.lproj、fr.lproj、es.lproj 本地化资源必须放置在语言特定的项目目录中,其名称由ISO 639-1语言缩写和.lproj后缀组成。 (例如,en.lprojfr.lprojes.lproj目录包含用于英语,法语和西班牙语的本地化资源。)。一个iOS应用程序应该国际化,并为其支持的每种语言提供一个language.lproj目录。 除了提供应用程序自定义资源的本地化版本之外,还可以通过在特定于语言的项目目录中放置具有相同名称的文件来本地化应用程序图标,启动图像和设置图标。有关更多信息,请参阅Internationalizing Your App

注意:iOS应用程序包不能包含名为Resources的自定义目录。

有关iOS应用程序包结构的更多信息,请参阅Bundle Programming Guide。 有关如何从您的包中加载资源文件的信息,请参阅 Resource Programming Guide

2. The Information Property List File - 信息属性列表文件

Xcode使用项目的GeneralCapabilitiesInfo选项卡中的信息在编译时为您的应用程序生成信息属性列表(Info.plist)文件。 Info.plist文件是一个结构化文件,其中包含有关应用配置的重要信息。它由App Store和iOS用来确定您的应用程序的功能并定位关键资源。每个应用程序必须包含此文件。

尽管Xcode提供的Info.plist文件包含所有必需条目的默认值,但大多数应用程序都需要进行一些更改或添加。尽可能使用GeneralCapabilities选项卡指定应用程序的配置信息。这些选项卡包含可用于应用程序的最常用配置选项。如果在这些选项卡上没有看到特定选项,请使用Info选项卡。

对于Xcode不提供自定义配置界面的选项,您必须使用Xcode属性列表编辑器直接提供适当的键和值。Info选项卡的Custom iOS Target Properties部分包含要包含在Info.plist文件中的条目的摘要。默认情况下,Xcode显示预期功能的可读描述,但每个功能实际上都对应Info.plist文件中的唯一键。大多键都是可选的并且很少使用,但是在定义任何新项目时应该考虑一些键:

  • Declare your app’s required capabilities in the Info tab - 在“信息”选项卡中声明应用程序的必需功能

必需的设备功能部分包含有关应用程序运行所需的设备级功能的信息。 App Store使用此条目中的信息来确定您应用的功能,并防止它安装在不支持您的应用所需的功能的设备上。 有关更多信息,请参阅Declaring the Required Device Capabilities

  • Apps that require a persistent Wi-Fi connection must declare that fact - 需要持久Wi-Fi连接的应用程序必须声明该事实

如果您的应用程序通过网络与服务器通话,则可以将应用程序使用Wi-Fi条目添加到项目的Info选项卡中。 该条目对应于Info.plist文件中的UIRequiresPersistentWiFi项。 将此项设置为YES可防止iOS在长时间处于非活动状态时关闭活动的Wi-Fi连接。 对于使用网络与服务器通信的所有应用程序,建议使用此密钥。

  • Newsstand apps must declare themselves as such - Newsstand应用程序必须自行声明

包含UINewsstandApp键以表明您的应用程序显示来自Newsstand的内容。

  • Apps that define custom document types must declare those types - 定义自定义文档类型的应用程序必须声明这些类型

使用Info选项卡的Document Types部分指定您支持的文档格式的图标和UTI信息。 系统使用这些信息来识别能够处理特定文件类型的应用程序。 有关将文档支持添加到应用程序的更多信息,请参阅 Document-Based App Programming Guide for iOS

  • Apps can declare any custom URL schemes they support - 应用程序可以声明它们支持的任何自定义URL方案

使用Info选项卡的URL Types部分指定您的应用处理的自定义URL方案。 应用可以使用自定义URL scheme相互沟通。 有关如何实现对此功能的支持的更多信息,请参阅Using URL Schemes to Communicate with Apps

  • Apps must provide purpose strings (sometimes called “usage descriptions”) for accessing user data and certain app features - 应用必须提供用于访问用户数据和某些应用功能的用途字符串(有时称为“用法说明”)

当访问用户数据或设备功能的应用存在隐私问题时,iOS将提示用户并代表您的应用请求许可。 应用程序必须通过Info.plist文件中定义的用途字符串向用户解释为什么需要访问。 如果您的应用尝试访问而未提供相应的用途字符串,则您的应用将退出。

Table 1-2描述了需要用户许可的数据和功能。Information Property List Key ReferenceCocoa Keys章节中描述了用途字符串。

有关可包含在Info.plist文件中的键和值的详细信息,请参阅 Information Property List Key Reference

3. Declaring the Required Device Capabilities - 声明所需的设备功能

所有应用程序都必须声明它们需要运行的设备特定功能。 Xcode在项目的Info选项卡中包含必需的设备功能条目,并将其填入一些最低要求。您可以向此条目添加值以指定您的应用的附加要求。必需的设备功能条目对应于应用Info.plist文件中的UIRequiredDeviceCapabilities键。

UIRequiredDeviceCapabilities键的值是一个数组或字典,其中包含标识您的应用程序需要(或明确禁止)的功能的附加键。如果使用数组指定键的值,则键的存在表示该功能是必需的;缺少键表示该功能不是必需的,并且该应用程序可以在没有该功能的情况下运行。如果您指定了字典,则字典中的每个键都必须具有一个布尔值,该值指示该功能是必需还是禁止。值为true表示该功能是必需的,值为false表示该功能不能出现在设备上。如果给定的功能对于您的应用程序是可选的,请不要在字典中包含相应的键。

有关您可以为UIRequiredDeviceCapabilities键包含的值的详细信息,请参阅Information Property List Key Reference

4. App Icons - App图标

每个应用程序都必须提供一个图标以显示在设备的主屏幕和App Store中。 应用程序可能实际上指定了几个不同的图标以用于不同的情况。 例如,应用程序可以提供一个小图标,用于显示搜索结果,并且可以为具有Retina显示器的设备提供高分辨率图标。

新的Xcode项目包含您的应用程序图标图像的图像资产条目。 要添加图标,请将相应的图像文件分配给项目的图像资源。 在构建时,Xcode会将相应的键添加到应用程序的Info.plist文件中,并将这些图像放入应用程序包中。

有关设计应用程序图标的信息,包括这些图标的大小,请参阅iOS Human Interface Guidelines

5. App Launch (Default) Images - 应用程序启动(默认)图像

当系统首次在设备上启动应用程序时,它会在屏幕上暂时显示静态启动图像。该图像是您的应用程序的启动图像,它是您在Xcode项目中指定的资源。启动图像为用户提供即时反馈,表明您的应用已启动,同时为您的应用准备其初始用户界面。当您的应用程序的窗口已配置并准备好显示时,系统将为该窗口去除启动图像。

当您的应用的用户界面的最近快照可用时,相对应用的启动图像,系统优先使用快照。当您的应用从前台转换到后台时,系统会为您的应用的用户界面拍摄快照。当您的应用程序返回到前台时,它会尽可能使用该图像而不是启动图像。在用户杀了你的应用程序或你的应用程序长时间没有运行的情况下,系统会放弃快照并再次使用你的启动图像。

新的Xcode项目包含应用启动图像的图像资产条目。要添加启动图像,请将相应的图像文件添加到项目的图像资源中。在构建时,Xcode会将相应的键添加到应用程序的Info.plist文件中,并将这些图像放入应用程序包中。

有关设计应用的启动图像的信息,包括这些图像的大小,请参阅iOS Human Interface Guidelines


Supporting User Privacy - 支持用户隐私

设计用户隐私很重要。 大多数iOS设备包含用户可能不想公开给应用程序或外部实体的个人数据。 如果您的应用访问或使用不当数据,用户可能会通过删除您的应用进行回应。

只有在用户根据适用法律获得知情同意后才能访问用户或设备数据。 另外,请采取适当措施保护用户和设备数据,并对使用方式保持透明。 以下是您可以采取的一些最佳做法:

这些报告为保护用户隐私提供了有用的建议。您还应该与贵公司的法律顾问审核这些文件。

  • 在您的应用程序需要数据时,请求访问受iOS系统授权设置保护的敏感用户或设备数据。您必须在应用程序的Info.plist文件中提供目标字符串(有时称为用法描述字符串),说明您的应用程序需要您尝试访问的数据或资源的原因。受iOS系统授权设置保护的数据包括位置,联系人,日历事件,提醒,照片,媒体以及其他许多类型;见Table 1-2。在用户未授予访问所请求数据的情况下提供合理的回退行为。

  • 让用户了解他们的数据将如何使用。例如,将您的应用程序提交给App Store时,请将您的隐私政策或声明的URL指定为iTunes Connect元数据的一部分。您可能还想在应用说明中总结该政策或声明。有关在iTunes Connect中提供应用隐私政策的更多信息,请参阅Adding an App in iTunes Connect

  • 让用户控制他们的用户或设备数据。提供设置,以便用户可以根据需要禁止访问某些类型的敏感信息。

  • 请求并使用完成给定任务所需的最小数量的用户或设备数据。不要因为不明显的原因寻求访问或收集数据,不必要的原因,或者因为您认为它稍后可能有用。

  • 采取合理措施保护您在应用中收集的用户和设备数据。在本地存储此类信息时,请尝试使用iOS数据保护功能(如Protecting Data Using On-Disk Encryption中所述)以加密格式进行存储。通过网络发送用户或设备数据时,使用App Transport Security(如NSAppTransportSecurity中所述)。

  • 如果您的应用程序使用ASIdentifierManager类,则必须考虑其advertisingTrackingEnabled属性的值。如果该属性被用户设置为NO,则仅将ASIdentifierManager类用于Limited Advertising PurposesLimited Advertising PurposesAd Support APIs的文档中可能允许的频率上限,归因,转化事件,估计唯一用户数量,广告欺诈检测,仅用于广告目的调试以及其他广告使用。

  • 如果您尚未这样做,请停止使用由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所述。

由于用户可以随时使用设置更改授权,因此在访问任何这些项目之前请检查授权状态。 (有些功能,特别是MotionHomeKit,没有提供检查系统授权状态的专用API,详情请参见表1-2)。

表1-2受系统授权设置保护的数据和资源

Data or resources Purpose-string Info.plist keys System authorization APIs
Bluetooth peripherals NSBluetoothPeripheralUsageDescription 使用CBCentralManager类的state属性来检查使用蓝牙外围设备的系统授权状态。
Calendar data NSCalendarsUsageDescription 使用EKEventStore类的authorizationStatusForEntityType:方法来检查访问日历数据的系统授权状态。
Camera NSCameraUsageDescription 使用AVCaptureDeviceInput类的deviceInputWithDevice:error:方法来检查使用设备摄像头的系统授权状态。
Contacts NSContactsUsageDescription 使用CNContactStore类的authorizationStatusForEntityType:方法来检查用于访问联系人数据的系统授权状态。
Health sharing NSHealthShareUsageDescription 使用HKHealthStore类的authorizationStatusForType:方法来检查访问健康数据的系统授权状态。要请求授权,请使用requestAuthorizationToShareTypes:readTypes:completion:方法。
Health updating NSHealthUpdateUsageDescription 使用HKHealthStore类的authorizationStatusForType:方法来检查访问健康数据的系统授权状态。要请求授权,请使用requestAuthorizationToShareTypes:readTypes:completion:方法。
HomeKit NSHomeKitUsageDescription 当您的应用程序首次尝试访问HMHomeManager类的属性时,系统会向用户提供授权请求。
Location NSLocationAlwaysUsageDescription, NSLocationWhenInUseUsageDescription 使用CLLocationManager类的authorizationStatus方法来检查访问位置数据的系统授权状态。要请求授权,请使用requestWhenInUseAuthorizationrequestAlwaysAuthorization方法。
Microphone NSMicrophoneUsageDescription 使用AVAudioSession类的recordPermission方法来检查使用设备麦克风的系统授权状态。要请求授权,请使用requestRecordPermission:方法。
Motion NSMotionUsageDescription 检查CMMotionActivityManager类的queryActivityStartingFromDate:toDate:toQueue:withHandler:方法中的CMErrorNotAuthorized错误,以检查加速度计访问的系统授权状态。
Music and the media library NSAppleMusicUsageDescription 使用ALAssetsLibrary类的authorizationStatus方法来检查访问媒体资产的系统授权状态。
Photos NSPhotoLibraryUsageDescription 使用PHPhotoLibrary类的authorizationStatus方法来检查访问照片库的系统授权状态。
Reminders NSRemindersUsageDescription 使用EKEventStore类的authorizationStatusForEntityType:方法来检查访问提醒数据的系统授权状态。
Siri NSSiriUsageDescription 使用INPreferences类的siriAuthorizationStatus方法来检查使用Siri的系统授权状态。要请求授权您的应用程序使用SiriKit,请使用requestSiriAuthorization:方法。
Speech recognition NSSpeechRecognitionUsageDescription 使用SFSpeechRecognizer类的 authorizationStatus方法来检查使用语音识别的系统授权状态。要请求您的应用使用语音识别的授权,请使用requestAuthorization方法。
TV provider NSVideoSubscriberAccountUsageDescription 使用VSAccountManager类的checkAccessStatusWithOptions:completionHandler:方法来检查用于访问用户的视频服务订购信息的系统授权状态。要请求授权,请使用enqueueResourceAuthorizationRequest:completionHandler:方法。

将表1-2作为您的应用程序隐私行为的起点,而不是作为完全的清单,此表的内容会在iOS更新中演变。


Internationalizing Your App - 国际化您的应用程序

由于iOS应用分布在许多国家/地区,因此本地化应用的内容可以帮助您覆盖更多的客户。当用户使用本地语言进行本地化时,用户更有可能使用该应用。将面向用户的内容分解为资源文件时,将内容本地化是一个相对简单的过程。

在您可以本地化您的内容之前,您必须国际化您的应用程序以促进本地化过程。将您的应用程序国际化涉及将任何面向用户的内容分解为可本地化的资源文件并提供用于存储该内容的特定于语言的项目(.lproj)目录。这还意味着在使用特定于语言和特定于语言环境的内容时使用适当的技术(如date和number格式化)。

对于完全国际化的应用程序,本地化过程将创建新的特定于语言的资源文件集,供您添加到项目中。典型的iOS应用程序需要以下类型的资源文件的本地化版本:

  • Storyboard文件(或Nib文件) - Storyboard可以包含文本标签和其他需要本地化的内容。您可能还需要调整界面项目的位置以适应文本长度的变化。 (同样,nib文件可以包含需要本地化的文本或需要更新的布局。)

  • Strings文件 - Strings文件(因为它们的.strings文件扩展名而得名)包含应用程序显示的静态文本的本地化版本。

  • 图像文件 - 除非图像包含文化特定内容,否则应该避免对图像进行本地化。只要有可能,你应该避免直接在你的图像文件中存储文本。对于您在应用中加载和使用的图像,请将文本存储在字符串文件中,并在运行时将该文本与基于图像的内容进行合成。

  • 视频和音频文件 - 您应该避免将多媒体文件本地化,除非它们包含语言特定或文化特定的内容。例如,您需要本地化包含配音曲目的视频文件。

有关国际化和本地化过程的信息,请参阅Internationalization and Localization Guide。有关在应用程序中使用资源文件的正确方法的信息,请参阅Resource Programming Guide

后记

本篇主要介绍了应用程序必须实现的行为,感兴趣的给个赞和关注~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容