Можем ли мы импортировать пакеты .apparchive в Xcode 4 - PullRequest
11 голосов
/ 21 февраля 2011

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

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

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

Ответы [ 3 ]

11 голосов
/ 11 марта 2011

Сценарий Дэйва Данкина работал отлично, но в некоторых случаях я пропускал значок и версию. Ниже немного скорректированная версия скрипта. Вам необходимо установить 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
}
5 голосов
/ 09 марта 2011

Вот скрипт 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
}
3 голосов
/ 07 марта 2011

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

Пакеты

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

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

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

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

  1. Создать новую папку с датой создания архива.
  2. Скопируйте содержимое .apparchive в новую папку, заканчивающуюся .xcarchive внутри этой новой папки.
  3. cd в эту новую папку .xcarchive. С этого момента все относительно.
  4. Создание папок Products и dSYMs.
  5. Переместите .app связку в Products.
  6. Переместите .dSYM связку в 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>
...