4

私は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

4

0 に答える 0