Можем ли мы импортировать пакеты .apparchive в Xcode 4

В Xcode 3 приложения были заархивированы в папках .apparchive.

В Xcode 4 приложения теперь архивируются в пакете .xcarchive.

Есть ли способ конвертировать папки .apparchive в пакеты .xcarchive или открывать папки .apparchive с Xcode 4?

Сценарий Дейва Дункина отлично поработал, но в некоторых случаях я пропустил значок и версию. Ниже немного скорректированная версия скрипта. Вам необходимо установить MacRuby, доступный здесь: http://www.macruby.org/downloads.html .

#!/System/Library/PrivateFrameworks/MacRuby.framework/Versions/A/usr/bin/macrub‌​y framework 'Cocoa' require 'date' require 'fileutils' Dir.glob(Dir.home() + '/Library/Application Support/Developer/Shared/Archived Applications/*.apparchive').each { |apparchivePath| print "Found archive at #{apparchivePath}... " archiveInfo = NSDictionary.dictionaryWithContentsOfURL(NSURL.fileURLWithPath(apparchivePath + '/ArchiveInfo.plist')) name = archiveInfo['XCUserProvidedName'] || archiveInfo['XCApplicationName'] appFilename = archiveInfo['XCApplicationFilename'] appPath = 'Applications/' + appFilename archiveDate = archiveInfo['XCArchivedDate'] xcarchivePath = Dir.home() + '/Library/Developer/Xcode/Archives/' + archiveDate.strftime('%Y-%m-%d') + '/' + name + ' ' + archiveDate.strftime('%m-%d-%y %I.%M %p') + '.xcarchive' appVersion = archiveInfo['CFBundleVersion'] iconPaths = archiveInfo['XCInfoPlist']['CFBundleIconFiles'] if not iconPaths iconPaths = appPath + '/' + archiveInfo['XCInfoPlist']['CFBundleIconFile'] else iconPaths = archiveInfo['XCInfoPlist']['CFBundleIconFiles'].collect { |f| appPath + '/' + f } end if File.directory?(xcarchivePath) puts 'skipping' else puts 'importing' FileUtils.mkdir_p(xcarchivePath) xcarchiveInfo = { 'ApplicationProperties' => { 'ApplicationPath' => appPath, 'CFBundleIdentifier' => archiveInfo['CFBundleIdentifier'], 'CFBundleShortVersionString' => appVersion, 'IconPaths' => iconPaths }, 'ArchiveVersion' => 1, 'CreationDate' => archiveDate, 'Name' => name, 'SchemeName' => archiveInfo['XCApplicationName'] } if archiveInfo.has_key?('XCUserProvidedComment') xcarchiveInfo['Comment'] = archiveInfo['XCUserProvidedComment'] end xcarchiveInfo.writeToURL(NSURL.fileURLWithPath(xcarchivePath + '/Info.plist'), atomically:false) FileUtils.mkdir_p(xcarchivePath + '/Products/Applications') FileUtils.cp_r(apparchivePath + '/' + appFilename, xcarchivePath + '/Products/Applications') FileUtils.mkdir_p(xcarchivePath + '/dSYMs') FileUtils.cp_r(apparchivePath + '/' + appFilename + '.dSYM', xcarchivePath + '/dSYMs') end } 

Вот сценарий MacRuby, который я написал, чтобы сделать это для меня.

 #!/usr/local/bin/macruby framework 'Cocoa' require 'date' require 'fileutils' Dir.glob(Dir.home() + '/Library/Application Support/Developer/Shared/Archived Applications/*.apparchive').each { |apparchivePath| print "Found archive at #{apparchivePath}... " archiveInfo = NSDictionary.dictionaryWithContentsOfURL(NSURL.fileURLWithPath(apparchivePath + '/ArchiveInfo.plist')) name = archiveInfo['XCUserProvidedName'] || archiveInfo['XCApplicationName'] appFilename = archiveInfo['XCApplicationFilename'] appPath = 'Applications/' + appFilename archiveDate = archiveInfo['XCArchivedDate'] xcarchivePath = Dir.home() + '/Library/Developer/Xcode/Archives/' + archiveDate.strftime('%Y-%m-%d') + '/' + name + ' ' + archiveDate.strftime('%m-%d-%y %I.%M %p') + '.xcarchive' if File.directory?(xcarchivePath) puts 'skipping' else puts 'importing' FileUtils.mkdir_p(xcarchivePath) xcarchiveInfo = { 'ApplicationProperties' => { 'ApplicationPath' => appPath, 'CFBundleIdentifier' => archiveInfo['CFBundleIdentifier'], 'IconPaths' => archiveInfo['XCInfoPlist']['CFBundleIconFiles'].collect { |f| appPath + '/' + f } }, 'ArchiveVersion' => 1, 'CreationDate' => archiveDate, 'Name' => name, 'SchemeName' => archiveInfo['XCApplicationName'] } if archiveInfo.has_key?('XCUserProvidedComment') xcarchiveInfo['Comment'] = archiveInfo['XCUserProvidedComment'] end xcarchiveInfo.writeToURL(NSURL.fileURLWithPath(xcarchivePath + '/Info.plist'), atomically:false) FileUtils.mkdir_p(xcarchivePath + '/Products/Applications') FileUtils.cp_r(apparchivePath + '/' + appFilename, xcarchivePath + '/Products/Applications') FileUtils.mkdir_p(xcarchivePath + '/dSYMs') FileUtils.cp_r(apparchivePath + '/' + appFilename + '.dSYM', xcarchivePath + '/dSYMs') end } 

