42

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

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

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

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

从 errSecItemNotFound 25300 中的钥匙串结果中读取

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

深入挖掘,(未经证实的)答案在这里:

SecItemAdd 和 SecItemCopyMatching 返回错误代码 -34018 (errSecMissingEntitlement)

暗示钥匙串中可能存在错误,更一般地说Security.framework,这很可怕。

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

编辑:添加JorgeDeCorte在下面的答案中使用的这个答案。

如果问题在您的单元测试目标中存在,该线程似乎包含解决方案。

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

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

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

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

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

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

4

5 回答 5

6

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

编辑:我找到了一个我在这个答案中解释过的解决方案

于 2014-03-10T14:25:34.133 回答
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];
于 2015-06-05T14:37:58.333 回答
1

在某些情况下,对 .xctest 包进行代码设计并不像听起来那么容易。基本上,JorgeDeCorte 的回答是正确的,即给定的短线作为 aRun 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
于 2014-07-24T09:21:11.233 回答
1

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

于 2015-07-14T22:54:10.827 回答
1

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

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

我正在测试一个 CocoaTouch 框架,所以它没有宿主应用程序。我必须为测试创建一个(例如“MyFrameworkTestApp”)。

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

于 2019-02-28T16:03:54.070 回答