支持用户隐私
为用户的隐私进行设计是很重要的。大多数iOS设备包含了用户不想泄露的隐私数据。如果你的应用访问或者不正确的使用这些数据,用户有可能删除你的应用。
只有根据适用的法律获得了用户知情同意的情况下,才能访问用户或者设备的数据。此外,采取适当的步骤保护用户和设备的数据,并对清晰说明你如何使用它们。这里有一些你可以采用的最佳实践:
- 审查政府或者行业来源的指南,包括以下文档:(这部分就不翻译了)
- 这些报告为保护用户隐私提供了有用的建议。你应该和公司里的法律顾问一起审查这些文档。
- 在你的应用需要用户或者设备的敏感数据(这些数据被iOS系统授权设置保护)时,你要进行请求访问它们。你必须在应用的Info.plis文件中提供目的字符串来解释应用为什么需要这些你正尝试访问的数据或资源。通过iOS授权设置保护的数据包括为止、通讯录、日历事件、提醒、照片、媒体、以及很多其他类型等等;详见表1-2。在用户未授权访问所请求的数据时,提供合理的的回退行为。
- 用户明确的了解他们的数据将被如何使用。例如,当你要提交应用到App Store时,将你的隐私策略或说明的URL指定为iTunes Connect元数据的一部分。你也许还想在应用描述中总结这个策略或说明。更多关于在iTunes Connect中提供应用隐私策略的信息,参见 iTunes Connec中的Adding an App。
- 让用户控制他们的用户或设备数据。提供设置,这样用户就可以根据需要禁用某些敏感类型信息的访问。
- 请求最少量的用户或设备数据来完成给定任务。不要在没有明确原因、或者因为你觉得可能会有用的情况下访问或者搜集数据。
- 采用合理的步骤来保护你从应用中搜集到的用户或者设备的数据。当本地存储这些信息时,尝试使用iOS数据保护功能(在Protecting Data Using On-Disk Encryption中描述)将其存储为加密格式。当通过网络发送用户或设备数据时,使用应用安全传输(App Transport Security, 在NSAppTransportSecurity中描述)。
- 如果你的应用使用ASIdentifierManager类,你必须关注它的advertisingTrackingEnabled属性值。如果这个属性被用户设置为NO时,只能为有限广告用途(Limited Advertising Purposes)使用ASIdentifierManager类。在广告支持API文档中,“有限广告用途”是指频率上限、归因、转换事件、估算单一用户数量、广告欺诈检测、仅用于广告的调试、以及其他苹果认可的使用广告的方式。
- 如果你还没有这样所,那就停止使用由UIDevice 类的uniqueIdentifier属性提供的唯一设备标识符(unique device identifier, UUID)。这个属性在iOS 5.0的时候被弃用,App Store不再接受使用这个标识的新应用或者应用的更新。取而代之,应用应该使用UIDevice类的identifierForVendor属性,或者是ASIdentifierManager类的advertisingIdentifier属性。
- 如果应用支持音频输入,配置你的音频会话,仅在实际开始录制的时候进行录制。如果你不打算立刻录音,就不要在启动的时候配置音频会话进行录音。当应用为录音配置音频会话的时候,系统会给用户一个警告,并给用户一个禁用录音的选项。
表1-2罗列了iOS授权支持的资源和数据的类型。对于每个项,这表显示了目标字符串的键和用来检查授权状态的API。
重要:当你的应用试图使用一个被保护的项(item)时,系统会使用一个警告来提示用户,这个警告会询问是否允许访问。从iOS 10开始, Info.plist文件必须为每个这样的项包含目的字符串,显示在授权警告中。如果应用试图访问一个没有提供合适目的字符串的项时,应用退出。(此行为同样适用于iMessage 应用,它必须在访问设备的相机和麦克风之前包含表1-2罗列的相关键。)
对于受保护的数据和资源,iOS框架提供专门的API来检查并请求授权,如表1-2所描述的。
因为用户可以使用Setting(设置)应用来随时改变授权,所以要在访问这些项之前,检查授权状态。(一些功能,尤其是motion和HomeKit,没有提供专门的API来检查系统授权状态。详细内容参见表1-2。)
表1-2 通过系统授权设置保护数据和资源
数据或资源 | 目标字符串,Info.plist键 | 系统授权API |
---|---|---|
蓝牙外设 | NSBluetoothPeripheralUsageDescription | 使用这个CBCentralManager类的state属性来为蓝牙外设检查系统的授权状态。 |
日历数据 | NSCalendarsUsageDescription | 使用EKEventStore类的authorizationStatusForEntityType:方法来检查访问日历数据的系统授权状态。 |
相机 | NSCameraUsageDescription | 使用AVCaptureDeviceInput类的deviceInputWithDevice:error:方法来检查使用设备相机的系统授权状态。 |
通讯录 | NSContactsUsageDescription | 使用CNContactStore类的authorizationStatusForEntityType:方法来检查访问通讯录数据的系统授权状态。 |
健康分享 | NSHealthShareUsageDescription | 使用HKHealthStore类的authorizationStatusForType:方法来检查访问健康数据的系统授权状态。 使用requestAuthorizationToShareTypes:readTypes:completion:来请求许可。 |
健康更新 | NSHealthUpdateUsageDescription | 使用HKHealthStore 类的authorizationStatusForType:方法来检查访问健康数据的系统授权状态。 使用requestAuthorizationToShareTypes:readTypes:completion:方法来请求授权。 |
HomeKit | NSHomeKitUsageDescription | 当你的应用第一次试图访问HMHomeManager类的属性时,系统为用户呈现授权请求。 |
位置 | NSLocationAlwaysUsageDescription, NSLocationWhenInUseUsageDescription | 使用CLLocationManager类的authorizationStatus 方法来检查访问位置数据的系统授权状态。 使用requestWhenInUseAuthorization或requestAlwaysAuthorization方法来请求授权。 |
麦克风 | NSMicrophoneUsageDescription | 使用AVAudioSession 类的recordPermission方法来检查使用设备麦克风的系统授权状态。 使用requestRecordPermission:方法请求授权。 |
运动 | NSMotionUsageDescription | 检查来自CMMotionActivityManager类的queryActivityStartingFromDate:toDate:toQueue:withHandler:方法的CMErrorNotAuthorized错误,用来检查访问加速计的系统授权状态。 |
音乐和媒体库 | NSAppleMusicUsageDescription | 使用ALAssetsLibrary 类的authorizationStatus 方法来检查访问媒体资源的系统授权状态。 |
照片 | NSPhotoLibraryUsageDescription | 使用PHPhotoLibrary 类的authorizationStatus 方法来检查访问照片库的系统授权状态。 |
提醒 | NSRemindersUsageDescription | 使用EKEventStore 类的authorizationStatusForEntityType: 方法来检查访问提醒数据的系统授权状态。 |
Siri | NSSiriUsageDescription | 使用INPreferences 类的siriAuthorizationStatus 方法来检查使用Siri的系统授权状态。 使用requestSiriAuthorization:方法来为应用请求使用SiriKit的授权。 |
语音识别 | NSSpeechRecognitionUsageDescription | 使用SFSpeechRecognizer 类的 authorizationStatus方法来检查使用语音识别的系统授权状态。 使用requestAuthorization方法,来为应用使用语音识别请求授权。 |
TV提供商 | NSVideoSubscriberAccountUsageDescription | 使用 VSAccountManager 类的 checkAccessStatusWithOptions:completionHandler:方法来检查访问用户视频服务订购信息的系统授权状态。 使用enqueueResourceAuthorizationRequest:completionHandler:方法请求授权。 |
查看表1-2是了解应用隐私行为的起点,而不是一个全面的清单。这个表会随着iOS的升级而变化。
国际化你的应用
因为iOS应用会在很多国家发布,本地化你的应用内容能够帮助你得到更多的客户。和用户更喜欢使用用他们国家的语言进行了本地化的应用。当你的将用户界面内容视为资源文件的时候,本地化这些内容是相对简单的过程。
在你能够本地化你的内容之前,你必须使你的应用国际化,以便本地化的过程。国际化应用需要将任何用户界面内容分解为本地化资源文件,并提供用于存储的特定语言项目(.lproj)目录。它也意味着当使用特定语言和特定本地化内容的时候要使用合适的技术。
对于完全国际化应用,本地化过程创建新的一组特定语言资源文件,用来添加到你的项目中。一个典型的iOS应用需要有以下类型的资源文件的本地化版本:
- Storyboard文件(或nib文件)——Storyboard能包含text label和其他需要本地化的内容。你或许还需要调整界面位置以适应文本长度的改变。(类似的,nib文件可以包含需要本地化的文本或者需要更新的布局)。
- 字符串文件——字符串文件(由于它们的.strings扩展名而得名)包含应用显示的静态文本的本地化版本。
- 图片文件——你应该避免本地化图片除非图片包含特定文化内容。你应该尽可能的避免在image文件中直接存储文本。对于你在应用中加载和使用的图片,将文本存储在字符串文件中,并在运行时将该文本于基于图片的内容合并。
- 视频和音频文件——你应该避免本地化多媒体文件除非它们包含特定语言或者特定文化的内容。例如,你会想本地化包含跟踪音轨的视频文件。
关于国际化和本地化过程的信息,参见Internationalization and Localization Guide。关于在应用中使用资源文件的正确方式的信息,参见Resource Programming Guide。