不同的應(yīng)用有不同的需求,但是有些行為是大多數(shù)類型的應(yīng)用都需要的芥永。以下部分提供了有關(guān)如何在應(yīng)用中實(shí)現(xiàn)幾個特定功能類型的指導(dǎo)蛤铜。
隱私策略
保護(hù)用戶的隱私是應(yīng)用設(shè)計階段需要重點(diǎn)考慮的問題官研。隱私保護(hù)包括保護(hù)用戶的數(shù)據(jù)、用戶的身份識別信息泻骤、以及個人信息漆羔。系統(tǒng)框架已經(jīng)為管理數(shù)據(jù)(例如通訊錄)提供了隱私控制,但是應(yīng)用應(yīng)該采取措施來保護(hù)自身的數(shù)據(jù)狱掂。
使用磁盤加密來保護(hù)數(shù)據(jù)
使用內(nèi)置硬件來存儲經(jīng)過磁盤格式加密的文件演痒,并根據(jù)需要進(jìn)行解密。當(dāng)用戶設(shè)備被鎖定時趋惨,保護(hù)文件無法訪問鸟顺,即使是創(chuàng)建它們的應(yīng)用。用戶必須解鎖設(shè)備(通過輸入相應(yīng)的密碼)應(yīng)用才能夠訪問被保護(hù)的文件器虾。
絕大多數(shù)iOS設(shè)備都提供數(shù)據(jù)保護(hù)讯嫂。數(shù)據(jù)保護(hù)也取決于如下必要條件
- 用戶設(shè)備上的文件系統(tǒng)必須支持?jǐn)?shù)據(jù)保護(hù),大多數(shù)設(shè)備都支持此項行為兆沙。
- 用戶必須為設(shè)備設(shè)置密碼鎖欧芽。
為了保護(hù)文件,你要為文件添加一個屬性葛圃,用來指明想要的保護(hù)級別千扔≡髅睿可以使用NSData類或者NSFileManager類來添加這個屬性。當(dāng)寫入新文件時曲楚,你可以使用 NSData類的writeToFile:options:error:方法(帶有合適的寫入選項參數(shù)值)厘唾。對于已存在的文件,你可以使用NSFileManager類的setAttributes:ofItemAtPath:error:方法來設(shè)置或改變NSFileProtectionKey的值龙誊。當(dāng)使用這些方法時抚垃,為文件指定一個保護(hù)級別。保護(hù)級別如下所示:
- 沒有保護(hù)——文件已加密载迄,但不受密碼保護(hù),并在設(shè)備鎖定時可用抡蛙。指定NSDataWritingFileProtectionNone 選項 (NSData) 或NSFileProtectionNone 屬性 (NSFileManager).护昧。
- 完全保護(hù)——文件已加密,并且在設(shè)備鎖定時無法訪問粗截。指定 NSDataWritingFileProtectionComplete 選項 (NSData)或NSFileProtectionComplete 屬性 (NSFileManager).
- 完全保護(hù)惋耙,除非已經(jīng)打開——文件已加密。當(dāng)設(shè)備鎖定時熊昌,關(guān)閉的文件不可訪問绽榛。但是如果鎖定前文件是打開的,那么鎖定后文件依然可被訪問婿屹。指定NSDataWritingFileProtectionCompleteUnlessOpen 選項 (NSData) 或 NSFileProtectionCompleteUnlessOpen 屬性 (NSFileManager).
- 完全保護(hù)灭美,直到首次登錄——文件已加密且無法訪問,直到設(shè)備已啟動且用戶解鎖過一次之后昂利。指定NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication 選項 (NSData) 或者NSFileProtectionCompleteUntilFirstUserAuthentication 屬性 (NSFileManager).
如果你要保護(hù)文件届腐,你的應(yīng)用必須準(zhǔn)備好失去這個文件的訪問權(quán)。當(dāng)完全文件保護(hù)被啟用時蜂奸,應(yīng)用在用戶鎖定設(shè)備的時候失去對文件讀寫的能力犁苏。你可以跟蹤狀態(tài)的改變以便使用下面的技術(shù)來保護(hù)文件:
- 應(yīng)用委托實(shí)現(xiàn)applicationProtectedDataWillBecomeUnavailable: 和 applicationProtectedDataDidBecomeAvailable: 方法.
- 任何對象都可以注冊UIApplicationProtectedDataWillBecomeUnavailable 和 UIApplicationProtectedDataDidBecomeAvailable 通知.
- 任何對象都可以檢查UIApplication對象的protectedDataAvailable屬性,來確定文件當(dāng)前是否可以訪問扩所。
對于新文件围详,推薦你在寫入文件前啟用數(shù)據(jù)保護(hù)。如果你正在使用writeToFile:options:error:方法寫入一個NSData對象到磁盤祖屏,那么它自動就實(shí)現(xiàn)了數(shù)據(jù)保護(hù)助赞。對于已存在的文件,使用新的受保護(hù)的版本替換舊的不受保護(hù)的版本來實(shí)現(xiàn)數(shù)據(jù)保護(hù)袁勺。
識別應(yīng)用的唯一用戶
識別應(yīng)用的用戶可以帶來明確的好處嫉拐。如果你只需要區(qū)別應(yīng)用不同的用戶,iOS提供了標(biāo)識符來幫助完成此功能魁兼。但是婉徘,如果你需要高級別的安全性漠嵌,你可能需要做更多工作。例如盖呼,一個提供金融服務(wù)的應(yīng)用會希望提示用戶提供登錄憑證儒鹿,以確保用戶被批準(zhǔn)訪問特定賬戶。
重要:當(dāng)識別用戶時,始終要明確表達(dá)你打算使用獲取的信息做什么乙帮。識別用戶以便跟蹤他們的行為是不可接受的碎节。
以下是一些可能需要你識別用戶的常見情況,以及如何實(shí)現(xiàn)它們的解決方案:
- 你想連接用戶到服務(wù)器上的特定賬戶圾浅。包活一個要求用戶安全地輸入他們賬戶信息的登錄界面『镀樱總是通過以加密格式保存從用戶處搜集的賬戶信息以保證安全狸捕。
- 你需要區(qū)分在不同設(shè)備上運(yùn)行的實(shí)例。使用UIDevice類的identifierForVendor屬性來獲取一個ID众雷。一個用戶可以有多個設(shè)備灸拍,該ID值在每個設(shè)備上都不同。
- 你想因廣告的目的來識別用戶砾省。使用ASIdentifierManager類的advertisingIdentifier屬性來獲取用戶的ID鸡岗。
因?yàn)橛脩舯辉试S在所有他們的設(shè)備上運(yùn)行應(yīng)用,蘋果公司不提供識別同一個用戶在不同設(shè)備上的方式编兄。如果你需要識別特定的用戶轩性,你必須使用UUIDs、登錄賬號狠鸳、或者其他類型的身份識別系統(tǒng)來提供你自己的解決方案炮姨。
遵守限制
用戶可以設(shè)置限制,這種限制指明要在應(yīng)用中使用的媒體的評級碰煌。如果你的應(yīng)用基于限制播放媒體或修改媒體的行為舒岸,你需要確定當(dāng)前的設(shè)置以及在設(shè)置改變時進(jìn)行響應(yīng)。
想要得到當(dāng)前的設(shè)置芦圾,獲取standardUserDefaults對象并使用objectForKey:方法來查看下面這些鍵的值:
媒體評級鍵 | 值 |
---|---|
com.apple.content-rating.ExplicitBooksAllowed | Boolean蛾派。如果值為NO,則露骨的書本不被允許个少。 |
com.apple.content-rating.ExplicitMusicPodcastsAllowed | Boolean洪乍。如果值為NO,則露骨的音樂夜焦、電影壳澳、以及播客節(jié)目都不被允許。 |
com.apple.content-rating.AppRating | NSNumber茫经。該鍵的值在0-1000的范圍內(nèi)巷波。應(yīng)用的評級不允許超過當(dāng)前值萎津。 |
com.apple.content-rating.MovieRating | NSNumber。該鍵的值在0-1000的范圍內(nèi)抹镊。電影的評級不允許超過當(dāng)前值锉屈。 |
com.apple.content-rating.TVShowRating | NSNumber。該鍵的值在0-1000的范圍內(nèi)垮耳。TV內(nèi)容的評級不允許超過當(dāng)前值颈渊。 |
注意:如果objectForKey: 對于特定鍵返回nil,這意味著關(guān)于此特定限制的信息不可用终佛。應(yīng)用可以使用它自己的政策來決定合適的評級俊嗽。
要查明何時用戶更改了限制,請注冊NSUserDefaultsDidChangeNotification通知铃彰。standardUserDefaults對象在應(yīng)用檢測到一個持久域(persistent domains)中的首選項發(fā)生更改的時候绍豁,發(fā)送這個通知給應(yīng)用。
應(yīng)用評級是針對國家代碼定義的豌研,并得到廣泛應(yīng)用的妹田。表5-1展示了美國應(yīng)用評級相關(guān)聯(lián)的值唬党。
Table 5-1 應(yīng)用評級
評級名稱 | 數(shù)值 |
---|---|
4+ | 100 |
9+ | 200 |
12+ | 300 |
17+ | 600 |
電影和電視的評級因國家不同而異鹃共。如果國家或地區(qū)沒有為電影或電視節(jié)目指定評級系統(tǒng),應(yīng)用應(yīng)該使用它自己的合適地評級策略驶拱。雖然大多數(shù)地區(qū)定義了電影評級霜浴,但只有少數(shù)地區(qū)定義了電視節(jié)目的評級。
一個地區(qū)可以定義幾個評級級別蓝纲,每個級別與一個描述評級的名字和一個評級0-1000的范圍阴孟。例如,美國使用字符串“G”和數(shù)字100來指定最低一級的電影評級級別税迷。
即使應(yīng)用不播放媒體永丝,你也可能想把你自己的評級系統(tǒng)映射到電視節(jié)目評級系統(tǒng)上。例如箭养,游戲可以只有當(dāng)美國電影評級為“R”被允許的時候才可以啟用某些功能慕嚷。想要查看當(dāng)前的評級列表,請下載本文檔的附件(鏈接位于文檔底部)毕泌。
支持多個iOS版本
支持最新以及較早iOS版本的應(yīng)用喝检,必須使用運(yùn)行時來檢測來阻止在老版本上運(yùn)行新API。當(dāng)應(yīng)用嘗試使用當(dāng)前操作系統(tǒng)不允許的功能時撼泛,運(yùn)行時檢查可以防止此種情況下崩潰的發(fā)生挠说。
以下是你可以使用的幾個檢查類型。
- 要確定一個類是否存在愿题,就看它的Class對象是否為nil损俭。使用下面類似的方法進(jìn)行判斷蛙奖。
if ([UIPrintInteractionController class]) {
// Create an instance of the class and use it.
}
else {
// The print interaction controller is not available so use an alternative technique.
}
- 想要確定現(xiàn)有類中是否有一個方法可用,使用instancesRespondToSelector:類方法撩炊,或者respondsToSelector:對象方法外永。
- 想要判斷基于C的函數(shù)是否可用,執(zhí)行函數(shù)名與NULL的比較拧咳。如果符號不是NULL伯顶,就可以調(diào)用函數(shù)。例如:
if (UIGraphicsBeginPDFPage != NULL) {
UIGraphicsBeginPDFPage();
}
更多關(guān)于如何編寫代碼以支持多開發(fā)目標(biāo)的信息和例子骆膝,參見SDK Compatibility Guide祭衩。
啟動的時候保留應(yīng)用的視覺外觀
即使你的應(yīng)用支持后臺運(yùn)行,它也不是永遠(yuǎn)運(yùn)行阅签。在有些時候掐暮,系統(tǒng)可能會需要終止應(yīng)用來為當(dāng)前的前臺應(yīng)用釋放空間。但是政钟,用戶應(yīng)該永遠(yuǎn)不需要關(guān)心應(yīng)用是否在運(yùn)行路克。從用戶的角度看,退出應(yīng)用看上去和臨時中斷是一樣的养交。當(dāng)用戶回到應(yīng)用時精算,應(yīng)用應(yīng)該總是回到之前退出時的位置,這樣用戶就能繼續(xù)之前的任務(wù)了碎连。該行為提供了一個很好的用戶體驗(yàn)灰羽,而且UIKit內(nèi)置這些轉(zhuǎn)換狀態(tài),所以相對容易實(shí)現(xiàn)鱼辙。
UIKit內(nèi)建的狀態(tài)保存系統(tǒng)提供了簡單但靈活的基礎(chǔ)功能廉嚼。這些基本功能的工作是在合適的時候驅(qū)動保存和恢復(fù)的進(jìn)程。要想做到這點(diǎn)倒戏,UIKit需要來自應(yīng)用的幫助怠噪。因?yàn)橹挥心憷斫饽銘?yīng)用的內(nèi)容,所以只有你才能寫保存和恢復(fù)內(nèi)容的代碼杜跷。當(dāng)你更新應(yīng)用的UI的時候傍念,也只有你知道如何把舊的儲存的內(nèi)容映射到界面中新的對象中。
有三個你必須考慮狀態(tài)保存的地方:
- 應(yīng)用的委托對象葱椭,它管理應(yīng)用的頂層狀態(tài)
- 應(yīng)用的視圖控制器對象捂寿,它管理應(yīng)用用戶界面的整體狀態(tài)
- 應(yīng)用自定義視圖,可能有一些需要保存的自定義數(shù)據(jù)
UIKit允許你選擇用戶界面的局部進(jìn)行保存孵运。如果你已經(jīng)有自定義的代碼來處理狀態(tài)保存秦陋,你可以繼續(xù)使用這些代碼,并根據(jù)需要把部分移動到UIKit的狀態(tài)保存系統(tǒng)治笨。
在應(yīng)用中啟用狀態(tài)保存和恢復(fù)
狀態(tài)保存和恢復(fù)不是自動功能驳概,應(yīng)用必須選擇使用它赤嚼。應(yīng)用通過實(shí)現(xiàn)它的委托中的如下方法來表明它對該功能的支持:
application:shouldSaveApplicationState:
application:shouldRestoreApplicationState:
通常,你的這些方法的實(shí)現(xiàn)要返回YES顺又,以便表明這個狀態(tài)存儲和恢復(fù)能夠發(fā)生更卒。但是,如果不想讓此功能發(fā)生稚照,可以讓方法返回NO蹂空。例如,在釋放和更新應(yīng)用之后果录,如果應(yīng)用不能有效的從之前的版本回復(fù)狀態(tài)上枕,你可以讓application:shouldRestoreApplicationState:方法返回NO。
(未完待續(xù)......)