我正在为 Mac Os X 开发一个应用程序。我使用第 3 方 Apple 开发人员身份对其进行代码签名,以便独立分发。在代码中,我使用 CoreFoundation 函数对签名的有效性进行了一些检查,如下所示:
SecCodeRef myCode;
status = SecCodeCopySelf(kSecCSDefaultFlags,&myCode);
status = SecCodeCheckValidity(myCode,kSecCSDefaultFlags,NULL);
NSString *result;
switch (status)
{
case noErr:
result = @"Code signature is present";
break;
case errSecCSUnsigned:
result = @"Executable is unsigned";
break;
case errSecCSSignatureFailed:
result=@"Signature failed.";
break;
default:
result=@"Error validating signature";
break;
}
NSAlert *myAlert =[[NSAlert alloc] init];
[myAlert setAlertStyle:NSCriticalAlertStyle];
[myAlert setMessageText:@"Program Beta Error"];
[myAlert setInformativeText:result];
[myAlert runModal];
SecStaticCodeRef fileCode;
status = SecCodeCopyStaticCode(myCode, kSecCSDefaultFlags, &fileCode);
if (status != noErr)
{
// NSLog(@"Unable to get static code object.");
}
CFDictionaryRef signingInfo = NULL;
status = SecCodeCopySigningInformation(fileCode, kSecCSSigningInformation, &signingInfo);
NSDictionary *myDictionary = [NSDictionary dictionaryWithDictionary:(__bridge NSDictionary *)(signingInfo)];
指定的 kSecCSSigningInformation 参数允许我收集有关签名开发人员身份和团队 ID 的信息。这在 10.10 Yosemite 和 10.9 Mavericks 中运行良好,但在 10.8 Mountain Lion 中失败。我已经使用 RB App Checker Lite 检查了情况,实际上,在 Mountain Lion 下,对于相同的可执行文件,我得到了以下屏幕截图中显示的不同结果:
1)这是10.10和10.9的情况,看起来很正常,我的代码获取了Team ID。
2)这是 10.8 Mountain Lion 中的情况,RB App Checker Lite 无法验证可执行文件:
3)如果我扩大错误,我知道它是由 Sparkle 引起的:
我将 sparkle Xcode 项目添加到我的应用程序项目中,并且在 10.10 和 10.9 下一切正常。同样在 10.8 上,如果我启动应用程序 sparkle 不会抱怨签名,但 CoreFoundation 函数无法确定团队 ID,尽管它们报告签名存在。
任何帮助将不胜感激。谢谢
Ps 我在这个问题上得到了很多帮助,建议我从 Autoupdate.app 的一个可执行文件中删除第 3 方证书签名,在前面的屏幕截图中显示为使用第 3 方证书签名。现在我也使用相同的开发者 ID 证书签署 Autoupdate.app,但错误仍然存在。正如您在以下屏幕截图中看到的那样,如果您使用 RB App Checker Lite 单独检查 sparkle 框架,它会说它验证正确:
虽然如果我使用 sparkle 框架向我的程序添加所需的复制文件阶段,我会得到与以前相同的错误:
同样,任何帮助将不胜感激。