ios keychain共有5種型別: ksecclassgenericpassword、ksecclassinternetpassword、ksecclasscertificate、ksecclasskey、ksecclassidentity
這五種型別分別有不同的屬性,你可以理解為資料中5個不同的表,他們有各自對應的字段,因此對應的它們的增刪改查其實有點類似於sql語句的操作,下面是不同型別對應的屬性:
現在以ksecclassgenericpassword(一般的密碼)為例:
增加keychain
//查詢keychain:新增keychain
- (void
)addkeychainpassword;
/*引數一:
ksecattraccessiblewhenunlocked 表示獲取當前金鑰只要螢幕處於解鎖狀態就可以了
ksecattraccessibleafterfirstunlock 表示手機第一次解鎖就可以獲取當前金鑰
ksecattraccessiblealways 表示任何時候都可以獲取當前金鑰
ksecattraccessiblewhenpasscodesetthisdeviceonly 表示獲取金鑰只能在當前裝置,把手機資料恢復到新的手機中是不可用的
ksecattraccessiblewhenunlockedthisdeviceonly 非鎖定狀態,且裝置唯一指定,同上
ksecattraccessibleafterfirstunlockthisdeviceonly 第一次解鎖,且裝置唯一指定,同上
ksecattraccessiblealwaysthisdeviceonly 總是可以獲取,當然也是裝置唯一指定,同上
引數二:
ksecclassgenericpassword 為keychain型別
引數三:
ksecvaluedata 儲存的資料,就是密碼、token儲存的地方,要轉化為nsdata型別
引數四:
ksecattraccount 為賬戶名 作為賬戶密碼的唯一索引
引數五:
ksecattrservice 為服務名 作為賬戶密碼的唯一索引
*/cftyperef result;
osstatus status = secitemadd((__bridge cfdictionaryref)query, &result);
if (status ==errsecsuccess)
else
}
//查詢keychain對應的屬性:查詢keychain
- (void
)querykeychainpassword;
//ksecmatchlimitone 表示查詢返回一條記錄,有可能查到多條記錄,一般預設返回一條記錄
//ksecmatchlimitall 表示返回所有記錄
//secitemcopymatching函式會根據query裡面的查詢條件查詢對應符合要求的記錄,另外根據不同的keychain型別datatyperef會返回對應的不同型別如nsarray、nsdictionary、nsdata
cftyperef datatyperef =null;
osstatus status = secitemcopymatching((__bridge cfdictionaryref)query, &datatyperef);
if (status ==errsecsuccess)
}
//更新keychain:另外可以通過ksecreturnref查詢其他屬性,相對於前面的返回金鑰的引用,ksecreturnref返回的是keychain所有的屬性
- (void
)querymoreattribute;
cftyperef datatyperef =null;
//重點是(__bridge id)ksecreturnref:@yes,宣告返回的資料是整個keychain的所有屬性
osstatus status = secitemcopymatching((__bridge cfdictionaryref)query, &datatyperef);
if (status ==errsecsuccess)
}
//刪除keychain:修改keychain
- (void
)changekeychainpassword;
nsdictionary *update = @;
osstatus status =secitemupdate((__bridge cfdictionaryref)query, (__bridge cfdictionaryref)update);
if (status ==errsecsuccess)
}
//ios keychain有乙個特色功能就是keychainsharing,它能實現多個同乙個開發者賬號下的多個應用共享keychain,前提是要開啟keychainsharing功能,如下圖所示:刪除keychain
- (void
)deletekeychainpassword;
//盡量詳細的新增多個屬性,避免誤刪其他keychain
osstatus status =secitemdelete((__bridge cfdictionaryref)query);
if (status ==errsecsuccess)
}
可以在keychainsharing中對應的分組,把keychain新增的到分組的操作可以這樣寫
//查詢對應的分組sharing items
//新增sharing items
- (void
)addsharingitems;
/*(__bridge id)ksecattrsynchronizable : @yes 表示可以同步到icloud,如果要同步到其他裝置,請注意避免使用deviceonly設定等其他和裝置唯一性相關的設定
*/osstatus status =secitemadd((__bridge cfdictionaryref)query, nil);
if (status ==errsecsuccess)
else
}
//和對單個keychain進行操作不同的是新增多了乙個ksecattraccessgroup屬性,用於指明對應的分組,這裡要注意的是要新增開發者賬號的teamid,用於區分不同的開發者。查詢sharing items
- (void
)querysharingitems;
cftyperef datatyperef =null;
osstatus status = secitemcopymatching((__bridge cfdictionaryref)query, &datatyperef);
if (status ==errsecsuccess)
else
}
如果都是自己定義屬性進行增刪改查的操作,是比較容易出bug的,而且操作也比較繁瑣,畢竟這些操作都是基於c語言的api操作。下面介紹乙個簡單的輕量級框架sskeychain來實現我們對金鑰的增刪改查,閒話少說,直接上**:
- (void最後附上本文demo:)viewdidload
else
}
iOS之keychain的使用
一 keychain 基礎 根據蘋果的介紹,ios裝置中的keychain是乙個安全的儲存容器,可以用來為不同應用儲存敏感資訊比如使用者名稱,密碼,網路密碼,認證令牌。蘋果自己用keychain來儲存wi fi網路密碼,vpn憑證等等。它是乙個sqlite資料庫,位於 private var key...
iOS獲取UUID,並使用keychain儲存
udid被棄用,使用uuid來作為裝置的唯一標識。獲取到uuid後,如果用nsuserdefaults儲存,當程式被解除安裝後重灌時,再獲得的uuid和之前就不同了。使用keychain儲存可以保證 程式給大家兩個類 uuid.h中的 import 尖括號 foundation foundation...
iOS開發 用keychain替代UDID
從2013 5 1日開始蘋果就禁止對uuid的應用的通過了。所以我們需要用一些辦法替換,下面我就是用keychain的訪問替換掉uuid的。那麼,關於keychain的應用,apple提供了乙個叫generickeychain的例子程式,在這裡 其中封裝了乙個簡化keychain操作的類 keych...