My company's iOS framework is meant to work on a real iOS device. Said framework is currently generated as an additional target within a Xcode project which also generates an application. (This makes it relatively easy to debug the framework.)
We recently got requests to also make it work in the simulator, too. I can now make it do so, and the next step is to create a compiled version which works both on a real device and in the simulator. Sadly, I have not been able to locate any material indicating that anyone has done this using Xcode 8. There are materials explaining how do using older versions of Xcode, but what works in one version of Xcode may not work or be advisable in a later version. (We already had one method of creating a universal framework break on us.) I tried using a few pre-Xcode 8 scripts, but none of them worked.
Has anyone managed to generate a universal framework for iOS using Xcode 8? If so, how can it be done?
Thanks in advance for any help anyone can provide.
Aaron Adelman
It is possible since I am currently developing universal frameworks on iOS, watchOS and tvOS on Xcode 8.
The way I do it is creating an Aggregate target(cross platform) and add a run script in its build phase. The script basically compiles the iOS target for iphonesimulator and iphoneos
After this it creates a new binary merging both of them(lipo -create -output)
Would you mind posting your current build script for generating a universal framework so I can guide you with what you are doing wrong?
Take in consideration that the script could not be your issue here, your issue could be setting up your valid architectures, your architectures or even how you are signing the target. I recommend for now, to leave the Automatically manage signing option in your General settings of your target unchecked, and set your provisioning profiles and certs manually.
Run script:
#!/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}"
Take in consideration that I set the Build Active Architecture Only to NO in the build settings, also the valid Architectures are set as arm64, x86_64, i386, armv7, armv7s. The Architectures are ${ARCHS_STANDARD} armv7s.
I also set a user defined build setting BITCODE_GENERATION_MODE bitcode. With this build setting I make sure to generate binaries with bitcode enabled.
build iOS/tvOS universal/fat framework
https://github.com/unchartedworks/universalbuild
Usage:
universalbuild (-p|--project name.xcodeproj) (-s|--scheme schemename) (-c|--configuration configurationname)
Example:
git clone https://github.com/cruisediary/Pastel.git
cd Pastel
universalbuild -p ./Pastel.xcodeproj -s Pastel -c Debug
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With