2

我遇到了一些 KeyChain 代码的问题,导致通过创建的存档在xcodebuild作为临时应用程序分发并在设备上运行时崩溃。该问题不会影响通过 Xcode 创建的构建——仅影响通过命令行创建的构建。

引发错误的代码:(我正在使用此处找到的 KeyChain 库)

KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"myapp" accessGroup:nil];
NSString *testKeychain = (NSString *)[keychain objectForKey:(__bridge id) kSecAttrAccount];
if (testKeychain.length) {
    NSLog(@"KeyChain value for kSecAttrAccount: %@", testKeychain);
} else {
    NSLog(@"No KeyChain value for kSecAttrAccount");
}
[keychain setObject:@"Shared KeyChain value!" forKey:(__bridge id) kSecAttrAccount]; // <-- error thrown here

“缺少权利”错误

2012-06-15 10:03:20 AM +0000 securityd MyApp [138] SecItemCopyMatching: missing entitlement
2012-06-15 10:03:20 AM +0000 MyApp No KeyChain value for kSecAttrAccount
2012-06-15 10:03:20 AM +0000 securityd MyApp [138] SecItemCopyMatching: missing entitlement
2012-06-15 10:03:20 AM +0000 securityd MyApp [138] SecItemAdd: missing entitlement
2012-06-15 10:03:20 AM +0000 MyApp *** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/davidbjames/XCode/.../KeychainItemWrapper.m:305

权利文件:

<key>keychain-access-groups</key>
<array>
    <string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string>
</array>

xcodebuild输出似乎正在处理权利文件:

setenv CODE_SIGN_ENTITLEMENTS MyApp/MyApp.entitlements
..
ProcessProductPackaging MyApp/MyApp.entitlements /etc/etc/build/MyApp.xcent
..
builtin-productPackagingUtility /etc/etc/MyApp.entitlements -entitlements -format xml -o /etc/etc/MyApp.xcent

代码在模拟器、调试设备和临时分发中运行时没有错误。唯一的问题是通过命令行构建发生的。我错过了什么?

4

3 回答 3

2

经过长时间的工作,我找到了解决这个问题的方法,并相应地修改了 floatsign.sh 脚本(https://gist.github.com/mediabounds/1367348)——权利必须像@sglist 所说的那样更新。你可以在这里找到实现:https ://gist.github.com/Weptun/5406993

于 2013-04-17T19:27:48.810 回答
1

此错误表明您的应用程序的权利存在问题。根据我的经验,原因通常是应用程序权利中的应用程序标识符前缀与配置文件中的应用程序标识符前缀不匹配。

要进行验证,请使用 codesign 工具查看您的应用程序的权利:

codesign -d --entitlements - MyApp.app/

然后,将 App Identifier Prefix 与配置文件中的进行比较:

cat MyApp.app/embedded.mobileprovision
于 2013-01-24T01:09:29.783 回答
0

我认为这条线是错误的:

[[KeychainItemWrapper alloc] initWithIdentifier:@"myapp" accessGroup:nil]

您将希望在其中传递您的访问组名称。它可能会或可能不会解决您的问题,这些事情有点“敏感”。

于 2012-06-29T14:22:27.367 回答