测试Keychain - OSStatus错误-34018

时间:2014-02-27 23:32:16

标签: ios iphone xcode sentestingkit

我正在尝试使用Xcode上的基本SenTest框架来测试读取和更改钥匙串的代码。代码在设备上运行良好,但是当我开始测试时,每次我想用SecItemDelete / SecItemAdd /等触摸钥匙串时都会出现这些错误。

The operation couldn’t be completed. (OSStatus error -34018 - client has neither application-identifier nor keychain-access-groups entitlements)

我为构建目标和测试目标提供了匹配的通配符配置文件(iOS Team Provisioning Profile: *)。

这些(未经证实的)堆栈溢出答案:

Read from keychain results in errSecItemNotFound 25300

说我每次使用钥匙串时都需要一个与我的应用程序标识符匹配的配置文件,但这可能不对,或者我会在测试目标之外得到相同的错误。

深入挖掘(未经证实的)答案:

SecItemAdd and SecItemCopyMatching returns error code -34018 (errSecMissingEntitlement)

暗示钥匙串中可能存在错误,更常见的是Security.framework,这显然是可怕的。

我的问题是;有没有人在测试目标上遇到OSStatus错误-34018 ?这似乎是我所看到的行为。

编辑:在下面的答案中添加this answer JorgeDeCorte

  

如果您的问题退出,此线程似乎包含解决方案   单元测试目标。

     

https://devforums.apple.com/message/917498#917498

     

基本上,您必须通过添加.x来对.xcttest文件夹进行编码   以下作为测试目标中的运行脚本。

     

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

     

在设备上测试我的钥匙串时,我收到了很多-34018错误   这设法解决了它。

     

如果测试目标中不存在问题,则可能不存在   解决方案。

所以我想解决方法是:强制签署您的测试目标。

5 个答案:

答案 0 :(得分:6)

回答你的问题:是的,我遇到了同样的问题。它似乎在运行我的应用程序时工作正常。但是当我在我的设备上运行我的XCTests时,似乎钥匙串返回错误-34018。 奇怪的是,当我在模拟器上运行测试时,它不会发生。

编辑:我找到了一个解决方案,我已经解释过in this answer

答案 1 :(得分:4)

尝试通过Grand Central Dispatch运行钥匙串操作时出现此错误。 找到一种在主线程上实例化钥匙串(或钥匙串包装器)的方法。

//results in code -34018
   static dispatch_once_t token;
    dispatch_once(&token, ^{
        keychain = [[KeychainWrapper alloc] init];

    });

//works fine
keychain = [[KeychainWrapper alloc] init];

答案 2 :(得分:1)

在某些情况下,对.xctest包进行编码并不像听起来那么简单。主要是JorgeDeCorte对他的answer是正确的,对于大多数开发者而言,给定的短线为Run Script就足够了。

codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"

但是当您的钥匙串中有多个证书时,这将失败并显示以下行

iPhone Developer: ambiguous (matches "iPhone Developer: Your Name (ABC123DEF45)" and "iPhone Developer: Your Name (123ABC456DE)"

即使有多个证书也能获得正确证书的解决方案就是这个简短的脚本。当然这并不理想,但据我所知,你没有机会获得Xcode发现并用于签署.app的证书。

echo "codesign --verify --force --sign \"$CODE_SIGN_IDENTITY\" \"$CODESIGNING_FOLDER_PATH\""
IDENTITIES=`security find-identity -v -s "Code Signing" | grep "iPhone Developer" | awk '{ print $2 }'`

for SHA in $IDENTITIES; do
    codesign --verify --force --sign $SHA "$CODESIGNING_FOLDER_PATH"
    if [ $? -eq 0 ]; then
        echo "Matching identity found: $SHA"
        exit 0
    fi
done;

exit 1

答案 3 :(得分:1)

我也得到了“OSStatus错误-34018”。我通过重新创建配置文件解决了这个问题。

答案 4 :(得分:0)

我也无法运行涉及钥匙串的测试。

对我有用的是为测试添加“主机应用程序”。您可以找到项目目标,点击“ MyTestTarget”,单击“常规”标签,然后选择一个带下拉菜单的“主机应用程序”。

我正在测试CocoaTouch框架,因此没有主机应用程序。我只需要为测试创建一个(例如“ MyFrameworkTestApp”)。

如果这没有帮助,您还可以尝试转到“ MyFrameworkTestApp”目标的“功能”选项卡,然后尝试启用“钥匙串共享”功能。