testing钥匙串 – OSStatus错误-34018

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

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

对于构build目标和testing目标,我都有匹配的通配符configurationconfiguration文件( iOS Team Provisioning Profile: * )。

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

从keychain中读取errSecItemNotFound 25300

说我需要一个configuration文件匹配我的应用程序标识符每次使用钥匙串,但这不可能是正确的,或者我会得到相同的错误以外的testing目标。

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

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

意味着keychain中可能存在一个bug,更普遍的是Security.framework ,这是坦率的恐怖。

我的问题是 只有当他们在testing目标上时,有没有人碰到OSStatus错误-34018? 这似乎是我所看到的行为。

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

这个线程似乎包含解决scheme,如果问题退出你的unit testing目标。

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

基本上,你必须通过在testing目标中添加以下内容作为运行脚本来对.xcttest文件夹进行编码。

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

在设备上testing我的钥匙串时,我得到了很多-34018错误,并且设法修复了它。

如果问题不存在于您的testing目标中,这可能不是解决scheme。

所以我想解决scheme是:强制签署你的testing目标。

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

编辑:我find了解决scheme,我已经在这个答案解释

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

 //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)" 

即使有多个正确的证书的解决scheme是这个简短的脚本。 可以肯定的是,这并不理想,但就我所知,您没有机会获得Xcodefind并用于签署.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 

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