【问题标题】:How do I codesign a Swift app via the commandline?如何通过命令行对 Swift 应用程序进行代码设计?
【发布时间】:2016-06-13 17:40:46
【问题描述】:

我正在尝试在运行 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!

当 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

我尝试在 codesign 上使用 --deep 选项,但没有成功。

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

【问题讨论】:

    标签: ios swift xcode6


    【解决方案1】:

    从 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 提交了一份错误报告,希望如果您使用 codesign 的 --deep 选项,他们会自动实现这一点。

    【讨论】:

    • 不幸的是,在这样做之后,当使用 xcrun -sdk iphoneos PackageApplication -v PATH_TO_APP -o PATH_TO_IPA 打包应用程序时,验证代码签名时会产生错误:+ /usr/bin/codesign --verify -vvvv PATH_TO_APP Program /usr/bin/codesign 返回 1 : [PATH_TO_APP: a seal resource is missing or invalid ... ] 这最终导致应用安装失败:已添加、修改或删除已签名资源。
    • 我不使用 xcrun。我只是将 .app 文件夹移动到 Payload 文件夹,然后将其压缩,它可以正常工作。
    【解决方案2】:

    解决方案并不明显,但很容易。 Apple 更改了 Swift 代码签名过程中的一些内容:

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

    错误应该消失了。

    【讨论】:

    • 是的,它做到了。这应该是公认的答案。谢谢卢卡斯!
    • 这也为我解决了问题!谢谢卢卡斯!
    • 在此过程之后您可能需要重新启动 Mac。
    【解决方案3】:

    我创建了一个要点来解决这个问题,它可以工作(->link)

    主要思想是先对 dylibs 进行代码签名,然后再对应用程序进行代码签名。

    【讨论】:

      【解决方案4】:
      codesign -f -s 'iPhone Distribution: My Company' Foo.app/Frameworks/*
      codesign -f -s 'iPhone Distribution: My Company' Foo.app --entitlements=$ENTITLEMENTS_PATH
      

      反之不行,否则会安装失败

      【讨论】:

      • 这是实际答案。甚至 .dylibs 也需要辞职!谢谢!
      【解决方案5】:

      从命令行构建我的 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)
      

      看起来你可以自己运行类似的代码设计命令。

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

      【讨论】:

      • 你如何“看到” Xcode 在幕后做了什么?
      • @NickSnyder (a) 当你从命令行运行 xcodebuild 时,它会直接溢出。 (b) 您可以使用日志导航器查看相同的输出,经过一些复杂的点击后。
      • @AndreyTarantsov 什么是“C2F5439B97B16E0BD7FF671913391346B17440DC”?是你的证书idid
      • @ShamsAhmed 我不确定,但你可以自己运行一个类似的命令,看看它使用了哪些数字。
      猜你喜欢
      • 1970-01-01
      • 2021-12-09
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多