Swift 2 Vérification de la disponibilité

Dans ce court tutoriel, je voudrais me concentrer sur la toute nouvelle syntaxe de Swift pour la vérification de la disponibilité. Si vous avez déjà développé iOS ou OS X, je suis certain que vous savez à quel point il peut être fastidieux de vérifier si une API particulière est disponible sur le périphérique sur lequel votre application est exécutée. Dans Swift 2, cela est devenu beaucoup moins pénible pour les développeurs.

Le problème

Imaginez le scénario suivant. Vous développez une application iOS qui cible iOS 7 et plus. Lors de la dernière WWDC, Apple a introduit une nouvelle API pour l'enregistrement des notifications.

registerUserNotificationSettings (_ :) 

Cela signifie-t-il que vous devez augmenter la cible de déploiement de votre application d'iOS 7 à iOS 8? Vous pouvez le faire, mais cela laisserait une partie importante de la base d'utilisateurs de votre application dans le froid, seulement pour se conformer à la nouvelle politique d'Apple pour les notifications locales et à distance. Vos utilisateurs ne vous remercieront pas pour cela.

L'alternative consiste à utiliser uniquement la nouvelle API sur les appareils exécutant iOS 8 et versions ultérieures. Cela a plus de sens. Droite? La mise en œuvre ressemblerait à quelque chose comme ça.

application func (application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool si UIApplication.instancesRespondToSelector ("registerUserNotificationSettings:") laisse entrer = UIpplication.instancesRespondToSelector | UIUserNotificationType.Sound | UIUserNotificationType.Badge let settings = UIUserNotificationSettings (pourTypes: types, catégories: nil) application.registerUserNotificationSettings (paramètres) return true 

C'est une option viable, mais cela ne présente aucun risque. Dans ce tutoriel, je n'entrerai pas dans les détails de la nature de ces risques, mais je tiens à souligner que la plupart des développeurs pensent qu'il est correct d'utiliser l'approche ci-dessus. L'exemple suivant montre une variante de cette approche, cette fois en utilisant Objective-C.

if ([UIUserNotificationSettings class]) [application registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes: catégories (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeAlerte:  

Bien que les deux approches fonctionnent dans la plupart des situations, il existe des situations dans lesquelles vous rencontrerez des problèmes. Par exemple, certaines API commencent leur vie en tant qu'API privées et sont rendues publiques ultérieurement. Dans ce scénario, vous risquez de frapper des API privées sur des périphériques exécutant un système d'exploitation dans lequel ces API ne sont pas encore publiques. Et je suis sûr que vous savez ce que cela signifie.

La solution

Grâce au travail de l'équipe Swift, la solution à notre problème est simple et directe dans Swift 2. Jetez un coup d'œil à l'exemple suivant. Notez que la cible de déploiement du projet est définie sur iOS 7, à l'aide de Swift 2 et Xcode 7.

Dans l'exemple, nous utilisons des API introduites dans iOS 8. Etant donné que le compilateur sait que la cible de déploiement du projet est définie sur iOS 7, il génère une erreur en nous indiquant que les API que nous souhaitons utiliser ne sont disponibles que dans. iOS 8 et plus. Il le sait en inspectant le SDK pour obtenir des informations sur la disponibilité. Si vous appuyez sur Commander et cliquez sur le registerUserNotificationSettings (_ :) méthode, vous devriez voir quelque chose comme ça.

@available (iOS 8.0, *) func registerUserNotificationSettings (notificationSettings: UIUserNotificationSettings) 

Heureusement, Xcode nous offre une solution pour résoudre le problème. Il suggère d'utiliser une vérification de version pour éviter que les API exclusives à iOS 8 et ultérieures soient appelées si nos utilisateurs exécutent l'application sur une version plus ancienne d'iOS..

Notez que cette fonctionnalité a été introduite dans Swift 2. Le compilateur n’émettra pas d’erreur si vous utilisez Swift 1.2. L'ajout de la vérification de version facilite également la compréhension de l'exemple. Jetez un coup d’œil à l’exemple ci-dessous dans lequel nous suivons les conseils donnés par Xcode..

application func (application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool si #available (iOS 8.0, *) let types = UIUserNotificationType.Affaire let settings = UIUserNotificationSettings (pourTypes: types, catégories: nil) application.registerUserNotificationSettings (paramètres) return true 

La syntaxe est claire et compréhensible. En utilisant la syntaxe de disponibilité, nous vérifions si l'application est en cours d'exécution sur un appareil avec iOS 8 et versions supérieures. Si ce n'est pas le cas si la clause est ignorée, sinon l'application appelle la nouvelle API pour l'enregistrement de la notification.

Syntaxe

La syntaxe est simple. Nous commençons la condition de disponibilité avec #disponible et envelopper la condition entre parenthèses. Nous pouvons ajouter autant de plates-formes que nécessaire, en séparant la liste des plates-formes avec des virgules.

si #available (iOS 8.0, OSX 10.10, watchOS 2, *) … 

Notez que nous terminons la liste des plateformes avec un astérisque. Cet astérisque est obligatoire et indique que le si La clause est exécutée sur la cible de déploiement minimale pour toute plate-forme ne figurant pas dans la liste des plates-formes..

Comme nous l'avons vu précédemment, nous pouvons utiliser le @disponible attribut pour ajouter des informations de disponibilité aux fonctions, méthodes et classes. Dans l'exemple suivant, nous disons au compilateur que le useFancyNewAPI ne doit être appelé que sur les appareils sous iOS 9 et plus.

@available (iOS 9.0, *) func useFancyNewAPI () … 

Conclusion

N'oubliez pas que la syntaxe de disponibilité n'est pas une alternative aux deux exemples que je vous ai présentés au début de ce didacticiel. Ces exemples sont défectueux et ne devraient être utilisés que si vous utilisez Objective-C ou une version antérieure de Swift..

La syntaxe de disponibilité est une raison supplémentaire pour migrer vos projets Swift vers Swift 2. Elle supprime les solutions sujettes aux erreurs pour vérifier la disponibilité des API. Le monde semble un peu plus convivial avec Swift 2. Ça ne va pas?