在 iOS10 中,是否可以从静态 library/framework 中访问钥匙串以进行单元测试

In iOS10, is it possible to access Keychain from within a static library/framework, for unit testing

直到 Xcode 8/iOS 10,我才能够从静态库的单元测试中访问钥匙串。升级后,出现错误,请参阅堆栈跟踪:

failed: caught "NSInternalInconsistencyException", "Couldn't add the Keychain Item."
(
    0   CoreFoundation                      0x000000010b2a734b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010ad0821e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010b2ab442 +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x000000010a89eedd -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
    4   MyLibTests                   0x0000000117366dea -[KeychainItemWrapper writeToKeychain] + 970
    5   MyLibTests                   0x000000011736614a -[KeychainItemWrapper setObject:forKey:] + 218
    6   MyLibTests                   0x000000011736a794 -[MyUserManager(Credentials) save] + 196
    7   PawPointsLibTests                   0x0000000116ef5490 -[MyLibTest tearDown] + 256
    8   XCTest                              0x000000010a6e0547 __24-[XCTestCase invokeTest]_block_invoke_2 + 1304
    9   XCTest                              0x000000010a7189d4 -[XCTestContext performInScope:] + 190
    10  XCTest                              0x000000010a6e001c -[XCTestCase invokeTest] + 255
    11  XCTest                              0x000000010a6e0835 -[XCTestCase performTest:] + 457
    12  XCTest                              0x000000010a6dd8fd -[XCTestSuite performTest:] + 491
    13  XCTest                              0x000000010a6dd8fd -[XCTestSuite performTest:] + 491
    14  XCTest                              0x000000010a6dd8fd -[XCTestSuite performTest:] + 491
    15  XCTest                              0x000000010a6c9b0c __25-[XCTestDriver _runSuite]_block_invoke + 51
    16  XCTest                              0x000000010a6eafc3 -[XCTestObservationCenter _observeTestExecutionForBlock:] + 602
    17  XCTest                              0x000000010a6c99a9 -[XCTestDriver _runSuite] + 436
    18  XCTest                              0x000000010a6ca7a2 -[XCTestDriver _checkForTestManager] + 287
    19  XCTest                              0x000000010a719f5c _XCTestMain + 628
    20  xctest                              0x000000010a64c922 xctest + 6434
    21  libdyld.dylib                       0x000000010e01368d start + 1
    22  ???                                 0x0000000000000005 0x0 + 5

关于如何使这项工作再次发挥作用的任何想法。在应用程序级别,启用钥匙串共享和添加权利可以解决问题,但这对我没有帮助 b/c 我需要能够在发布前独立测试库,因为应用程序开发是由不同的人完成的团队。我正在使用 Apple 的旧示例来了解如何添加到钥匙串,但尝试了其他库,结果都相同。

您可以试试这个解决方法:

  1. 将应用程序目标添加到您的项目。

  2. 为您添加的应用启用钥匙串共享和添加授权。

  3. 转到您项目的测试目标。在 General->Testing->Host application 下,添加您创建的应用程序。

  4. 运行 测试