将iOS框架分配为文件或窗格

我尝试从客户端添加一个我们必须在我们的产品中使用的框架,并将其作为文件分发。

我面临的问题是,框架不能与模拟器一起工作,当我想使用模拟器时,我必须使用框架的debugging版本。 但是当我们发布到应用程序商店时,debugging版本不能被包含,他们会拒绝他们说。

当我谷歌这个问题,看起来像苹果不允许这种框架。 或者最近这个变化了吗?

我也find关于所谓的FAT框架的信息,是新的东西?

我试图在apple.com上find关于此的信息,但是我还没有find任何解释情况的信息。

当我使用像分布式作为吊舱的Firebase框架时,我没有这个问题。

这些框架有什么区别? 客户端可以在框架中做什么,以便可以在模拟器和app store中使用它?

当我谷歌这个问题,看起来像苹果不允许这种框架。 或者最近这个变化了吗?

它的工作方式是,苹果不允许模拟器二进制文件(x86_64和i386)上传到应用程序商店。

我也find关于所谓的FAT框架的信息,是新的东西?

FAT框架并不新鲜。 它们基本上是一个FAT二进制文件的包装。 FAT二进制文件包含多种体系结构。

当我使用像分布式作为吊舱的Firebase框架时,我没有这个问题。

他们没有这个问题,因为他们分布为豆荚。 这些框架具有FAT二进制文件,即包含Device(armv7,arm64)和Simulator(i386,x86_64)。 然后真正的魔法发生在Cocoapods的最后。 Cocoapods使用构build时间脚本去除不必要体系结构的二进制文件。

你可以通过使用和cocoapods相同的脚本来完成你的框架。

#!/bin/sh set -e echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" install_framework() { if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then local source="${BUILT_PRODUCTS_DIR}/$1" elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" elif [ -r "$1" ]; then local source="$1" fi local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" if [ -L "${source}" ]; then echo "Symlinked..." source="$(readlink "${source}")" fi # use filter instead of exclude so missing patterns dont' throw errors echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" local basename basename="$(basename -s .framework "$1")" binary="${destination}/${basename}.framework/${basename}" if ! [ -r "$binary" ]; then binary="${destination}/${basename}" fi # Strip invalid architectures so "fat" simulator / device frameworks work on device if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then strip_invalid_archs "$binary" fi # Resign the code if required by the build settings to avoid unstable apps code_sign_if_enabled "${destination}/$(basename "$1")" # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then local swift_runtime_libs swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) for lib in $swift_runtime_libs; do echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" code_sign_if_enabled "${destination}/${lib}" done fi } # Signs a framework with the provided identity code_sign_if_enabled() { if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then code_sign_cmd="$code_sign_cmd &" fi echo "$code_sign_cmd" eval "$code_sign_cmd" fi } # Strip invalid architectures strip_invalid_archs() { binary="$1" # Get architectures for current file archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" stripped="" for arch in $archs; do if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 stripped="$stripped $arch" fi done if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi } 

只要将你的框架传递给install_framework方法如下:

 install_framework "$BUILT_PRODUCTS_DIR/BadgeSwift/BadgeSwift.framework"