在當(dāng)今以隱私為中心的世界中,通過安全地存儲關(guān)鍵用戶數(shù)據(jù)來保持我們iOS應(yīng)用程序安全性的高標(biāo)準(zhǔn)比以往任何時(shí)候都更加重要。在iOS應(yīng)用中處理敏感用戶數(shù)據(jù)(如密碼,應(yīng)用內(nèi)購買等)時(shí),移動(dòng)開發(fā)人員需要考慮安全性。我非常重視安全性,將其作為我們核心價(jià)值觀的一部分。在本教程中,我將向您展示如何通過在iOS上實(shí)現(xiàn)持久登錄功能來使用Swift中的Keychain來存儲敏感用戶數(shù)據(jù)。
1.什么是Keychain?
Keychain是存儲小型敏感數(shù)據(jù),如密碼,銀行帳號或我們希望為您的用戶保密的一些其他個(gè)人信息。
與OS X一樣,iOS也為您的應(yīng)用程序提供了一個(gè)Keychain,以便能夠存儲所有上述敏感數(shù)據(jù)類型。通常,我們只能在同一個(gè)應(yīng)用程序中使用這些類型的信息,而不能在其他應(yīng)用程序中使用。
那么,你有沒有聽說過Facebook和Messenger?開玩笑。兩個(gè)應(yīng)用程序最酷的事情是,一旦您成功登錄Facebook注冊帳戶,您也可以使用相同的帳戶登錄到Messenger。但您可能想知道我們是否可以這樣做,這意味著帳戶信息不安全。應(yīng)用程序必須知道用戶的電子郵件和密碼才能登錄Messenger - 聊天應(yīng)用程序。
實(shí)際上,我們可以使用Keychain Sharing來確保安全性。我們可以在具有相同Apple開發(fā)者帳戶的同一設(shè)備上的許多不同應(yīng)用程序之間共享存儲的Keychain。
2.在Swift中設(shè)置Keychain共享
在這個(gè)Swift教程中,我們需要?jiǎng)?chuàng)建兩個(gè)不同的移動(dòng)應(yīng)用程序,向您展示如何使用Keychain Sharing及其強(qiáng)大的功能。讓我們將這兩個(gè)應(yīng)用 命名為TheiOSAppTemplates 和TheiOSAppTemplatesBlog 項(xiàng)目。**
在每個(gè)項(xiàng)目中,我們在Capabilities窗格中打開Keychain Sharing,如下圖所示。記住Keychain Groups的價(jià)值, 因?yàn)樗糜谄渌麘?yīng)用程序。基于此,他們可以從Keychain中檢索存儲的值。
打開后,Keychain Sharing將為您創(chuàng)建一個(gè)*“.entitlements” *文件:
在上面的文件中,有一個(gè){ AppIdentifierPrefix }字段。此字段是從Apple Developer Account門戶中的App ID獲取的Prefix(或TeamID)。
目前,有許多支持Keychain Storage的開源Swift庫。我們也可以自己編碼,因?yàn)樗⒉浑y。但是為了簡單和快速,我們將使用KeychainSwift庫,我們將其作為Cocoa Pods項(xiàng)目的依賴項(xiàng)添加到:
* pod “KeychainSwift”
在完成的源代碼中,我們實(shí)際安裝了該pod庫,因此 您需要 做的就是 下載并運(yùn)行Xcode項(xiàng)目。
3.****Keychain ****Swift示例
在我們開始之前,讓我們稍微描述一下這兩個(gè)應(yīng)用程序。第一個(gè)名為TheiOSAppTemplates的應(yīng)用程序 具有用戶名和密碼的登錄功能。成功登錄后,它將引導(dǎo)您進(jìn)入只有一個(gè)按鈕的屏幕。點(diǎn)擊該按鈕將打開第二個(gè)應(yīng)用程序(TheiOSAppTemplatesBlog),其中包含來自第一個(gè)應(yīng)用程序的信息(用戶名和密碼)。
第一步。將數(shù)據(jù)存儲到Swift中的Keychain(寫入Keychain)
好吧,讓我們編寫代碼。在“ 登錄 ”按鈕的IBAction中,我們可以這樣:
guard let userName = self.userNameTextField.text,
let password = self.passwordTextField.text else { return }
let keychain = KeychainSwift()
keychain.accessGroup = "123ABCXYZ.iOSAppTemplates"
keychain.set(userName, forKey: "userName")
keychain.set(password, forKey: "password")
// The next flow is navigation. Basically, it pushes to ReadBlogsViewController
上面的代碼取到了userNameTextField和passwordTextField的值,然后將它們存儲到Keychain中。通過將app設(shè)置為accessGroup,我們啟用了在兩個(gè)應(yīng)用程序之間共享密鑰鏈數(shù)據(jù)的功能。
顯然,不要忘記導(dǎo)入KeychainSwift庫,以便代碼成功編譯。如您所見,只需幾行簡單的代碼,就可以將必要的信息保存到Keychain中。下一步是導(dǎo)航到 *ReadBlogsViewController *。我們把這部分留給你作為一個(gè)小挑戰(zhàn)。
接下來,讓我們看看 ReadBlogsViewController類中的內(nèi)容。在“ Read our blogs ”按鈕的IBAction中,我們有:
guard let appURL = URL(string:“OpenBlogApp://”)else if {return} if UIApplication.shared.canOpenURL(appURL){
UIApplication.shared.open(appURL) }
上面的代碼幫助我們從另一個(gè)應(yīng)用程序打開一個(gè)應(yīng)用程序。但是,這還不夠。我們需要稍微配置一下Schemes。讓我們將LSApplicationQueriesSchemes參數(shù)添加到Info.plist,如下所示
注意LSApplicationQueriesSchemes的類型 。它應(yīng)該是Array類型而不是String。
然后 從Swift中的Keychain讀取數(shù)據(jù)
讓我們看看我們?nèi)绾螐钠渌麘?yīng)用程序中的Keychain中檢索信息。在viewDidLoad中,我們有以下代碼從Keychain讀取:**
let keychain = KeychainSwift() keychain.accessGroup =“123ABCXYZ.iOSAppTemplates”
if let userName = keychain.get(“userName”), let password = keychain.get(“password”){ keychainLabel.text =“userName = \(userName )password = \(密碼)“
}
簡單直接。請注意我們?nèi)绾卧O(shè)置accessGroup,類似于我們?yōu)榈谝粋€(gè)應(yīng)用程序所做的。通過這種方式,我們可以獲得存儲在Keychain中的值,即使數(shù)據(jù)是由其他應(yīng)用程序編寫的。
這個(gè)Keychain Swift教程的最后一步是在Info.plist中配置URL類型, 如下所示:
這將允許從第一個(gè)應(yīng)用程序打開第二個(gè)應(yīng)用程序。讓我們同時(shí)運(yùn)行兩個(gè)iOS應(yīng)用程序,并查看結(jié)果。點(diǎn)擊按鈕,輸入流程,并通過利用Keychain,注意如何在同一訪問組中的兩個(gè)不同應(yīng)用之間安全地共享數(shù)據(jù)。
4。結(jié)論
正如我們所看到的,Keychain是一種強(qiáng)大的數(shù)據(jù)存儲機(jī)制,支持不同iOS應(yīng)用之間的安全數(shù)據(jù)共享。我們希望在閱讀本文之后,您現(xiàn)在可以通過Swift中的Keychain以安全的方式存儲敏感用戶信息以及保留登錄憑據(jù)。
這是一個(gè)非常有用的功能,如果將來您計(jì)劃開發(fā)多個(gè)相互關(guān)聯(lián)的應(yīng)用程序并在本地之間共享數(shù)據(jù)。在閱讀開源Swift項(xiàng)目之前,我們建議您嘗試根據(jù)我們的教程編寫自己的代碼。
快樂的編碼!