如何通过命令行对Swift应用程序进行编码?

Nic*_*der 17 ios swift xcode6

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

如果我通过Xcode界面创建企业签名应用程序,该应用程序将完美运行.如果我通过xcodebuild创建企业签名应用程序并在命令行上进行协同设置,则应用程序在打开时崩溃并显示以下日志:

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
Run Code Online (Sandbox Code Playgroud)

当我通过命令行创建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!
Run Code Online (Sandbox Code Playgroud)

当Xcode的UI产生IPA,很显然,它以某种方式签署或修改libswiftCore.dylib

$ md5 ui/Payload/Foo.app/Frameworks/libswiftCore.dylib
MD5 (ui/Payload/Foo.app/Frameworks/libswiftCore.dylib) = df73f604b1370b19721dfa7de298340f <- different every time
Run Code Online (Sandbox Code Playgroud)

我试过在codesign上使用--deep选项没有运气.

在通过命令行构建/代码签名时,如何让libswiftCore.dylib正确签名?

Nic*_*der 11

看起来像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/*
Run Code Online (Sandbox Code Playgroud)

我已经向Apple提交了一份错误报告,希望如果您使用codesign的--deep选项,它们会自动生成.


小智 8

解决方案并不明显,但很容易.Apple在Swift的代码签名过程中改变了一些东西:

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

错误应该消失了.