2014-02-27 90 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」。我通過重新創建配置文件來解決它。