Я просто сделал это вручную, так что это определенно возможно, но утомительно для более чем одного или двух. Некоторое время кто-то мог написать сценарий для этого.

.xcarchive bundles – это просто каталоги, такие как .apparchive bundles перед ними. Более новый формат перемещал некоторые вещи и упрощал Info.plist верхнего уровня.

Xcode 3 хранит архивы в ~/Library/Application Support/Developer/Shared/Archived Applications . Отдельные пакеты архивов называются GUID. Внутри каждого находится ArchiveInfo.plist , фактический пакет .dSYM пакет .dSYM .

Xcode 4 хранит архивы в ~/Library/Developer/Xcode/Archives , разделенные на папки с именем после создания архива. В пределах каждой папки с датой находится пакет .xcarchive , используя считываемое имя вместо GUID. Внутри него находится Info.plist , Info.plist Products которой находится .app , и папка dSYMs для хранения пакетов .dSYM .

Быстрый и грязный способ скопировать .apparchive в .xcarchive :

  1. Создайте новую папку с датой создания архива.
  2. Скопируйте содержимое .apparchive в новую папку, заканчивающуюся на .xcarchive внутри этой новой папки.
  3. cd в эту новую папку .xcarchive . Все относительно этого с этого момента.
  4. Создать Products и папки dSYMs .
  5. Переместите пакет .app в Products .
  6. Переместите пакет dSYMs в dSYMs .
  7. Удалите старый файл ArchiveInfo.plist .
  8. Создайте новый Info.plist который выглядит так, подставляя соответственно.

(заканчивая список, поэтому StackOverflow форматирует XML правильно …)

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>ApplicationProperties</key> <dict> <key>ApplicationPath</key> <string>AppBundleName.app</string> <key>CFBundleIdentifier</key> <string>com.example.app-id</string> <key>IconPaths</key> <array> <string>AppBundleName.app/Icon.png</string> <string>AppBundleName.app/Icon-Small.png</string> </array> </dict> <key>ArchiveVersion</key> <real>1</real> <key>CreationDate</key> <date>2010-12-15T15:10:34Z</date> <!-- this is a GMT time stamp --> <key>Name</key> <string>AppName</string> <key>SchemeName</key> <string>AppName</string> </dict> </plist> 
  • Xcode: создание автоматического комментария к архиву
  • Xcode 4 Архивная сборка не находит импорт в предварительно скомпилированных заголовках
  • Представление приложения в App Store
  • Interesting Posts

    Получить сертификацию TestFlight и символику сбоев для приложений Swift

    Как показать табличное представление, когда пользователь забирает строку поиска

    как делиться константами (перечислениями) между классами?

    Как быстро настроить контроллер просмотров на один из предыдущих контроллеров представления?

    Как обнаружить прозрачную область в изображении?

    Ошибка выделения / освобождения Objective C

    Как сократить время утверждения App Store

    Воспроизведение видео iOS с помощью MPMoviePlayerController

    Панели JASide, не отображающие навигационную кнопку

    Как взять NSString после определенного символа, который происходит несколько раз в NSString?

    UIScrollView с несколькими страницами, видимыми или меньшими размерами страниц

    Есть ли SDK для рисования линий на iOS с прикосновением?

    animateWithDuration не работает внутри метода делегирования GMSMapView

    Модальный интерфейс Viewcontroller не реагирует после presentViewController: анимированный: завершение:

    Можно ли получить тип кредитной карты, используя card.io?

    Давайте будем гением компьютера.