带应用商店证书的iOS Resigning企业IPA

时间:2019-07-26 06:43:13

标签: ios app-store fastlane

我需要找到一种使黑匣子重新工作的方法,最好是不需要在辞职期间替换虚拟AppStore分发证书。

背景说明:

我们有一个设置,其中另一个部门可以执行辞职工作,该工作可以接收IPA,并使用其自己的证书和置备配置文件将其辞职,并设置适当的捆绑包标识符。

此辞职工作的输入.ipa文件以前是使用 app-store 导出方法以及另一个AppStore分发证书和相应的配置文件构建的。这样就可以毫无问题地上传输出的.ipa文件。

在执行辞职替换证书时,是否有可能完全为 enterprise 导出方法构建置备配置文件和捆绑包标识符,并且是否只要替换掉他们就辞职了?< / strong>

尝试将已签名的.ipa文件上传到AppStore时会出错。

  

ITMS-90426:无效的Swift支持-SwiftSupport文件夹丢失。使用当前的Xcode公共(GM)版本重建您的应用,然后重新提交。

我认为这是由于导出方法所致,因为其余的构建配置是相同的(尽管使用了适当的证书和配置文件) 尝试使用企业证书进行初始签名的原因是,输入开发人员程序应已淘汰。

2 个答案:

答案 0 :(得分:1)

我创建了一个脚本,该脚本会将SwiftSupport文件夹添加到丢失的.ipa文件夹(即为企业发行版生成的文件夹):

#!/bin/bash

for ARGUMENT in "$@"
do

    KEY=$(echo $ARGUMENT | cut -f1 -d=)
    VALUE=$(echo $ARGUMENT | cut -f2 -d=)

    case "$KEY" in
            ipa_path)          ipaPath=${VALUE} ;; # Format: "Path/to/app.ipa"
            archive_path)      archivePath=${VALUE} ;; # Format: "Path/to/app.xcarchive"
            toolchain_path)    toolchainPath=${VALUE} ;; # Format: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos"
            *)
    esac

done

# Derived Variables
ipaDirectory=$(dirname "$ipaPath")
ipaName=$(basename "$ipaPath")
zipName=${ipaName/.ipa/.zip}
appName=${ipaName/.ipa/}
zipSuffix=-unzipped
unzippedDirectoryName=${appName}${zipSuffix}
newIpaSuffix=-with-swift-support
newIpaName=${appName}${newIpaSuffix}
swiftSupportPath=SwiftSupport/iphoneos
ipaSwiftSupportDirectory=${ipaDirectory}/${unzippedDirectoryName}/${swiftSupportPath}

# Changes the .ipa file extension to .zip and unzips it
function unzipIPA {
    mv "${ipaDirectory}/${ipaName}" "${ipaDirectory}/${zipName}"
    unzip "${ipaDirectory}/${zipName}" -d "${ipaDirectory}/${unzippedDirectoryName}"
}

# Copies the SwiftSupport folder from the .xcarchive into the .ipa
function copySwiftSupportFromArchiveIntoIPA {
    mkdir -p "$ipaSwiftSupportDirectory"
    cd "${archivePath}/${swiftSupportPath}"
    for file in *.dylib; do
        cp "$file" "$ipaSwiftSupportDirectory"
    done
}

# Creates the SwiftSupport folder from the Xcode toolchain and copies it into the .ipa
function copySwiftSupportFromToolchainIntoIPA {
    mkdir -p "$ipaSwiftSupportDirectory"
    cd "${ipaDirectory}/${unzippedDirectoryName}/Payload/${appName}.app/Frameworks"
    for file in *.dylib; do
      cp "${toolchainPath}/${file}" "$ipaSwiftSupportDirectory"
    done
}

# Adds the SwiftSupport folder from one of two sources depending on the presence of an .xcarchive
function addSwiftSupportFolder {
  if [ -z "$archivePath" ]
  then
    copySwiftSupportFromToolchainIntoIPA
  else
    copySwiftSupportFromArchiveIntoIPA
  fi
}

# Zips the new folder back up and changes the extension to .ipa
function createAppStoreIPA {
    cd "${ipaDirectory}/${unzippedDirectoryName}"
    zip -r "${ipaDirectory}/${newIpaName}.zip" ./*
    mv "${ipaDirectory}/${newIpaName}.zip" "${ipaDirectory}/${newIpaName}.ipa"
}

# Renames original .ipa and deletes the unzipped folder
function cleanUp {
    mv "${ipaDirectory}/${zipName}" "${ipaDirectory}/${ipaName}"
    rm -r "${ipaDirectory}/${unzippedDirectoryName}"
}

# Execute Steps
unzipIPA
addSwiftSupportFolder
createAppStoreIPA
cleanUp

它也可以作为要点:https://gist.github.com/adamzarn/6bb89d91ed4b8c3d3fb25363c221441f

用法:

  1. 将脚本复制到文本编辑器中并保存,不带扩展名
  2. 使其可执行,例如:chmod +x path/to/script
  3. 以两种方式之一在终端上运行它:
  • path/to/script ipa_path="path/to/ipa" archive_path="path/to/xcarchive"
  • path/to/script ipa_path="path/to/ipa" toolchain_path="path/to/toolchain"

如果您有权访问生成.xcarchive的{​​{1}},则脚本将从那里获取.ipa文件夹。否则,它将通过查看SwiftSupport文件来确定需要哪个.dylib文件,然后从Xcode工具链中生成一个.app文件夹。

如果使用的是Xcode工具链,请确保提供的路径包含SwiftSupport文件列表。这是一个示例路径:

.dylib

对于Xcode 10,该路径包含一个/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos 文件夹,但是对于Xcode 11,则必须使用swift

我已经对此进行了测试,它可以成功解决Apple在App Store中分发时引发的Invalid Swift Support错误,而没有任何负面影响。

答案 1 :(得分:0)

当您的二进制缺少swift支持文件夹时,会出现此错误。当我尝试为iOS构建Chrome应用程序时遇到了相同的错误。解决方案并不容易,您需要自己嵌入文件夹。首先,您需要检查您在第三方中使用的Swift库,例如libxswiftCore.dylib

在该文件夹下创建名称为 SwiftSupport 的文件夹,创建 iphoneos 文件夹,将所有必需的dylib文件放入该文件夹中,确保这些dylib文件应由全球苹果公司签署证书,而不是您自己的证书。之后,再创建一个文件夹Payload并将您的.app文件放入其中。确保SwiftSupport和Payload应该在同一层次结构上。确保您的zip文件中不应包含.DS_Store文件,请删除这些文件。我为此工作创建了一个脚本,但是为该公司财产创建了一个脚本,请让我知道这是否仍然无法解决。或者您可以给我写电子邮件。 mshauket.developer@gmail.com