从脚本生成构建时,IPA 中不包含 SwiftSupport 文件夹

Posted

技术标签:

【中文标题】从脚本生成构建时,IPA 中不包含 SwiftSupport 文件夹【英文标题】:SwiftSupport folder not included in the IPA when generating build from script 【发布时间】:2020-06-29 10:17:45 【问题描述】:

该项目在 Objective-C 中,我们最近在其中添加了一些 swift 文件。它是一个白标应用程序,构建是从服务器生成的。

当我将构建提交到应用商店时,它给出了错误:-

ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it.

当我调试问题时,我发现自动化生成的构建现在在 IPA 中具有 SwiftSupport,而当我从系统生成构建时确实具有 IPA

我不能在这里发布整个脚本,因为它确实包含重要信息并且我不允许分享它,但这里有一些带有一些预定义变量的 sn-p :-

function xc_package

    echo "Building scheme \"$3\" => $1"
    
    # Calculated paths
    
    APP_IPA="$1/$APPNAME.ipa"
    APP_APP="$1/$APPNAME.app"
    APP_DSYM="$1/$APPNAME.app.dSYM"
    APP_DSYM_ZIP="$1/$APPNAME.dSYM.zip"
    PROFILE="$4"
    UUID=`uuid_from_profile "$PROFILE"`

    [ -n "$UUID" ] || failed "Failed - missing provisioning profile UUID"
    echo "Building with Provisioning Profile $UUID ($PROFILE)"
    
    # Unlock keychain
        
    echo "Unlocking keychain..."
     security unlock-keychain -p "$BUILD_KEYCHAIN_PW" "$HOME/Library/Keychains/login.keychain" || failed "Failed unlocking keychain"

        
    # xcodebuild
    XCODE_VERSION=`xcodebuild -version`
    XCODE_PATH=`xcode-select -p`
    echo "Building with $XCODE_VERSION in $XCODE_PATH profile : $UUID"

    export LC_CTYPE=en_US.UTF-8

    echo "xcodebuild -> -scheme $3 -> clean build ->  CONFIGURATION_BUILD_DIR -> $1 PROVISIONING_PROFILE_SPECIFIER -> $UUID CODE_SIGN_IDENTITY -> $5"

#-workspace "Motto_Mobile_New.xcworkspace" \
#-configuration Release

    xcodebuild \
    -scheme "$3" \
    -configuration Release \
    clean build \
    CONFIGURATION_BUILD_DIR="$1" \
    PROVISIONING_PROFILE_SPECIFIER="$UUID" \
    CODE_SIGN_IDENTITY="$5" | xcpretty || failed "Failed building"


    # Package IPA
    echo "Packaging IPA..."
    xcrun -sdk iphoneos \
    PackageApplication "$APP_APP" \
    -o "$APP_IPA" \
    --embed "$PROFILE" || failed "Failed packaging"
    
    # Zip dSYM
    echo "Zipping .dSYM..."
    zip -qr "$APP_DSYM_ZIP" "$APP_DSYM"
        
    echo "Generating Symbols and repackaging IPA..."
    
    SYMBOLS="$(xcode-select -p)/usr/bin/symbols"
    IPA_DIR="$1/IPA_TMP"
    
    rm -R "$IPA_DIR"
    
    unzip -q "$APP_IPA" -d "$IPA_DIR"
    
    
    mkdir -p "$IPA_DIR/Symbols"
    
    echo "$BUILD_KEYCHAIN_PW" | sudo -S $SYMBOLS -noTextInSOD -noDaemon -arch all \
    -symbolsPackageDir "$IPA_DIR/Symbols" \
    "$IPA_DIR/Payload/$APPNAME.app/$APPNAME"
    
    
    cd "$IPA_DIR" && zip -qr "$APP_IPA" .

已使用这些参数调用此函数

xc_package \
"$current_path/build" \
"'preprocess_defines'" \
"Motto_Mobile_New" \
"$profile_fullpath" \
"$certificate_name"

cd $current_path
cp "build/$APPNAME.ipa" "build/$file_name.ipa"

cp "build/$file_name.ipa" "/$resourceDirPath/$file_name.ipa"

【问题讨论】:

【参考方案1】:

在您的PackageApplication 步骤之后,您应该有一个.xcarchive 和一个.ipa。我无法确定为什么您的原始 .ipa 中没有 SwiftSupport 文件夹(在我的情况下,这是因为它是为 enterprise 分发导出的),但您应该能够只复制 @ 987654327@ 文件夹从.xcarchive 到您解压后的.ipa,在unzip 步骤之后:

unzip -q "$APP_IPA" -d "$IPA_DIR"

# Copies the SwiftSupport folder from the .xcarchive into the .ipa
mkdir -p "$IPA_DIR/SwiftSupport/iphoneos"
cd "$archivePath/SwiftSupport/iphoneos"
for file in *.dylib; do
    cp "$file" "$IPA_DIR/SwiftSupport/iphoneos"
done

您也可以像这样使用 Xcode 工具链创建SwiftSupport 文件夹:

# Creates the SwiftSupport folder from the Xcode toolchain and copies it into the .ipa
mkdir -p "$IPA_DIR/SwiftSupport/iphoneos"
cd "$IPA_DIR/Payload/$appName.app/Frameworks"
for file in *.dylib; do
  cp "$toolchainPath/$file" "$IPA_DIR/SwiftSupport/iphoneos"
done

这会在.app/Frameworks 文件夹中查看哪些.dylib 文件应该在SwiftSupport 文件夹中。

对于 Xcode 11,这应该是工具链路径:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos

【讨论】:

非常感谢@Adam Zarn 的帮助,我仍然无法让它工作。我也不知道为什么它没有 SwiftSupport 文件夹。当手动生成构建时,它会成功并在其中包含 SwiftSupport 文件夹,我认为问题在于构建脚本。我正在添加有关脚本的更多信息。 .xcarchive 中是否存在 SwiftSupport 文件夹? 服务器上的脚本是旧的并且使用PackageApplication。我对 PackageApplication 不太熟悉,我认为您建议的 $archivePath 是针对 xcodebuild 命令的,对吧? 存档路径只是生成.ipa的.xcarchive文件的路径,应该在xcodebuild步骤中生成 我不认为 archivePath 是可访问的

以上是关于从脚本生成构建时,IPA 中不包含 SwiftSupport 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

通过Shell脚本生成IPA

如何从 xcode bot 生成 .ipa?

来自 build.phonegap.com 的 .ipa 文件在 iPhone 中不起作用

iTunes连接从xcode 8上传的无效构建

OTA AdHoc 分发 - 如何从命令行构建 IPA?

从 xcode 命令行生成 ipa