xcodebuild未从.app复制文件

26
我使用xcodebuild命令创建了一个已签名的.xcarchive文件。
在.xcarchive文件中有一个.app文件,.app文件中有一个名为archived-expanded-entitlements.xcent的文件。这个文件是我的问题的关键所在。
我运行了另一个xcodebuild命令,从.xcarchive文件创建一个.IPA文件。
由于缺少archived-expanded-entitlements.xcent文件,创建IPA失败。问题是,xcodebuild正在创建一个临时目录,在那里它复制我的.app文件,并且在该.app文件内部,没有archived-expanded-entitlements.xcent文件。
除此之外,所有其他文件都在其中。
我运行的命令如下:
这将创建xcarchive:
xcodebuild -project diplomat.xcodeproj -scheme schemeName archive -archivePath /Path/To/Archive/name.xcarchive -configuration AppStore CODE_SIGN_IDENTITY="identity" PROVISIONING_PROFILE=provProfile

这将创建IPA:
xcodebuild -exportArchive -exportFormat IPA -archivePath /Path/To/Archive/name.xcarchive -exportPath /Path/To/Archive/name.ipa

尽管指定了.xcarchive的位置,但它会创建一个临时目录并不包含重要的文件。请注意,在.xcarchive过程中(运行的第一个命令),会创建archived-expanded-entitlements.xcent文件,并在第二个命令运行期间未能成功复制到临时目录中。 这就是确切的错误。Google和StackOverflow给出了类似的错误信息,但没有涉及到这个实际问题。
Checking original app

     + /usr/bin/codesign --verify -vvvv    /var/folders/sl/_wdkd56d5pb05snr559cmcww0000gn/T/D2133E2C-DC66-427C-A3C5-903A88DD0541-  42128-00007ED35037747A/name.app

Program /usr/bin/codesign returned 1 : 

     [/var/folders/sl/_wdkd56d5pb05snr559cmcww0000gn/T/D2133E2C-DC66-427C-A3C5-903A88DD0541-42128-00007ED35037747A/name.app: a sealed resource is missing or invalid

file missing: 

     /private/var/folders/sl/_wdkd56d5pb05snr559cmcww0000gn/T/D2133E2C-DC66-427C-A3C5-903A88DD0541-42128-00007ED35037747A/name.app/archived-expanded-entitlements.xcent
]

Codesign check fails :

      /var/folders/sl/_wdkd56d5pb05snr559cmcww0000gn/T/D2133E2C-DC66-427C-A3C5-903A88DD0541-42128-00007ED35037747A/name.app: a sealed resource is missing or invalid

file missing: 

      /private/var/folders/sl/_wdkd56d5pb05snr559cmcww0000gn/T/D2133E2C-DC66-427C-A3C5-903A88DD0541-42128-00007ED35037747A/name.app/archived-expanded-entitlements.xcent

Done checking the original app
2个回答

25

虽然xcodebuild的行为确实很奇怪,但您仍然可以使用exportArchive命令,并使用exportProvisioningProfile指定配置文件:

xcodebuild -exportArchive -exportFormat IPA \
  -archivePath /Path/To/Archive/name.xcarchive \
  -exportPath /Path/To/Archive/name.ipa \
  -exportProvisioningProfile 'PROVISIONING_PROFILE_NAME'

这将重新在应用中嵌入配置文件,您实际上不需要再次指定代码签名身份,因为存档过程中应该已经签名了存档。


1
这应该被标记为真正的答案,被接受的答案更像是一个解决方法。这个解决方案解决了问题。 - Casey
谢谢你的回答。我遇到了同样的问题,这个方法对我非常有效。 - Jan Cássio
1
这个解决方案对我不起作用。奇怪的是它最小化了问题的发生。 - Sachin
省了我很多时间!答案太棒了! - liuyaodong
这曾经帮了我一次,但现在停止工作了。到底是怎么回事?! - Samhan Salahuddin
请注意,PROVISIONING_PROFILE_NAME 不是其 UUID,而是其实际名称。我使用 https://github.com/chockenberry/Provisioning/releases 来快速查看配置文件。左上角的标签是配置文件的名称。 - Victor Bogdan

7
我的答案可能被视为一种解决方法,但它解决了问题。我不知道为什么一个文件没有被复制过去,但我找到了一种方式,所以这并不重要。
用这个替换第二个xcodebuild命令,它使用xcrun:
/usr/bin/xcrun -sdk iphoneos PackageApplication -v /Path/To/Archive/name.xcarchive/Products/Applications/name.app -o /Path/To/Archive/DiplomatStaples.ipa --sign "identity" - -embed "provProfile"

这将使用xcarchive创建IPA,然后重新嵌入身份验证和配置文件,因此即使仍然出现上述错误并打印出来,“双重签名”身份验证和配置文件也使其无意义。现在我可以在设备上安装应用程序了。

对于有疑问的人:我之所以不直接使用xcrun,是因为即使我指定了prov profile和signing identity,xcrun仍会根据我指定的配置(Debug、AppStore、Release等)使用项目中嵌入的配置文件和签名标识。而xcodebuild实际上会使用我提供的证书进行签名。

此操作的目的是消除CI系统要求开发者机器具备的配置文件证书需求,使得测试“AppStore”配置可以使用AdHoc分发证书进行签名,并使得稍后能够使用实际的App Store分发证书重新签名xcarchive。


1
谢谢!我在我的构建脚本中使用了相同的命令,并遇到了同样的问题 - 这立刻解决了它 :) - John Martin
让我感到不舒服的是xcrun这种方法并没有在man xcrun文档中记录下大部分选项...难道我有什么遗漏吗? - fabian789
有趣的事实:PackageApplication实际上不是一个应用程序二进制文件,而是一个隐藏在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin目录中的小Perl脚本 :) - fabian789
目前正确的方法是在xcodebuild -exportArchive中使用-exportOptionsPlist。 - Alexey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接