支持用戶隱私
為用戶的隱私進(jìn)行設(shè)計(jì)是很重要的。大多數(shù)iOS設(shè)備包含了用戶不想泄露的隱私數(shù)據(jù)。如果你的應(yīng)用訪問(wèn)或者不正確的使用這些數(shù)據(jù),用戶有可能刪除你的應(yīng)用。
只有根據(jù)適用的法律獲得了用戶知情同意的情況下,才能訪問(wèn)用戶或者設(shè)備的數(shù)據(jù)。此外,采取適當(dāng)?shù)牟襟E保護(hù)用戶和設(shè)備的數(shù)據(jù),并對(duì)清晰說(shuō)明你如何使用它們。這里有一些你可以采用的最佳實(shí)踐:
- 審查政府或者行業(yè)來(lái)源的指南,包括以下文檔:(這部分就不翻譯了)
- 這些報(bào)告為保護(hù)用戶隱私提供了有用的建議。你應(yīng)該和公司里的法律顧問(wèn)一起審查這些文檔。
- 在你的應(yīng)用需要用戶或者設(shè)備的敏感數(shù)據(jù)(這些數(shù)據(jù)被iOS系統(tǒng)授權(quán)設(shè)置保護(hù))時(shí),你要進(jìn)行請(qǐng)求訪問(wèn)它們。你必須在應(yīng)用的Info.plis文件中提供目的字符串來(lái)解釋?xiě)?yīng)用為什么需要這些你正嘗試訪問(wèn)的數(shù)據(jù)或資源。通過(guò)iOS授權(quán)設(shè)置保護(hù)的數(shù)據(jù)包括為止、通訊錄、日歷事件、提醒、照片、媒體、以及很多其他類型等等;詳見(jiàn)表1-2。在用戶未授權(quán)訪問(wèn)所請(qǐng)求的數(shù)據(jù)時(shí),提供合理的的回退行為。
- 用戶明確的了解他們的數(shù)據(jù)將被如何使用。例如,當(dāng)你要提交應(yīng)用到App Store時(shí),將你的隱私策略或說(shuō)明的URL指定為iTunes Connect元數(shù)據(jù)的一部分。你也許還想在應(yīng)用描述中總結(jié)這個(gè)策略或說(shuō)明。更多關(guān)于在iTunes Connect中提供應(yīng)用隱私策略的信息,參見(jiàn) iTunes Connec中的Adding an App。
- 讓用戶控制他們的用戶或設(shè)備數(shù)據(jù)。提供設(shè)置,這樣用戶就可以根據(jù)需要禁用某些敏感類型信息的訪問(wèn)。
- 請(qǐng)求最少量的用戶或設(shè)備數(shù)據(jù)來(lái)完成給定任務(wù)。不要在沒(méi)有明確原因、或者因?yàn)槟阌X(jué)得可能會(huì)有用的情況下訪問(wèn)或者搜集數(shù)據(jù)。
- 采用合理的步驟來(lái)保護(hù)你從應(yīng)用中搜集到的用戶或者設(shè)備的數(shù)據(jù)。當(dāng)本地存儲(chǔ)這些信息時(shí),嘗試使用iOS數(shù)據(jù)保護(hù)功能(在Protecting Data Using On-Disk Encryption中描述)將其存儲(chǔ)為加密格式。當(dāng)通過(guò)網(wǎng)絡(luò)發(fā)送用戶或設(shè)備數(shù)據(jù)時(shí),使用應(yīng)用安全傳輸(App Transport Security, 在NSAppTransportSecurity中描述)。
- 如果你的應(yīng)用使用ASIdentifierManager類,你必須關(guān)注它的advertisingTrackingEnabled屬性值。如果這個(gè)屬性被用戶設(shè)置為NO時(shí),只能為有限廣告用途(Limited Advertising Purposes)使用ASIdentifierManager類。在廣告支持API文檔中,“有限廣告用途”是指頻率上限、歸因、轉(zhuǎn)換事件、估算單一用戶數(shù)量、廣告欺詐檢測(cè)、僅用于廣告的調(diào)試、以及其他蘋(píng)果認(rèn)可的使用廣告的方式。
- 如果你還沒(méi)有這樣所,那就停止使用由UIDevice 類的uniqueIdentifier屬性提供的唯一設(shè)備標(biāo)識(shí)符(unique device identifier, UUID)。這個(gè)屬性在iOS 5.0的時(shí)候被棄用,App Store不再接受使用這個(gè)標(biāo)識(shí)的新應(yīng)用或者應(yīng)用的更新。取而代之,應(yīng)用應(yīng)該使用UIDevice類的identifierForVendor屬性,或者是ASIdentifierManager類的advertisingIdentifier屬性。
- 如果應(yīng)用支持音頻輸入,配置你的音頻會(huì)話,僅在實(shí)際開(kāi)始錄制的時(shí)候進(jìn)行錄制。如果你不打算立刻錄音,就不要在啟動(dòng)的時(shí)候配置音頻會(huì)話進(jìn)行錄音。當(dāng)應(yīng)用為錄音配置音頻會(huì)話的時(shí)候,系統(tǒng)會(huì)給用戶一個(gè)警告,并給用戶一個(gè)禁用錄音的選項(xiàng)。
表1-2羅列了iOS授權(quán)支持的資源和數(shù)據(jù)的類型。對(duì)于每個(gè)項(xiàng),這表顯示了目標(biāo)字符串的鍵和用來(lái)檢查授權(quán)狀態(tài)的API。
重要:當(dāng)你的應(yīng)用試圖使用一個(gè)被保護(hù)的項(xiàng)(item)時(shí),系統(tǒng)會(huì)使用一個(gè)警告來(lái)提示用戶,這個(gè)警告會(huì)詢問(wèn)是否允許訪問(wèn)。從iOS 10開(kāi)始, Info.plist文件必須為每個(gè)這樣的項(xiàng)包含目的字符串,顯示在授權(quán)警告中。如果應(yīng)用試圖訪問(wèn)一個(gè)沒(méi)有提供合適目的字符串的項(xiàng)時(shí),應(yīng)用退出。(此行為同樣適用于iMessage 應(yīng)用,它必須在訪問(wèn)設(shè)備的相機(jī)和麥克風(fēng)之前包含表1-2羅列的相關(guān)鍵。)
對(duì)于受保護(hù)的數(shù)據(jù)和資源,iOS框架提供專門的API來(lái)檢查并請(qǐng)求授權(quán),如表1-2所描述的。
因?yàn)橛脩艨梢允褂肧etting(設(shè)置)應(yīng)用來(lái)隨時(shí)改變授權(quán),所以要在訪問(wèn)這些項(xiàng)之前,檢查授權(quán)狀態(tài)。(一些功能,尤其是motion和HomeKit,沒(méi)有提供專門的API來(lái)檢查系統(tǒng)授權(quán)狀態(tài)。詳細(xì)內(nèi)容參見(jiàn)表1-2。)
表1-2 通過(guò)系統(tǒng)授權(quán)設(shè)置保護(hù)數(shù)據(jù)和資源
| 數(shù)據(jù)或資源 | 目標(biāo)字符串,Info.plist鍵 | 系統(tǒng)授權(quán)API |
|---|---|---|
| 藍(lán)牙外設(shè) | NSBluetoothPeripheralUsageDescription | 使用這個(gè)CBCentralManager類的state屬性來(lái)為藍(lán)牙外設(shè)檢查系統(tǒng)的授權(quán)狀態(tài)。 |
| 日歷數(shù)據(jù) | NSCalendarsUsageDescription | 使用EKEventStore類的authorizationStatusForEntityType:方法來(lái)檢查訪問(wèn)日歷數(shù)據(jù)的系統(tǒng)授權(quán)狀態(tài)。 |
| 相機(jī) | NSCameraUsageDescription | 使用AVCaptureDeviceInput類的deviceInputWithDevice:error:方法來(lái)檢查使用設(shè)備相機(jī)的系統(tǒng)授權(quán)狀態(tài)。 |
| 通訊錄 | NSContactsUsageDescription | 使用CNContactStore類的authorizationStatusForEntityType:方法來(lái)檢查訪問(wèn)通訊錄數(shù)據(jù)的系統(tǒng)授權(quán)狀態(tài)。 |
| 健康分享 | NSHealthShareUsageDescription | 使用HKHealthStore類的authorizationStatusForType:方法來(lái)檢查訪問(wèn)健康數(shù)據(jù)的系統(tǒng)授權(quán)狀態(tài)。 使用requestAuthorizationToShareTypes:readTypes:completion:來(lái)請(qǐng)求許可。 |
| 健康更新 | NSHealthUpdateUsageDescription | 使用HKHealthStore 類的authorizationStatusForType:方法來(lái)檢查訪問(wèn)健康數(shù)據(jù)的系統(tǒng)授權(quán)狀態(tài)。 使用requestAuthorizationToShareTypes:readTypes:completion:方法來(lái)請(qǐng)求授權(quán)。 |
| HomeKit | NSHomeKitUsageDescription | 當(dāng)你的應(yīng)用第一次試圖訪問(wèn)HMHomeManager類的屬性時(shí),系統(tǒng)為用戶呈現(xiàn)授權(quán)請(qǐng)求。 |
| 位置 | NSLocationAlwaysUsageDescription, NSLocationWhenInUseUsageDescription | 使用CLLocationManager類的authorizationStatus 方法來(lái)檢查訪問(wèn)位置數(shù)據(jù)的系統(tǒng)授權(quán)狀態(tài)。 使用requestWhenInUseAuthorization或requestAlwaysAuthorization方法來(lái)請(qǐng)求授權(quán)。 |
| 麥克風(fēng) | NSMicrophoneUsageDescription | 使用AVAudioSession 類的recordPermission方法來(lái)檢查使用設(shè)備麥克風(fēng)的系統(tǒng)授權(quán)狀態(tài)。 使用requestRecordPermission:方法請(qǐng)求授權(quán)。 |
| 運(yùn)動(dòng) | NSMotionUsageDescription | 檢查來(lái)自CMMotionActivityManager類的queryActivityStartingFromDate:toDate:toQueue:withHandler:方法的CMErrorNotAuthorized錯(cuò)誤,用來(lái)檢查訪問(wèn)加速計(jì)的系統(tǒng)授權(quán)狀態(tài)。 |
| 音樂(lè)和媒體庫(kù) | NSAppleMusicUsageDescription | 使用ALAssetsLibrary 類的authorizationStatus 方法來(lái)檢查訪問(wèn)媒體資源的系統(tǒng)授權(quán)狀態(tài)。 |
| 照片 | NSPhotoLibraryUsageDescription | 使用PHPhotoLibrary 類的authorizationStatus 方法來(lái)檢查訪問(wèn)照片庫(kù)的系統(tǒng)授權(quán)狀態(tài)。 |
| 提醒 | NSRemindersUsageDescription | 使用EKEventStore 類的authorizationStatusForEntityType: 方法來(lái)檢查訪問(wèn)提醒數(shù)據(jù)的系統(tǒng)授權(quán)狀態(tài)。 |
| Siri | NSSiriUsageDescription | 使用INPreferences 類的siriAuthorizationStatus 方法來(lái)檢查使用Siri的系統(tǒng)授權(quán)狀態(tài)。 使用requestSiriAuthorization:方法來(lái)為應(yīng)用請(qǐng)求使用SiriKit的授權(quán)。 |
| 語(yǔ)音識(shí)別 | NSSpeechRecognitionUsageDescription | 使用SFSpeechRecognizer 類的 authorizationStatus方法來(lái)檢查使用語(yǔ)音識(shí)別的系統(tǒng)授權(quán)狀態(tài)。 使用requestAuthorization方法,來(lái)為應(yīng)用使用語(yǔ)音識(shí)別請(qǐng)求授權(quán)。 |
| TV提供商 | NSVideoSubscriberAccountUsageDescription | 使用 VSAccountManager 類的 checkAccessStatusWithOptions:completionHandler:方法來(lái)檢查訪問(wèn)用戶視頻服務(wù)訂購(gòu)信息的系統(tǒng)授權(quán)狀態(tài)。 使用enqueueResourceAuthorizationRequest:completionHandler:方法請(qǐng)求授權(quán)。 |
查看表1-2是了解應(yīng)用隱私行為的起點(diǎn),而不是一個(gè)全面的清單。這個(gè)表會(huì)隨著iOS的升級(jí)而變化。
國(guó)際化你的應(yīng)用
因?yàn)閕OS應(yīng)用會(huì)在很多國(guó)家發(fā)布,本地化你的應(yīng)用內(nèi)容能夠幫助你得到更多的客戶。和用戶更喜歡使用用他們國(guó)家的語(yǔ)言進(jìn)行了本地化的應(yīng)用。當(dāng)你的將用戶界面內(nèi)容視為資源文件的時(shí)候,本地化這些內(nèi)容是相對(duì)簡(jiǎn)單的過(guò)程。
在你能夠本地化你的內(nèi)容之前,你必須使你的應(yīng)用國(guó)際化,以便本地化的過(guò)程。國(guó)際化應(yīng)用需要將任何用戶界面內(nèi)容分解為本地化資源文件,并提供用于存儲(chǔ)的特定語(yǔ)言項(xiàng)目(.lproj)目錄。它也意味著當(dāng)使用特定語(yǔ)言和特定本地化內(nèi)容的時(shí)候要使用合適的技術(shù)。
對(duì)于完全國(guó)際化應(yīng)用,本地化過(guò)程創(chuàng)建新的一組特定語(yǔ)言資源文件,用來(lái)添加到你的項(xiàng)目中。一個(gè)典型的iOS應(yīng)用需要有以下類型的資源文件的本地化版本:
- Storyboard文件(或nib文件)——Storyboard能包含text label和其他需要本地化的內(nèi)容。你或許還需要調(diào)整界面位置以適應(yīng)文本長(zhǎng)度的改變。(類似的,nib文件可以包含需要本地化的文本或者需要更新的布局)。
- 字符串文件——字符串文件(由于它們的.strings擴(kuò)展名而得名)包含應(yīng)用顯示的靜態(tài)文本的本地化版本。
- 圖片文件——你應(yīng)該避免本地化圖片除非圖片包含特定文化內(nèi)容。你應(yīng)該盡可能的避免在image文件中直接存儲(chǔ)文本。對(duì)于你在應(yīng)用中加載和使用的圖片,將文本存儲(chǔ)在字符串文件中,并在運(yùn)行時(shí)將該文本于基于圖片的內(nèi)容合并。
- 視頻和音頻文件——你應(yīng)該避免本地化多媒體文件除非它們包含特定語(yǔ)言或者特定文化的內(nèi)容。例如,你會(huì)想本地化包含跟蹤音軌的視頻文件。
關(guān)于國(guó)際化和本地化過(guò)程的信息,參見(jiàn)Internationalization and Localization Guide。關(guān)于在應(yīng)用中使用資源文件的正確方式的信息,參見(jiàn)Resource Programming Guide。