我正在尝试在运行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
当我通过命令行创建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!
当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
我尝试在代码签名上使用--deep选项但没有运气。
如何在通过命令行构建/代码签名时让libswiftCore.dylib正确签名?
答案 0 :(得分: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/*
我已经向Apple提交了一份错误报告,希望如果您使用codeign的--deep
选项,他们会自动生成此错误。
答案 1 :(得分:8)
解决方案并不明显,但很容易。 Apple在Swift的代码签名过程中改变了一些东西:
错误应该消失。
答案 2 :(得分:3)
我创建了一个解决这个问题的要点,并且它有效(->link)。
主要思想是对dylibs frist进行编码,然后对应用程序进行编码。
答案 3 :(得分:2)
codesign -f -s 'iPhone Distribution: My Company' Foo.app/Frameworks/*
codesign -f -s 'iPhone Distribution: My Company' Foo.app --entitlements=$ENTITLEMENTS_PATH
不是相反,否则安装失败
答案 4 :(得分:0)
从命令行构建我的 Mac 应用程序时,我可以通过运行swift-stdlib-tool看到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)
看起来您可以自己运行类似的codeign命令。
此外,这适用于Mac,但也许如果您为iOS项目运行xcodebuild,您将看到为您的项目调用的特定命令。 (只需按照您在IPA中签名的方式配置要在发布配置中签名的二进制文件,包括配置文件。)