测试钥匙串

我试图测试使用Xcode上的基本SenTest框架读取和更改钥匙串的代码。 该代码在设备上正常工作,但是当我开始测试时,每次我想用SecItemDelete / SecItemAdd / etc来触摸钥匙串时, SecItemDelete收到这些错误。

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

对于构建目标和测试目标,我都有匹配的通配符配置配置文件( iOS Team Provisioning Profile: * )。

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

从keychain中读取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错误,并且设法修复了它。

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

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


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

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


尝试通过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];

在某些情况下,对一个.xctest包进行编码并不像听起来那么容易。 主要是JorgeDeCorte对他的回答是正确的,即给出的短线作为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
链接地址: http://www.djcxy.com/p/83283.html

上一篇: Testing the Keychain

下一篇: Unable to move keys between keychains