Swift sur les anciens iOS et macOS : le code fonctionne-t-il sur OS X 10.9 et iOS 7 ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Swift sur les anciens systèmes : mythes et réalité

\n\n

Imaginez la situation : vous avez écrit une super application en Swift, elle fonctionne parfaitement sur votre iPhone sous iOS 16. Mais voilà qu'un utilisateur avec un « dinosaure » sous iOS 7 se plaint que l'application plante. Ou vous développez un utilitaire Mac, et un client utilise OS X 10.9 Mavericks. Une douleur familière ? Penchons-nous une bonne fois pour toutes sur la question de savoir si les applications Swift fonctionnent sur les anciennes versions des systèmes d'exploitation Apple.

\n\n

Cette question est un véritable hit sur Stack Overflow (plus de 10 000 vues). Et la réponse n'est pas aussi tranchée qu'on le souhaiterait. Dans cet article, nous ne nous contenterons pas de donner une théorie sèche, mais nous montrerons des exemples de code réels, expliquerons comment fonctionne le Swift runtime, et fournirons une liste de contrôle pour vérifier la compatibilité.

\n\n

Réponse courte : oui, mais avec des réserves

\n\n

Si vous voulez une réponse immédiate — les applications Swift peuvent fonctionner sur OS X 10.9 et iOS 7, mais uniquement si vous utilisez Swift 5.5 et versions ultérieures. Les versions plus anciennes de Swift (1.x–4.x) ne supportent physiquement pas ces systèmes en raison des spécificités du runtime. Cela semble étrange ? Voyons cela dans l'ordre.

\n\n

Comment Swift fonctionne-t-il sur les anciens systèmes ?

\n\n

Le secret réside dans la stabilité ABI (Application Binary Interface). Avant Swift 5.0, chaque application transportait avec elle une copie de la bibliothèque standard Swift. Cela entraînait :

\n
    \n
  • Une augmentation de la taille de l'application de 5 à 10 Mo
  • \n
  • Un runtime rigidement lié à la version de Swift avec laquelle l'application était compilée
  • \n
  • L'absence de support intégré de Swift sur les anciens systèmes
  • \n
\n\n

À partir de Swift 5.0 (Xcode 10.2), l'ABI est devenu stable. Cela signifie que la bibliothèque standard Swift est désormais intégrée directement dans iOS, macOS, tvOS et watchOS. Mais il y a un détail : elle n'est intégrée que dans iOS 12.4+ et macOS 10.14.4+. Pour les systèmes plus anciens (iOS 7, OS X 10.9), le runtime doit toujours être transporté avec l'application — et c'est possible !

\n\n

Quand cela est-il devenu possible ?

\n\n

À partir de Swift 5.5 (Xcode 13), Apple a ajouté la prise en charge des anciens deployment target. Vous pouvez désormais compiler une application avec IPHONEOS_DEPLOYMENT_TARGET = 7.0 ou MACOSX_DEPLOYMENT_TARGET = 10.9, et elle fonctionnera.

\n\n

Voici à quoi cela ressemble dans le code de configuration du projet :

\n\n
// Exemple de configuration du deployment target dans Swift Package Manager\n// Package.swift\nlet package = Package(\n    name: "MyLegacyApp",\n    platforms: [\n        .iOS(.v7),      // iOS 7 et versions ultérieures\n        .macOS(.v10_9)  // OS X 10.9 et versions ultérieures\n    ],\n    dependencies: [],\n    targets: [\n        .target(\n            name: "MyLegacyApp",\n            swiftSettings: [\n                .unsafeFlags(["-target", "x86_64-apple-macosx10.9"])\n            ]\n        )\n    ]\n)
\n\n

Exemple pratique : une application pour iOS 7 en Swift

\n\n

Écrivons un exemple simple qui fonctionnera sous iOS 7. Attention : nous ne pouvons pas utiliser les API modernes (par exemple, UIAlertController n'est apparu qu'avec iOS 8).

\n\n
import UIKit\n\n// Classe compatible avec iOS 7\nclass LegacyViewController: UIViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        // Utilisation de l'ancien UIAlertView (fonctionne sous iOS 7)\n        let alert = UIAlertView()\n        alert.title = "Bonjour de Swift !"\n        alert.message = "Cette application fonctionne sous iOS 7"\n        alert.addButton(withTitle: "OK")\n        alert.show()\n        \n        // Alternative : vérification de la version iOS\n        if #available(iOS 8.0, *) {\n            // Code moderne pour iOS 8+\n            let modernAlert = UIAlertController(\n                title: "Alerte moderne",\n                message: "Fonctionne uniquement sous iOS 8+",\n                preferredStyle: .alert\n            )\n            modernAlert.addAction(UIAlertAction(title: "OK", style: .default))\n            present(mode                

Blogs

Book Recommendations