使用嵌入式库进行 xcode 测试的手动签名失败。可以分解吗?

Manual signing fails for xcode test with embedded library. Can it be decomposed?

我正在尝试 运行 Facebook 的 WebDriverAgent,用于在真实设备上进行测试:https://github.com/facebook/WebDriverAgent

我们的管理员不喜欢 Apple 的自动签名,因此我们正在尝试手动签名。当我把

 xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination id='4xxx9' test DEVELOPMENT_TEAM=xxxx PROVISIONING_PROFILE=xxxxx

它说

Testing failed:
WebDriverAgentLib has conflicting provisioning settings. WebDriverAgentLib is automatically signed, but provisioning profile xxxx has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor, or switch to manual signing in the project editor.

我对所有内容都设置了手动签名(在 xcode 中),然后重试:

xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination id='4xxx9' test DEVELOPMENT_TEAM=xxxx PROVISIONING_PROFILE=xxxxx

Testing failed:
WebDriverAgentLib does not support provisioning profiles. WebDriverAgentLib does not support provisioning profiles, but provisioning profile xxxx has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor.

看来我需要分解 'test' 动作来构建没有配置文件的库,但其他所有东西都有配置文件,然后触发测试。

这个'xcodebuild test'命令可以重写为几个命令来实现这样的build/test吗?我需要一个命令行解决方案,因为这是持续集成的一部分。

提前致谢!

尝试使用 PROVISIONING_PROFILE_SPECIFIER=xxxxx 而不是设置 PROVISIONING_PROFILE,PROVISIONING_PROFILE 从 Xcode8 开始弃用。

如果错误仍然出现,请尝试既不设置 DEVELOPMENT_TEAM 也不设置 PROVISIONING_PROFILE_SPECIFIER,因为这些与代码设计相关的构建设置仅在您实际构建应用程序时才相关(但您只是在已构建的应用程序包上执行 xcodebuild 测试)。

如果您想 构建和测试 一次调用 xcodebuild 的应用程序,我们鼓励您做一个 xcodebuild ... clean build test

编辑

查看 WebDriverAgent 项目后,问题与 WebDriverAgentLib 是一个 Dynamic Framework 和 WebDriverAgentRunner-Bundle 的目标依赖关系有关。动态框架根本不喜欢在 Xcode8 的构建阶段进行代码签名(它们现在应该在复制到构建产品中时即时进行代码签名)。通过在命令行(DEVELOPMENT_TEAM 等)上指定代码签名相关的构建设置,Xcode8 将针对 Dynamic Framework 目标抱怨此问题并导致构建失败。

解决方案 1:从您的 xcodebuild 调用中删除所有与代码签名相关的构建设置(PROVISIONING_PROFILE_SPECIFIER、PROVISIONING_PROFILE、DEVELOPMENT_TEAM、CODE_SIGN_IDENTITY),然后只为WebDriverAgentRunner-Target(在 Xcode UI 中或通过命令行与 project.pbxproj 上的 plistbuddy)。

解决方案 2:不要在真实设备上进行测试,而是只在模拟器上进行测试。由于不需要对模拟器的可执行 and/or 测试包进行代码签名,因此您可以安全地从 xcodebuild 调用中省略任何代码签名相关参数。

解决方案 3:坚持使用自动代码签名并确保在构建机器的 Xcode.

中正确的开发者帐户有效登录

我遇到了这个错误, 建议我检查 "Enable Automatic Signing" 然后点击取消而不做任何事情,这确实解决了它。代码差异显示更改是添加

ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;

或在 Xcode 中称为 Always Embed Swift Standard Libraries

这发生在我身上,使用手动签名并包括 Cocoapods 依赖项。这可能是 Cocoapods (https://github.com/CocoaPods/CocoaPods/pull/6964) 的一个已知问题。他们的解决方法是在 Podfilepost_install 挂钩中将设置 PROVISIONING_PROFILE_SPECIFIER 指定为 '',但这对我们不起作用,因为我们提交了 Pods ,因此 post_install 挂钩在我们构建时不会 运行。

但是,除了将选项 PROVISIONING_PROFILE_SPECIFIER=xxxxx 传递给 xcodebuild 之外,我们还可以通过在 Pods.[=30 中设置以下选项来构建=].pbxproj 每个 target/build 配置:

CODE_SIGNING_ALLOWED = NO;
CODE_SIGNING_REQUIRED = NO;
PROVISIONING_PROFILE = '';
PROVISIONING_PROFILE_SPECIFIER = '';

我主要不是 iOS 开发人员,但根据我的理解,PROVISIONING_PROFILE 已被弃用,同时指定 CODE_SIGNING_ALLOWEDCODE_SIGNING_REQUIRED 可能是多余的,但是我们目前在我们的项目中仍然这样做。