【问题标题】:Can we import .apparchive bundles in Xcode 4我们可以在 Xcode 4 中导入 .apparchive 包吗
【发布时间】:2011-06-30 22:06:11
【问题描述】:

在 Xcode 3 中,应用程序被归档在 .apparchive 文件夹中。

在 Xcode 4 中,应用程序现在存档在 .xcarchive 包中。

有没有办法转换 .xcarchive 包中的 .apparchive 文件夹或使用 Xcode 4 打开 .apparchive 文件夹?

【问题讨论】:

    标签: xcode ios archive


    【解决方案1】:

    Dave Dunkin 的脚本效果很好,但在某些情况下我错过了图标和版本。下面是稍微调整过的脚本版本。 您需要安装 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
    }
    

    【讨论】:

    • CFBundleIconFile 修改是一个好主意,但它并没有像介绍的那样工作。 IconPaths 需要是一个数组,而不是一个字符串。
    • FWIW,您可以通过将第一行更改为“#!/System/Library/PrivateFrameworks/MacRuby.framework/Versions/A/usr/bin/ 来让这个脚本在 Lion 上运行而无需安装任何东西macruby"(不包括外引号)。
    【解决方案2】:

    这是我为自己编写的 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
    }
    

    【讨论】:

    • 你能告诉我们如何使用它吗?我得到“conv.rb:36:语法错误,意外')',期待 kDO_BLOCK”
    • 通过删除“原子地:”确定我在第 3 行“框架”上遇到错误
    • 终于让它工作了(我什至不知道怎么做)但我必须自己做很多工作。事实上,在较旧的档案中,日期被保存为浮点数等等。
    • 脚本需要 MacRuby。我用的是 0.9 版本,不知道它是否适用于早期版本。 @iPortable,听起来你没有使用 MacRuby 或使用旧版本。
    • 谢谢戴夫!我也对您的脚本进行了一些小调整以导入版本号(请参阅我的回答)。 (并且当它在 CFBundleIconFile 而不是 CFBundleIconFiles 时导入图标。)
    【解决方案3】:

    我只是手工完成了一个,所以这绝对是可能的,但是对于不止一两个来说很乏味。有一点时间,有人可以写一个脚本来做到这一点。

    .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.app 所在的Products 文件夹,以及用于保存.dSYM 包的dSYMs 文件夹。

    .apparchive 复制到.xcarchive 的快捷方式:

    1. 使用存档创建日期创建一个新文件夹。
    2. .apparchive 的内容复制到新文件夹中以.xcarchive 结尾的新文件夹中。
    3. cd 进入新的 .xcarchive 文件夹。从现在开始,一切都与此相关。
    4. 创建ProductsdSYMs 文件夹。
    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2015-10-27
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多