Question

J'ai une application existante qui doit être compilé pour différents clients

Chaque client a besoin de leur propre icône et écran de démarrage.
Je voudrais aussi être en mesure d'inclure certaines conditions différentes fonctions selon que le client particulier leur demande ou non.

J'ai essayé la mise en place des cibles différentes pour chaque client, mais ne pas avoir beaucoup de chance jusqu'à présent.
Les différentes ressources avec le même nom, mais un donjon de chemin différent traînes.

Idéalement je voudrais être en mesure de construire une application en dupliquant un autre client qui est similaire et puis juste faire le nombre minimum de changements pour créer l'application pour le nouveau client.

Quelle est la meilleure façon de définir cette application jusqu'à?

Était-ce utile?

La solution

Des objectifs distincts pour chaque client doit être le chemin à parcourir. Pour les caractéristiques, je vous suggère d'abord la mise en place d'une macro identifiant le client dans les paramètres cibles (sous « préprocesseur macros » dans l'onglet de construction), puis d'avoir un fichier FeatureDefines.h qui ressemble à ceci:

#ifdef macroClientA // assume client A wants features 1 and 3
#  define macroFeature1
#  define macroFeature3
#endif

// and similarly for the other clients

vous pouvez utiliser

#import featureDefines
#ifdef macroFeature1

ne importe quel endroit vous devez tester si la fonction 1 est souhaitée ou non.

Pour les icônes distinctes, vos paramètres cibles peut spécifier un fichier info.plist différent pour chaque client, et ces fichiers peuvent à leur tour spécifier un autre nom de fichier pour l'icône.

Pour les écrans de démarrage séparés, iOS nécessite toujours l'écran de démarrage pour être nommé Default.png, mais ils peuvent aller dans les différents sous-répertoires de votre répertoire de projet. Vous pouvez contrôler que l'on utilise pour quelle cible par un clic droit où Xcode dit « Groupes et fichiers », en sélectionnant Adhésion cible, puis en cochant la case à cocher pour celui que vous souhaitez utiliser, et en vous assurant les autres ne sont pas cochées.

Pour les ressources, je vous suggère de nommer vos fichiers de ressources comme ceci:

resourceName.ext // ressource générique à utiliser s'il n'y a pas un client spécifique à
resourceName-clientName.ext // ressource spécifique-client

Ensuite mettre en place une méthode générale ressource finder qui ressemble à quelque chose comme ceci:

-(NSString *) resourcePathForResourceName: (NSString *) resourceName extension: (NSString *) ext {
  NSString *clientName;
  #ifdef macroClientA
     clientName = @"clientA";
  #endif // and similarly for the other clients
  NSString *clientSpecificName = [NSString stringWithFormat: @"%@-%@.%@", resourceName, clientName, ext];
  NSString *genericName = [NSString stringWithFormat: @"%@.%@"];
  if ([[NSFileManager defaultManager] fileExistsAtPath: clientSpecificName])
     return clientSpecificName;
  else if ([[NSFileManager defaultManager] fileExistsAtPath: genericName])
     return genericName;
  else
    // handle the error
}

L'exécution tous vos fichiers accaparement des ressources par le biais de cette méthode vous permettra d'ajouter des ressources spécifiques du client à votre projet sans changer une seule ligne de code.

Autres conseils

J'ai un scénario similaire et comment je débrouille comme suit:

1) le code de base de l'application est maintenue dans un dossier "application_name-base"

2) différents clients sont dans leur dossier "application_name-client_name"

3) le fichier de projet est dans le dossier client et comprend les références du dossier de base sans utiliser la copie.

4) les fichiers qui doivent être uniques au projet du client sont dans le dossier client. Habituellement images en utilisant le même nom. ou .h fichiers .m qui doivent être uniques au projet individuel. Permet également pour vous de ne pas inclure les fichiers sur un projet par projet.

de garder le code central, mais permet un code différent par client sans conduire à la confusion.

Vous pourriez faire une cible distincte pour chaque client, et de mettre chacun des actifs des clients dans leur propre dossier avec le même nom. Je l'ai fait quelque chose de similaire où j'ai eu deux projets qui avaient beaucoup en commun et juste ajoutés / supprimés les actifs appropriés de chaque projet.

Avec votre scénario, à ce moment-là, vous pouvez simplement ajouter un nouveau dossier avec les ressources spécifiques du client à chaque cible et ne nécessiterait aucune modification de code. Si les chemins sont un problème, vous pourriez envisager d'utiliser la méthode de [UIImage imageNamed:] qui ne nécessite pas le chemin complet, juste le nom du fichier.

Je préfère écrire des scripts Automator / au lieu d'utiliser XCode pour ces fonctions!

http://developer.apple.com/tools/xcode/automatorforxcode.html

Écrivez votre code pour permettre un fichier de configuration externe pour faire la majeure partie de la configuration, puis d'inclure les éléments souhaités avec vos objectifs. Avoir un projet avec une nouvelle cible pour chaque client, vous pouvez choisir les actifs s'inclus avec chaque cible. Si vous rencontrez des problèmes avec les cibles multiples, vous pouvez utiliser git pour gérer un projet de base, puis branche pour chaque client.

Je voudrais simplement créer une interface de configuration pour un client d'entrer et de personnaliser l'application à leur entreprise / besoins individuels. Par exemple, en fournissant l'image de leur bibliothèque de photos, etc.

Vous pouvez faire projet pour chaque client, et inclure toutes les sources du même chemin, sans les copier dans le répertoire du projet. Donc, vous serez en mesure de remplacer l'icône / écran de démarrage dans un projet, tout en utilisant la même base de code. Cela ressemble à la façon à ce jour plus facile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top