swift, écrivez le code pour ios 7 et 8

J'ai une application de test que j'écris avec Swift, je veux cibler iOS 7. Mais activer la notification locale, je dois append

application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil)) 

Mais cet appel n'est pas disponible dans iOS 7, alors j'ai ajouté

 var version:NSSsortingng = UIDevice.currentDevice().systemVersion as NSSsortingng; if version.doubleValue >= 8 { // ios 8 code } 

Le bloc de code ios 8 est uniquement exécuté sous iOS 8 (Testé), mais lorsque vous exécutez l'application dans iOS 7, je reçois toujours

dyld: symbole non trouvé: _OBJC_CLASS _ $ _ UIUserNotificationSettings référencé à partir de: /var/mobile/Applications/AC73969D-1A4C-45AC-99CA-0B3982C1EE36/Timely.app/Timely prévu dans: /System/Library/Frameworks/UIKit.framework/UIKit dans /var/mobile/Applications/AC73969D-1A4C-45AC-99CA-0B3982C1EE36/Timely.app/Timely

Je suppose que c'est parce que le binary contient un symbole pour API qui n'existe pas dans iOS 7, mais comment puis-je résoudre ce problème?

Malheureusement, je pense que vous êtes confronté à une limitation actuelle, voyez ceci

Quel est le préprocesseur Swift équivalent à la comparaison de vérification de version iOS?

La seule façon de contourner ce problème est d'append un file Objective-C, puis d'utiliser des macros #if et de créer deux fonctions d'aide que vous appelez de Swift (une pour iOS8 et une pour iOS7). Je m'attends à ce que cela soit corrigé à un moment donné.

En Bêta6, il semble que certains (tous?) Des problèmes de binding ont été corrigés. Les applications liées à UIAlertAction et UIAlertController avaient l'habitude de ne pas démarrer sur la version 7.1, mais elles vont maintenant démarrer. Vous ne pouvez toujours pas les utiliser dans la version 7.1, mais vous pouvez tester la version iOS et utiliser les anciens objects.

Je suis tombé sur un problème similaire, donc pour quiconque ayant ceci, voici une autre solution possible:

Si vous allez dans votre Cible> Général> Structures et bibliothèques liées, vous devriez voir UIKit (sinon, ajoutez-le). Assurez-vous qu'il est indiqué "Optionnel" au lieu de "Obligatoire" à côté de celui-ci …

C'est un peu un hack sale mais ça marche pour moi:

 if(UIApplication.sharedApplication().respondsToSelector("isRegisteredForRemoteNotifications")){ println("is iOS8") } 

Il y a une très bonne réponse de Prasath , mais elle est écrite en Objective-C ,
J'ai donc écrit quelque chose de similaire dans swift :

(testé dans Xcode 6 )

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // ... // Set Notification if UIApplication.sharedApplication().respondsToSelector(Selector("registerUserNotificationSettings:")) { // Notifications for iOS 8 let notificationSettings = UIUserNotificationSettings(forTypes: .Alert | .Sound, categories: nil) UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings) } else { // Notifications for iOS < 8 UIApplication.sharedApplication().registerForRemoteNotificationTypes(.Alert | .Sound) } // ... return true } 

J'espère que cela pourra aider