Подтвердить что ты не робот

Как я могу кодировать приложение Swift через командную строку?

Я пытаюсь запустить корпоративную подписанную сборку моего приложения Swift на реальном телефоне под управлением iOS 7.1.

Если я создаю подписанное корпорацией приложение через интерфейс Xcode, приложение работает отлично. Если я создаю подписанное корпорацией приложение через xcodebuild и codeign в командной строке, приложение отключится при открытии со следующим журналом:

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 создает 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 для правильной подписки при создании/кодовом кодировании через командную строку?

4b9b3361

Ответ 1

Решение не очевидно, но легко. Apple изменила что-то в процессе подписи кода для Swift:

  • Удалите сертификат распространения и профиль обеспечения с вашей машины разработчика.
  • Войдите в портал разработчика
  • создать новый производственный сертификат и профилирование распределения
  • Установите оба на вашем Mac

Ошибка должна исчезнуть.

Ответ 2

Похоже, что с 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.

Ответ 3

Я создаю суть для решения этой проблемы, и она работает (- > link).

Основная идея состоит в том, чтобы кодировать dylibs frist, а затем кодировать приложение.

Ответ 4

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

не наоборот, иначе он не сможет установить

Ответ 5

При создании моего приложения Mac из командной строки я могу видеть библиотеки Swift, кодирующие код Xcode, запустив инструмент swift-stdlib:

/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, но, возможно, если вы запустите xcodebuild для своего проекта iOS, вы увидите конкретные команды, которые вызывают для вашего проекта. (Просто настройте двоичный файл, который будет подписан в конфигурации Release, так, как вы хотели бы его подписали в вашей IPA, включая профиль подготовки.)