iOS: moyen simple de gérer les points de fin REST

Notre application basée sur REST peut être utilisée pour effectuer des tests sur plusieurs environnements internes, chacun avec un sharepoint terminaison REST différent. Existe-t-il un moyen simple de configurer la configuration au niveau de l'environnement dans une application iOS (Swift 3)? J'ai vu quelques approches mais elles semblent toutes très impliquées.

J'ai trouvé que la création de différents schémas et configurations pour votre projet fonctionne le mieux. Ma configuration est la suivante:

J'ai habituellement 3 schémas différents, MyApp-dev , MyApp-staging et MyApp .

Chaque scheme créé un User-Defined-Atsortingbute afin d'append une string différente à mon Bundle Display Name . Il peut donc apparaître simultanément sur mon appareil iOS en tant que MyApp-d , MyApp-s et MyApp . Chacun a aussi son propre Bundle ID Ensuite, je crée des drapeaux personnalisés pour chacun d'entre eux.

Donc, dans mes files Routes.swift j'ai quelque chose comme ça en haut:

 #if PRODUCTION static let hostName = "http://production.com/api/v1/" #elseif STAGING static let hostName = "http://staging.com/api/v1/" #else static let hostName = "http://development.com/api/v1/" #endif 

Il existe plusieurs façons de mettre à jour un nom d'hôte différent. Mais finalement, créer un schéma et une configuration différents est toujours la première étape.

Voici quelques liens qui pourraient vous aider à démarrer:

https://medium.com/@danielgalasko/change-your-api-endpoint-environment-using-xcode-configurations-in-swift-c1ad2722200e#.o6nhic3pf

http://limlab.io/swift/2016/02/22/xcode-working-with-multiple-environments.html

Comme Zac Kwan l'a suggéré, vous pouvez utiliser différents schémas pour accomplir ceci, mais vous n'avez pas nécessairement besoin de créer une configuration différente. Chaque schéma peut spécifier des variables d'environnement uniques. Ensuite, accédez-y depuis Swift:

 let prodURL = "http://api.com" let baseURL = ProcessInfo.processInfo.environment["BASE_URL"] ?? prodURL 

C'est mon approche de faire les choses quand nous avons plusieurs points d'extrémité. Je faisais une class ConfigurationManager quelque chose comme ça

