Différentes fonctionnalités impliquent différents composants du système d'exploitation, qui définissent comment une fonctionnalité peut être utilisée dans plusieurs versions d'OS X. Voici ma classification approximative:
La fonctionnalité est complètement fournie par un framework. Par exemple, NSJSONSerialization
est disponible dans Mac OS X 10.7+. Vous pouvez utiliser la même solution pour toutes les versions de système d'exploitation ou vérifier au moment de l'exécution si certaines fonctionnalités sont disponibles. Par exemple,
if ([view respondsToSelector:@selector(setAcceptsTouchEvents:)])
[view setAcceptsTouchEvents:YES];
Plus de détails concernant le soutien de plusieurs kits de développement se trouvent dans SDK Compatibility Guide. Using SDK-Based Development.
La fonctionnalité est entièrement fournie par le compilateur. Par exemple, @autoreleasepool
, littéraux.
La fonctionnalité est fournie par le compilateur et l'exécution. Par exemple, synthèse par défaut @property
. Voir Objective-C Feature Availability Index pour plus de détails.
fonctionnalité qui dépend du SDK contre lequel une application est liée. Il s'agit plus de changements de comportement, un tel mécanisme est décrit dans la section Compatibilité descendante dans AppKit Release Notes.
Et maintenant, revenons à votre question. Il y a un mécanisme pour vérifier dans l'exécution si une fonctionnalité est disponible, assez souvent respondsToSelector:
peut faire le travail. Je recommande d'exposer une seule méthode qui fonctionne sur toutes les versions du système d'exploitation. Et seulement à l'intérieur de cette méthode, des différences entre les versions d'OS sont présentes.Par exemple,
- (NSString *)base64EncodingForData:(NSData *)data {
NSParameterAssert(data);
if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
return [data base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
}
else {
// Manual encoding using <Security/SecEncodeTransform.h> and kSecBase64Encoding.
}
}
Vous pouvez créer une branche de maintenance 1.1, effectuer tous les travaux en maître, et la fusion de la branche de maintenance que des corrections de bugs. Donc à partir de la branche maintenance, vous allez sortir 1.1.1 et partir de master 1.2. C'est une approche viable. Mais vous ne pouvez pas prendre en charge Mac OS X 10.5 indéfiniment, vous devez donc décider dans quelle version d'IPMenulet vous allez supprimer le support 10.5.
Le point des nouvelles fonctionnalités est de laisser derrière les systèmes d'exploitation plus âgés. Vous devez aller au plus bas dénominateur commun lors du rétroportage. Annule tout et recommence. Vous n'avez pas forcément besoin de dépendances pour tout remplacer. Les parseurs JSON sont triviaux à écrire, vous devez déjà connaître MRC, et la synthèse des propriétés est une caractéristique de clang, pas du système d'exploitation. – CodaFi