1、前言
在iOS開發(fā)中黍氮,我們或多或少會使用Keychain
服務來存儲用戶的賬號密碼抹腿、證書或其他重要的信息。
根據(jù)蘋果的介紹松却,iOS設備中的
Keychain
是一個安全的的存儲容器(加密的數(shù)據(jù)庫)暴浦,可以用來為不同的App保存賬戶密碼溅话、證書或認證令牌等等。
Keychain
是系統(tǒng)級的服務歌焦,即使App
被卸載掉飞几,之前App
保存在Keychain
中的項目也不會被清除,除非設備進行刷機独撇。所以特別使用于identifierForVendor+Keychain
來代替設備ID的解決方案屑墨。另外Keychain
也支持App
間共享保存在Keychain
中的項目,不過共享僅限于同一開發(fā)者賬號下App
之間進行共享券勺。而本文將介紹我對Keychian
共享相關的經(jīng)驗绪钥。
2、Keychain基本使用
對于Keychain
的基本使用我就不再多做介紹关炼,網(wǎng)上的教程很多程腹。可以結(jié)合官方的GenericKeychain示例項目進行學習儒拂。
由于原生的Keychain
API使用起來比較復雜寸潦,所以我推薦結(jié)合第三方框架來簡化使用Keychain
的流程。
推薦Keychain
框架:
另外社痛,附上官方關于Keychain
的一些Demo见转,方便學習:
3、Keychain共享
3.1蒜哀、了解Keychain的數(shù)據(jù)組織形式
首先需要了解斩箫,Keychain
中的Item
都是按照Keychain Access Group
(訪問組)進行分組存取,不同組之間彼此隔離撵儿。如圖3-1所示乘客,兩個的App:AppOne和AppTwo,AppOne的只有一個訪問組為$(teamID).com.example.AppOne
淀歇,而AppTwo也只有一個訪問組$(teamID).com.example.AppTwo
易核,它們屬于不同的訪問組,所以彼此隔離浪默。
3.2牡直、Keychain Access Group規(guī)范
訪問組的格式為:$(teamID).$(組名)
,組名最好以反向DNS的寫法形式
例如:
假設團隊ID為:S5VDKE9N8V
纳决,組名為:com.example.AppOne
則訪問組寫法為:S5VDKE9N8V.com.example.AppOne
問題:團隊ID在哪里看到碰逸?
- 打開https://developer.apple.com
- 選擇
Account
并登陸賬號 - 選擇
Membership
標簽查看賬號信息,如圖3-2阔加,其中的Team ID就是團隊ID
3.3花竞、App默認的訪問組
每個App可以有多個訪問組,且默認都有自己的訪問組。
在應用分發(fā)期間對應用程序進行代碼簽名之前约急,Xcode會自動將您的團隊ID作為前綴并組合應用的Bundle Identifier
(例如: com.example.AppOne
)字符串存儲為app ID
。系統(tǒng)會將此app ID
當做應用程序私有訪問組的名稱并包含在應用程序的訪問組數(shù)組中苗分。如下形式:
[$(teamID).com.example.AppOne]
由于應用ID在所有應用中都是唯一的厌蔽,并且因為應用ID存儲在受代碼簽名保護的entitlement中,因此沒有其他應用可以使用它摔癣,因此該群組中沒有其他應用奴饮。與此訪問組一起存儲的任何keychain items
都是AppOne專用的。同樣择浊,如果您有第二個應用程序戴卜,其Bundle Identifier
為com.example.AppTwo
,則它自動擁有自己的私有組琢岩。
[$(teamID).com.example.AppTwo]
因此投剥,默認情況下,每個應用的keychain items
仍與其他應用彼此隔離担孔。如上述的圖3-1江锨。
3.3、開啟Keychain共享
由于默認情況下糕篇,每個應用的keychain items
與其他應用彼此隔離啄育,因此如果您希望兩個應用程序能夠共享鑰匙串項目,則可以將兩者都添加到同一個Keychain
訪問組中拌消。通過在每個應用程序的Xcode中啟用Keychain Sharing
功能挑豌,并在每種情況下將一個公共的訪問組名添加到鑰匙串組列表中來執(zhí)行此操作。比如使用共同的訪問組名:com.example.SharedItems
墩崩。如圖3-3:
如上啟用AppOne功能后氓英,其應用程序的訪問組數(shù)組將變?yōu)椋?p>
[$(teamID).com.example.SharedItems,
$(teamID).com.example.AppOne]
如果您還將相同的訪問組添加到AppTwo,其應用程序的訪問組數(shù)組將變?yōu)椋?/p>
[$(teamID).com.example.SharedItems,
$(teamID).com.example.AppTwo]
如此泰鸡,AppOne和AppTwo將獲得重疊區(qū)域以共享項目债蓝,如圖3-4
注意:
AppOne和AppTwo必須屬于同一個開發(fā)者,否則無法如何都不能共享
AppOne不用顯式地在
Keychain Sharing
的訪問組列表中添加com.example.AppOne
盛龄,因為即使不開啟Keychain Sharing功能饰迹,Xcode簽名打包之前也是會自動添加,AppTwo也是如此余舶。(每個應用程序都有自己默認的私有訪問組)若AppTwo在
Keychain Sharing
的訪問組列表中添加了com.example.AppOne
啊鸭,即使AppOne沒有在Xcode中開啟Keychain Sharing
功能,AppTwo也照樣可以讀取AppOne使用默認私有組(com.example.AppOne
)存儲的鑰匙串項目匿值,反過來也是一樣赠制。因此在Keychain Sharing下沒有絕對的私有鑰匙串的概念。-
不要特意去修改entitlements文件中訪問組的$(AppIdentifierPrefix)為自己的團隊ID,因為Xcode會在簽名打包前自動處理
另外钟些,使用Keychain必須在真機環(huán)境下烟号,在模擬器環(huán)境中會出現(xiàn)莫名其妙的問題。
順便附上自己的KeychainSharing Demo政恍,僅供學習參考汪拥。
問:$(AppIdentifierPrefix)是什么?
答:其實$(AppIdentifierPrefix)就是團隊ID篙耗,比如在注冊一個App ID的時候就會發(fā)現(xiàn)App ID Prefix就是團隊ID迫筑,如下圖所示