Swift 3.0 code

 import Foundation import UIKit let kEnvironmentsPlist:NSSsortingng? = "Environments" let kConfigurationKey:NSSsortingng? = "ActiveConfiguration" let kAPIEndpointKey:NSSsortingng? = "APIEndPoint" let kLoggingEnabledKey:NSSsortingng? = "LoggingEnabled" let kAnalyticsTrackingEnabled:NSSsortingng? = "AnalyticsTrackingEnabled" class ConfigurationManager:NSObject { var environment : NSDictionary? //Singleton Method static let sharedInstance: ConfigurationManager = { let instance = ConfigurationManager() // setup code return instance }() override init() { super.init() initialize() } // Private method func initialize () { var environments: NSDictionary? if let envsPlistPath = Bundle.main.path(forResource: "Environments", ofType: "plist") { environments = NSDictionary(contentsOfFile: envsPlistPath) } self.environment = environments!.object(forKey: currentConfiguration()) as? NSDictionary if self.environment == nil { assertionFailure(NSLocalizedSsortingng("Unable to load application configuration", comment: "Unable to load application configuration")) } } // CurrentConfiguration func currentConfiguration () -> Ssortingng { let configuration = Bundle.main.infoDictionary?[kConfigurationKey! as Ssortingng] as? Ssortingng return configuration! } // APIEndpoint func APIEndpoint () -> Ssortingng { let configuration = self.environment![kAPIEndpointKey!] return (configuration)! as! Ssortingng } // isLoggingEnabled func isLoggingEnabled () -> Bool { let configuration = self.environment![kLoggingEnabledKey!] return (configuration)! as! Bool } // isAnalyticsTrackingEnabled func isAnalyticsTrackingEnabled () -> Ssortingng { let configuration = self.environment![kAnalyticsTrackingEnabled!] return (configuration)! as! Ssortingng } func applicationName()->Ssortingng{ let bundleDict = Bundle.main.infoDictionary! as NSDictionary return bundleDict.object(forKey: "CFBundleName") as! Ssortingng } } 

In Project -> Info Ajoutez de nouvelles configurations selon vos besoins.

entrez la description de l'image ici

J'ai ajouté Staging et QA en tant que points de terminaison supplémentaires. Généralement, je fais en sorte que Staging en tant que Release config et QA en tant que Debug. Cela ressemblera donc à:

entrez la description de l'image ici

Maintenant, allez à Cibles -> Paramètres de construction et ajoutez un paramètre défini par l'user

entrez la description de l'image ici

Donnez le nom de l'user défini comme ACTIVE_CONFIGURATION .

entrez la description de l'image ici

Ajoutez une key nommée ActiveConfiguration dans info.plist avec un nom de variable $(ACTIVE_CONFIGURATION) identique à celui indiqué dans Paramètres définis par l'user avec un $ au début. Nous avons donné le nom de key comme ActiveConfiguration parce que nous utilisons le même nom dans notre class ConfigurationManager.swift pour kConfigurationKey .

 let kConfigurationKey:NSSsortingng? = "ActiveConfiguration" 

Vous pouvez définir selon votre convention de nommage.

Cela ressemblera à:

entrez la description de l'image ici

Maintenant, dans la class ConfigurationManager , j'obtiens un path pour le file Environments.plist .

Je vais juste faire un file Environments.plist comme ceci:

entrez la description de l'image ici

La source de description réelle de ce file est

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Development</key> <dict> <key>APIEndPoint</key> <ssortingng>https://dev</ssortingng> <key>LoggingEnabled</key> <true/> <key>AnalyticsTrackingEnabled</key> <true/> <key>Flurry</key> <dict> <key>FlurryApplicationID</key> <ssortingng></ssortingng> <key>FlurryApplicationSecret</key> <ssortingng></ssortingng> </dict> <key>Facebook</key> <dict> <key>FacebookAppID</key> <ssortingng></ssortingng> <key>FacebookAppSecret</key> <ssortingng></ssortingng> </dict> </dict> <key>QA</key> <dict> <key>APIEndPoint</key> <ssortingng>https://qa</ssortingng> <key>LoggingEnabled</key> <true/> <key>AnalyticsTrackingEnabled</key> <true/> <key>Flurry</key> <dict> <key>FlurryApplicationID</key> <ssortingng></ssortingng> <key>FlurryApplicationSecret</key> <ssortingng></ssortingng> </dict> <key>Facebook</key> <dict> <key>FacebookAppID</key> <ssortingng></ssortingng> <key>FacebookAppSecret</key> <ssortingng></ssortingng> </dict> </dict> <key>Staging</key> <dict> <key>APIEndPoint</key> <ssortingng>https://staging</ssortingng> <key>LoggingEnabled</key> <false/> <key>AnalyticsTrackingEnabled</key> <true/> <key>Flurry</key> <dict> <key>FlurryApplicationID</key> <ssortingng></ssortingng> <key>FlurryApplicationSecret</key> <ssortingng></ssortingng> </dict> <key>Facebook</key> <dict> <key>FacebookAppID</key> <ssortingng>840474532726958</ssortingng> <key>FacebookAppSecret</key> <ssortingng></ssortingng> </dict> </dict> <key>Production</key> <dict> <key>APIEndPoint</key> <ssortingng>https://production</ssortingng> <key>LoggingEnabled</key> <true/> <key>AnalyticsTrackingEnabled</key> <true/> <key>Flurry</key> <dict> <key>FlurryApplicationID</key> <ssortingng></ssortingng> <key>FlurryApplicationSecret</key> <ssortingng></ssortingng> </dict> <key>Facebook</key> <dict> <key>FacebookAppID</key> <ssortingng></ssortingng> <key>FacebookAppSecret</key> <ssortingng></ssortingng> </dict> </dict> </dict> </plist> 

Nous sums maintenant prêts à partir. Maintenant, vous devez simplement appeler

 ConfigurationManager.sharedInstance.APIEndpoint() 

pour vos points de terminaison respectifs.

Maintenant, il vous suffit de changer les schémas de Edit Schemes et vous avez terminé et modifier la configuration de construction dans info .

entrez la description de l'image ici

entrez la description de l'image ici

Cela permet non seulement de gérer les points de terminaison de l' API, mais également d'activer ou de désactiver le suivi pour le sharepoint terminaison respectif ou les différents identifiants de Facebook pour différents points de terminaison.

J'ai fini par utiliser https://github.com/theappbusiness/ConfigGenerator :

Un outil de command line pour générer automatiquement le code du file de configuration, à utiliser dans les projets Xcode. L'outil configen est utilisé pour générer automatiquement le code de configuration à partir d'une list de propriétés. Il est destiné à créer le type de configuration requirejs pour les URL externes ou les keys API utilisées par votre application. Supporte actuellement la génération de code Swift et Objective-C.