Để thực hiện Keychain chia sẻ trong Xcode 8.
1) trong mục tiêu ứng dụng của bạn trong khả năng tìm và bật "Keychain Sharing", thêm một phím Keychain Group (một chuỗi phong cách ngược miền như com.myappdomain.myappname)
2) Làm chính xác như vậy cho mục tiêu mở rộng. Đảm bảo khóa Keychain Group giống nhau cho cả ứng dụng và tiện ích mở rộng.
Thêm và truy xuất dữ liệu từ Keychain theo cách thông thường của bạn, không yêu cầu thay đổi đặc biệt trong mã. Ví dụ, đây là cách tôi đưa dữ liệu vào Keychain trong ứng dụng chính (một chút lỗi thời nhưng vẫn hoạt động trong Swift 3):
let login = loginString
let domain = domainString
let passwordData: Data = passwordString.data(using: String.Encoding.utf8, allowLossyConversion: false)!
let keychainQuery: [NSString: NSObject] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: login as NSObject, // login and domain strings help identify
kSecAttrService: domain as NSObject, // the required record in the Keychain
kSecValueData: passwordData as NSObject]
SecItemDelete(keychainQuery as CFDictionary) //Deletes the item just in case it already exists
let keychainSaveStatus: OSStatus = SecItemAdd(keychainQuery as CFDictionary, nil)
Và sau đó lấy nó trong phần mở rộng:
let keychainQuery: [NSString: NSObject] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: login as NSObject,
kSecAttrService: domain as NSObject,
kSecReturnData: kCFBooleanTrue,
kSecMatchLimit: kSecMatchLimitOne]
var rawResult: AnyObject?
let keychain_get_status: OSStatus = SecItemCopyMatching(keychainQueryForPass as CFDictionary, &rawResult)
if (keychain_get_status == errSecSuccess) {
if let retrievedData = rawResult as? Data,
let password = String(data: retrievedData, encoding: String.Encoding.utf8) {
// "password" contains the password string now
}
}
Lưu ý rằng bạn sẽ vẫn cần phải chuyển "đăng nhập" và "tên miền" qua phần mở rộng để xác định hồ sơ chính xác. Điều này có thể được thực hiện thông qua NSUserDefaults. Xem this answer về cách thực hiện việc này.
Rất hữu ích khi không liên kết đến các trang web khác hoặc ít nhất thêm nguồn có liên quan vào câu trả lời, liên kết đó không còn khả dụng nữa. – leolobato
Có khá nhiều thông tin ở đó, tôi không lên để chưng cất và dán, nhưng đây là phiên bản Lưu trữ Internet: https://web.archive.org/web/20141028160328/http://dasdev.de/2014/ 08/12/ios8-share-extension-với-một-chia sẻ-keychain –
Các repo GitHub vẫn còn đó https://github.com/dasdom/KeychainDemo quá –