2016-10-06 74 views
4

我公司的iOS框架是为了在真正的iOS设备上工作。所述框架目前作为Xcode项目中的附加目标生成,其也生成应用程序。 (这使得调试框架相对容易)。使用Xcode 8创建通用框架?

我们最近也得到了一些要求,以使它在模拟器中也能正常工作。我现在可以做到这一点,下一步就是创建一个可以在真实设备和模拟器上工作的编译版本。可悲的是,我一直无法找到任何材料,指出任何人都使用Xcode 8来做这件事。有些材料解释了如何使用旧版本的Xcode,但是在一个Xcode版本中起作用的东西可能不起作用,或者在稍后版。 (我们已经有了一种创建通用框架的方法。)我尝试使用一些预编译的Xcode 8脚本,但没有一个能够工作。

有没有人设法为使用Xcode 8的iOS生成通用框架?如果是这样,该怎么办?

在此先感谢任何人可以提供的帮助。

亚伦阿德尔曼

+0

这是一个完整的指南,我写在这个问题上:https://eladnava.com/publish-a-universal-binary-ios-framework-in-swift-using-cocoapods/ –

回答

11

这是可能的,因为我目前正在开发的Xcode 8

我这样做,是建立一个总目标(跨平台)的方式在iOS上,watchOS通用框架和tvOS并添加在构建阶段运行脚本。该脚本基本上编译为iphonesimulator iOS的目标和的iPhoneOS

此之后,它会创建一个新的二进制合并两者(脂 - 创建 - 输出)

你介意发布您的当前构建脚本生成一个通用框架所以我可以指导你做错了什么?

考虑到脚本在这里不是你的问题,你的问题可能是设置你的有效体系结构,你的体系结构,甚至你如何签署目标。我现在推荐在未选中目标的常规设置中保留“自动管理签名”选项,并手动设置配置配置文件和证书。

运行脚本:在考虑

#!/bin/sh 

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal 

# make sure the output directory exists 
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}/iOS" 

# Step 1. Build Device and Simulator versions on iOS 
xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' clean build 
xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" -sdk iphoneos clean build 

# Step 2. Copy the framework structure (from iphoneos build) to the universal folder 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/iOS" 

# Step 3. Create universal binary file using lipo and place the combined executable in the copied framework directory 
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/iOS/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" 

# Step 4. Convenience step to copy the framework to the project's directory 
mkdir -p "${TMPDIR}/${PROJECT_NAME}/Frameworks/iOS" 

cp -R "${UNIVERSAL_OUTPUTFOLDER}/iOS/${PROJECT_NAME}.framework" "${TMPDIR}/${PROJECT_NAME}/Frameworks/iOS" 


# Step 6. Create .tar.gz file for posting on the binary repository 
cd "${TMPDIR}" 

# We nest the framework inside a Frameworks folder so that it unarchives correctly 
tar -zcf "${PROJECT_NAME}.framework.tar.gz" "${PROJECT_NAME}/Frameworks/" 
mv "${PROJECT_NAME}.framework.tar.gz" "${PROJECT_DIR}/" 

# Step 7. Convenience step to open the project's directory in Finder 
#open "${PROJECT_DIR}" 

采取我生成有源体系仅设置为NO的生成设置,也有效的架构设置为arm64,x86_64的,I386,ARMv7的,armv7s。架构是$ {ARCHS_STANDARD} armv7s。

我还设置了一个用户定义的构建设置BITCODE_GENERATION_MODE位码。有了这个构建设置,我确保生成启用了位代码的二进制文件。

+0

我没有当前的构建脚本,因为没有人尝试过在Xcode 8中工作。 –

+0

Wo你不介意与你分享你的吗? –

+0

让我知道它是否有效 – iOSAddicted

2

构建的iOS/tvOS通用/脂肪框架

https://github.com/unchartedworks/universalbuild

用法:

universalbuild(-p | --project名。xcodeproj)(-s | --scheme schemename)(-c | --configuration configurationname)

例子:

git clone https://github.com/cruisediary/Pastel.git 
cd Pastel 
universalbuild -p ./Pastel.xcodeproj -s Pastel -c Debug 
+0

看起来很有意思,但是除非它和工作空间一起工作,否则我不能给你一个+1( –

+0

)。不幸的是,它不能像那样工作。我在实现它之前做了一些研究,很多框架项目使用项目而不是工作空间。这就是为什么它只支持Xcode项目。 – UnchartedWorks

1

运行脚本来创建通用框架(没有递归问题)

#!/bin/sh 

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal 

# make sure the output directory exists 
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" 

# Next, work out if we're in SIM or DEVICE 
if [ "false" == ${ALREADYINVOKED:-false} ] 
then 

export ALREADYINVOKED="true" 

if [ ${PLATFORM_NAME} = "iphonesimulator" ] 
then 
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 
else 
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 
fi 

# Step 2. Copy the framework structure (from iphoneos build) to the universal folder 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" 

# Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory 
SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." 
if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then 
cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule" 
fi 

# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory 
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" 

# Step 5. Convenience step to copy the framework to the project's directory 
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}" 

# Step 6. Convenience step to open the project's directory in Finder 
open "${PROJECT_DIR}" 

fi