2014-02-27 87 views
40

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

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

说,我需要一个供应配置文件匹配每次我用钥匙串时间我的应用程序标识符,但不可能是正确的,还是我d在测试目标之外获得相同的错误。

挖越深,(未经证实)答案在这里:

SecItemAdd and SecItemCopyMatching returns error code -34018 (errSecMissingEntitlement)

暗示,有可能是与钥匙串中的错误更普遍Security.framework,这是坦率地说可怕。

我的问题是;当他们在测试目标上时,是否有人遇到了OSStatus错误-34018 只有?这似乎是我所看到的行为。

编辑︰添加this answerJorgeDeCorte在他的答案中使用下面。

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

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

基本上,你必须通过增加 出发,按照您的测试目标运行脚本的协同设计文件夹.xcttest。

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

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

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

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

回答

6

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

编辑:我发现我已经解释in this answer

+10

您能否描述您链接的解决方案,以防万一链接出现故障?或者我们不必点击即可找到它...... – newenglander

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 
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]; 
+1

我在主线程上运行时也遇到过这个错误。 – Greg

1

我还得到了“OSStatus错误-34018”。我通过重新创建配置文件来解决它。