私はiOSプロジェクトを持っています。
今日、いくつかの認証コードを抽出し、独自のプロジェクトに移動しました。
このプロジェクトは、macOS と iOS をサポートしています。
iOS プロジェクトと Auth プロジェクトの両方を含むワークスペースを作成し、パネル.framework
を介して iOS プロジェクトに認証を追加しました。Frameworks, Libraries, and Embedded Content
サービスを構築して使用できます。CI_iOS
これらのプロジェクトのテストを実行できるカスタム スキームもセットアップしました。
認証モジュールにいくつかの統合テストを追加したのでKeychainTokenStore
、実際のキーチェーンに対してクラスをテストできます。
これらは、私のモジュールを macOS に対してテストするときに機能しますが、iOS シミュレーターでそれらを実行しようとすると、すべて失敗します。
キーチェーンと対話しようとすると、エラー コードが返されることがわかり-34018
ますerrSecMissingEntitlement
。
キーチェーンの共有を有効にする必要があると思われる投稿をいくつか読んでいます。
しかし、私はこれを機能させることができないようです。
私KeychainTokenStore
の見た目はこんな感じ
import Foundation
public protocol TokenStore {
typealias DeleteCacheResult = Result<Void, Error>
typealias DeleteCacheCompletion = (DeleteCacheResult) -> Void
typealias InsertCacheResult = Result<Void, Error>
typealias InsertCacheCompletion = (InsertCacheResult) -> Void
typealias RetrieveCacheResult = Result<String?, Error>
typealias RetrieveCacheCompletion = (RetrieveCacheResult) -> Void
/// The completion handler can be invoked in any thread.
/// Clients are responsible for dispatching to the appropriate thread, if needed.
func insert(_ token: String, key: String, completion: @escaping InsertCacheCompletion)
/// The completion handler can be invoked in any thread.
/// Clients are responsible for dispatching to the appropriate thread, if needed.
func delete(_ key: String, completion: @escaping DeleteCacheCompletion)
/// The completion handler can be invoked in any thread.
/// Clients are responsible for dispatching to the appropriate thread, if needed.
func retrieve(_ key: String, completion: @escaping RetrieveCacheCompletion)
}
public final class KeychainTokenStore: TokenStore {
public enum Error: Swift.Error {
case saveFailed
}
public init() { }
private lazy var queue = DispatchQueue(label: "KeychainTokenStore.queue", qos: .userInitiated, attributes: .concurrent)
public func insert(_ token: String, key: String, completion: @escaping InsertCacheCompletion) {
queue.async(flags: .barrier) {
completion(Result {
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: key,
kSecValueData: Data(token.utf8)
] as CFDictionary
SecItemDelete(query)
guard SecItemAdd(query, nil) == noErr else { throw Error.saveFailed }
})
}
}
public func delete(_ key: String, completion: @escaping DeleteCacheCompletion) {
queue.async(flags: .barrier) {
completion(Result {
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: key,
] as CFDictionary
SecItemDelete(query)
})
}
}
public func retrieve(_ key: String, completion: @escaping RetrieveCacheCompletion) {
queue.async {
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: key,
kSecReturnData: kCFBooleanTrue as Any,
kSecMatchLimit: kSecMatchLimitOne
] as CFDictionary
var result: AnyObject?
let status = SecItemCopyMatching(query, &result)
guard status == noErr, let data = result as? Data else {
return completion(.success(.none))
}
completion(Result {
String(decoding: data, as: UTF8.self)
})
}
}
}
私の iOS アプリでは、次のように共有を有効にしました。
認証フレームワークで共有を有効にしようとすると、次のように表示されます
プロジェクトDigiAuth
を実行してフレームワークがキーチェーンにアクセスできるようにするにはどうすればよいですか?DigiApp