web-dev-qa-db-fra.com

Extensions iOS avec plusieurs cibles

Dans iOS 8, lorsque nous créons une nouvelle extension, nous devons décider à quelle cible elle est attachée. L'extension aura le même préfixe d'ID de bundle que la cible.

  1. Y a-t-il un moyen de changer la cible par la suite?
  2. Si mon projet contient 2 (ou plus) cibles (par exemple une pour le débogage/le simulateur, une pour la production/l'appareil), quelle est la meilleure façon de travailler avec des extensions? Dois-je créer une autre extension et dupliquer le code (très gênant pour garder le même code pour les deux cibles)?
37
Enzo Tran

Pour partager un widget entre plusieurs cibles, il suffit d’ajouter une cible widget.appex à Embedded Binaries pour chaque cible parent dans General onglet de configuration

enter image description here

Ensuite, vous obtiendrez Embed App Extensions zone à Build Phases automatiquement

enter image description here

28
malex

Voici ma configuration: j'ai 3 cibles (production, staging, local) et une cible d'extension que je ne veux pas dupliquer 3 fois.

Juste pour clarifier la réponse de Neo Chen , modifiez chacun des schémas de vos cibles parentales:

Générer> Pré-actions> Nouvelle action de script d'exécution> Fournir les paramètres de génération à partir de (schéma parent).

Collez ceci pour chaque extension:

#!/bin/bash

buildID=${PRODUCT_BUNDLE_IDENTIFIER}
extId="notification-service"

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $buildID.$extId" "${SRCROOT}/${extId}/Info.plist"

Semble fonctionner sur la première version.

14
apparition47

Il semble que vous devriez pouvoir simplement dupliquer la cible d'extension avec son propre Info.plist, mais pas autre chose.

Cependant, lorsque vous créez une extension, Xcode ajoute des "extensions d'application intégrées" aux phases de génération de la cible de l'application, comme indiqué ci-dessous, et il n'y a pas encore d'interface utilisateur pour le faire.

enter image description here

Néanmoins, vous pouvez créer l'extension pour la deuxième cible, puis supprimer tous les fichiers sauf le .plist et corriger ce qui doit être corrigé. Voici une étape par étape:

  • Créez "Extension 1" pour "Target 1"
  • Créer une "extension 2" pour "cible 2"
  • Supprimer tous les fichiers créés pour "Extension 2", à l'exception de son Info.plist
  • Définissez les "phases de construction" pour "l'extension 2" de la même manière que les phases de construction de "l'extension 1". Habituellement, cela ajoute les fichiers .m nécessaires à la phase "Compiler les sources" et les ressources à la phase "Copier les ressources de l'ensemble"
10
leonaka

J'ai créé un script d'exécution pour prendre en charge cette exigence

#!/bin/sh
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${SRCROOT}/ImagePush/Info.plist"

buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildVersion" "${SRCROOT}/ImagePush/Info.plist"

buildID=${PRODUCT_BUNDLE_IDENTIFIER}
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $buildID.ImagePush" "${SRCROOT}/ImagePush/Info.plist"

ImagePush est mon extension

ajoutez à la cible celle dont vous avez besoin et ajoutez assurez-vous que ce script s'exécute avant votre paramètre d'extension dans les phases de construction, puis il vous suffit de faire l'action de construction deux fois (PS: la première fois, il échouera, essaiera de s'améliorer) et il prendre en charge plusieurs cibles

6
Neo Chen

Vous devez créer plusieurs extensions pour chaque ID, mais vous pouvez créer un cadre dynamique et simplement le lier à chaque extension. Vous n'aurez alors pas besoin de dupliquer votre code.

1
Augard