Ios 如何通过命令行对Swift应用程序进行代码设计?

Ios 如何通过命令行对Swift应用程序进行代码设计?,ios,swift,xcode6,Ios,Swift,Xcode6,我正在尝试在运行iOS 7.1的真实手机上运行我的Swift应用程序的企业签名版本 如果我通过Xcode界面创建企业签名的应用程序,那么该应用程序就可以完美运行。 如果我在命令行上通过xcodebuild和codesign创建企业签名的应用程序,则该应用程序在打开时崩溃,并显示以下日志: Dyld Error Message: Library not loaded: @rpath/libswiftCore.dylib Referenced from: /var/mobile/Applicatio

我正在尝试在运行iOS 7.1的真实手机上运行我的Swift应用程序的企业签名版本

如果我通过Xcode界面创建企业签名的应用程序,那么该应用程序就可以完美运行。 如果我在命令行上通过xcodebuild和codesign创建企业签名的应用程序,则该应用程序在打开时崩溃,并显示以下日志:

Dyld Error Message:
Library not loaded: @rpath/libswiftCore.dylib
Referenced from: /var/mobile/Applications/96578E7F-7FE6-4603-82F2-8941561225D8/Foo.app/Foo
Reason: no suitable image found.  Did find:
  /private/var/mobile/Applications/96578E7F-7FE6-4603-82F2-8941561225D8/Foo.app/Frameworks/libswiftCore.dylib: code signature invalid for '/private/var/mobile/Applications/96578E7F-7FE6-4603-82F2-8941561225D8/Foo.app/Frameworks/libswiftCore.dylib'
Dyld Version: 324
当我通过命令行创建IPA时,IPA始终包含相同的libswiftCore.dylib

$ md5 cli/Payload/Foo.app/Frameworks/libswiftCore.dylib
MD5 (cli/SwiftSupport/libswiftCore.dylib) = 0fe0370b5585a88a89d230b7501aee31 <- same every time; matches what is provided by Xcode

$ md5 /Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/libswiftCore.dylib
MD5 (/Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/libswiftCore.dylib) = 0fe0370b5585a88a89d230b7501aee31 <- Same!
$ md5 ui/Payload/Foo.app/Frameworks/libswiftCore.dylib
MD5 (ui/Payload/Foo.app/Frameworks/libswiftCore.dylib) = df73f604b1370b19721dfa7de298340f <- different every time
$md5 cli/Payload/Foo.app/Frameworks/libswiftCore.dylib
MD5(cli/SwiftSupport/libswiftCore.dylib)=0fe0370b5585a88a89d230b7501aee31从命令行构建我的Mac应用程序时,我可以通过运行Swift stdlib工具看到Xcode代码签名Swift库:

/Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-stdlib-tool --verbose --copy
Copying libswiftCore.dylib from /.../XcodeDefault.xctoolchain/usr/lib/swift/macosx to /.../LiveReload.app/Contents/Frameworks
... (repeat for 8 libswift*.dylib libraries)
/usr/bin/codesign '--force' '--sign' 'C2F5439B97B16E0BD7FF671913391346B17440DC' '--verbose' '/.../LiveReload.app/Contents/Frameworks/libswiftCore.dylib'
... (repeat for 8 libswift*.dylib libraries)
看起来您可以自己运行类似的代码设计命令


同样,这是针对Mac的,但是如果您为iOS项目运行xcodebuild,您可能会看到为您的项目调用的特定命令。(只需将二进制文件配置为在发行版配置中登录,即您希望它在IPA中登录的方式,包括配置配置文件。)

看起来从Xcode 6 Beta 6开始,您需要手动对Swift库进行代码设计

codesign --force --verbose --sign 'iPhone Distribution: My Company' Foo.app/
codesign --force --verbose --sign 'iPhone Distribution: My Company' Foo.app/Frameworks/*

我已经向苹果公司提交了一份bug报告,如果你使用codesign的
--deep
选项,希望他们能自动做到这一点。

解决方案并不明显,但很简单。苹果在Swift的代码签名过程中做了一些改变:

  • 从开发人员计算机中删除分发证书和配置文件
  • 登录开发人员门户
  • 生成新的生产证书和分发配置文件
  • 在mac上安装这两个软件

错误应该消失。

我创建了一个解决此问题的要点,它很有效

主要思想是首先对dylibs进行代码设计,然后对应用程序进行代码设计

codesign -f -s 'iPhone Distribution: My Company' Foo.app/Frameworks/*
codesign -f -s 'iPhone Distribution: My Company' Foo.app --entitlements=$ENTITLEMENTS_PATH

反之亦然,否则它在安装时会失败

你如何“看到”Xcode在幕后做什么?@NickSnyder(a)当你从命令行运行xcodebuild时,它会把一切都泄漏出来。(b) 您可以使用日志导航器来查看相同的输出,只需反复单击一下即可。@AndreyTarantsov什么是“C2F5439B97B16E0BD7FF671913391346B17440DC”?那是你的身份证吗certificate@ShamsAhmed我不确定,但你可以自己运行一个类似的命令,看看它使用了哪些数字。不幸的是,在这样做之后,使用xcrun-sdk iphoneos PackageApplication-v PATH_TO_APP-o PATH_TO_IPA打包应用程序时,验证代码签名时生成错误:+/usr/bin/codesign--verify-vvv PATH_TO_APP Program/usr/bin/codesign返回1:[路径_TO_APP:密封的资源丢失或无效…]这最终导致应用程序安装失败:已添加、修改或删除已签名的资源。我不使用xcrun。我只是将.app文件夹移动到一个有效负载文件夹中,将其压缩,然后它就可以正常工作了。是的,这样做了。这应该是公认的答案。谢谢卢卡斯!这也解决了我的问题!谢谢卢卡斯!在此过程之后,您可能需要重新启动Mac。这是实际的答案。即使是.dylibs也需要辞职!谢谢