web-dev-qa-db-fra.com

Créer un cadre universel avec Xcode 8?

La structure iOS de mon entreprise est conçue pour fonctionner sur un véritable appareil iOS. Ce framework est actuellement généré en tant que cible supplémentaire dans un projet Xcode qui génère également une application. (Cela facilite relativement le débogage du framework.)

Nous avons récemment reçu des demandes pour que cela fonctionne également dans le simulateur. Je peux maintenant le faire, et l'étape suivante consiste à créer une version compilée qui fonctionne à la fois sur un périphérique réel et dans le simulateur. Malheureusement, je n'ai trouvé aucun élément indiquant que quelqu'un l'ait utilisé à l'aide de Xcode 8. Il existe des éléments expliquant comment utiliser les anciennes versions de Xcode, mais ce qui fonctionne dans une version de Xcode peut ne pas fonctionner ou ne pas être recommandé ultérieurement. version. (Nous avions déjà une méthode pour créer une rupture de cadre universel sur nous.) J'ai essayé d'utiliser quelques scripts antérieurs à Xcode 8, mais aucun d'entre eux n'a fonctionné.

Quelqu'un a-t-il réussi à générer un framework universel pour iOS avec Xcode 8? Si tel est le cas, comment cela peut-il se faire?

Merci d'avance pour toute aide que n'importe qui peut fournir.

Aaron Adelman

7

C'est possible car je développe actuellement des frameworks universels sur iOS, watchOS et tvOS sur Xcode 8.

Pour ce faire, je crée une cible d'agrégat (multiplateforme) et ajoute un script d'exécution dans sa phase de construction. Le script compile essentiellement la cible iOS pour iphonesimulator et iphoneos

Après cela, il crée un nouveau binaire fusionnant les deux (lipo -create-output)

Souhaitez-vous afficher votre script de construction actuel pour générer un cadre universel afin que je puisse vous guider avec ce que vous faites mal? 

Prenez en considération que le script ne peut pas être votre problème ici, votre problème pourrait être de configurer vos architectures valides, vos architectures ou même la façon dont vous signez la cible. Je vous recommande pour l’instant de ne pas cocher l’option Gérer automatiquement la signature dans les paramètres généraux de votre cible et de définir manuellement vos profils de provisioning et vos certificats.

Script de lancement:

    #!/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}"

Prenez en compte le fait que je règle l’architecture active de construction uniquement sur NON dans les paramètres de construction. Les architectures valides sont également définies comme arm64, x86_64, i386, armv7, armv7s. Les architectures sont des armv7 $ {ARCHS_STANDARD}.

J'ai également défini un paramètre de construction défini par l'utilisateur BITCODE_GENERATION_MODE bitcode. Avec ce paramètre de construction, je m'assure de générer des fichiers binaires avec le bitcode activé. 

16
iOSAddicted

construire un framework iOS/tvOS universal/fat

https://github.com/unchartedworks/universalbuild

Utilisation:

universalbuild (-p | --nom_projet.xcodeproj) (-s | --scheme schemename) (-c | --configuration nom_configuration)

Exemple:

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

Exécuter le script pour créer un cadre universel (pas de problème de récursivité) 

#!/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
1
Himanshu Mahajan

Moi aussi j'ai lutté avec le même problème. J'avais une série de cocoapodes qui servaient de cosses sources, mais qui devaient être convertis en cosses binaires. Entre beaucoup de recherches sur Google, d’essais et d’erreur et de piratage informatique, j’ai créé un script avec lequel j’ai eu un grand succès. Il est basé sur les scripts que vous voyez ici, mais refactored dans des fonctions et une sortie de débogage (qui va dans les journaux dans/tmp) quand il manque quelque chose.

Ce script peut être trouvé en tant que github Gist ici: https://Gist.github.com/intere/bc380fa45ccf23976d3fc297522d29a8

FWIW, j'utilise Xcode 9 (9.2, puis 9.3 et maintenant 9.4).

0
Eric Internicola