Les applications basées sur Swift fonctionnent-elles sur OS X 10.9 / iOS 7 et moins?


Answers

Le code Swift peut être déployé sous OS X 10.9 et iOS 7.0. Il se bloque généralement au lancement sur les anciennes versions du système d'exploitation.

Question

Les applications basées sur Swift fonctionneront-elles sous OS X 10.9 (Mavericks) / iOS 7 et moins?

Par exemple, j'ai une machine fonctionnant sous OS X 10.8 (Mountain Lion), et je me demande si une application que j'écris dans Swift fonctionnera dessus.




Mise à jour rapide, effective à partir du 15 février 2015 , nous ne pouvons pas soumettre des applications au magasin qui ont été développées à l'aide d'un SDK avant iOS 8 . Donc, gardant cela à l'esprit, il est préférable de ne pas s'inquiéter de ce problème, car de nombreuses personnes ont suggéré que les applications créées dans Swift puissent être déployées sous OS X 10.9 et iOS 7.0 .




Mise à jour - Selon Xcode 6 Beta 4

Cible de déploiement minimale iOS 7 et OS X 10.9

Le compilateur Swift et Xcode appliquent maintenant une cible de déploiement minimale d'iOS 7 ou OS X Mavericks. La définition d'une cible de déploiement antérieure entraîne un échec de génération.

De la note de publication de Xcode 6

Donc, ma réponse précédente (ci-dessous) ne sera pas applicable à tout développement ultérieur. Swift ne sera plus disponible pour iOS6 et ci-dessous

Une application Swift peut être exécutée sur iOS 6. Même si beaucoup de gens disent que Swift ne supportera que iOS 7+ et OS X 10.9+, d'après mon expérience, ce n'est pas le cas.

J'ai testé une application simple écrite complètement dans Swift dans un appareil iOS 6. Cela fonctionne parfaitement bien . Comme le dit Apple, le code Swift est compatible avec le code Objective-C. Il utilise le même compilateur et le même runtime pour créer le binaire.

Voici le code que j'ai testé:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        let button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
        button.frame = CGRectMake(100, 100, 100, 50)
        button.backgroundColor = UIColor.greenColor()
        button.setTitle("Test Button", forState: UIControlState.Normal)
        button.addTarget(self, action: "buttonTapped:", forControlEvents: UIControlEvents.TouchUpInside)

        self.view.addSubview(button)
    }

    func buttonTapped(sender: UIButton!) {
        println("buttonTapped")
    }
}

C'est une application simple, ajoutant simplement un bouton par programmation. Mon application contient seulement deux fichiers, AppDelegate.swift et ViewController.swift .

Ainsi, si vous n'utilisez pas de nouvelles API ajoutées dans le SDK iOS 8 ou certaines API spécifiques à Swift (l'API correspondante n'est pas disponible pour Objective-C), votre application fonctionnera sans problème sur iOS 6 ou ultérieur (testé et fonctionnel), même sur iOS 5 (non testé). La plupart des API de Swift ne sont que le remplacement des API Objective-C existantes. En fait, ils sont identiques en binaire.

Remarque: Conformément à Xcode 6 beta 4, la cible de déploiement des applications rapides doit être iOS 7 ou OS X 10.9 (voir la mise à jour ci-dessus). Donc, swift ne sera plus disponible pour iOS6 et ci-dessous




Il semble que les applications Swift ne fonctionnent pas sous OS X 10.7 . Je viens de créer une simple application graphique (une vue, un lable, un bouton) qui fonctionne bien sur Mavericks. Le SDK de base est défini sur 10.9 et la cible de déploiement sur 10.7. J'ai copié cette application à partir du dossier DerivedData sur ma machine virtuelle 10.7, et il se bloque au démarrage, affiche cette erreur:

Crashed Thread:  0

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000

Application Specific Information:
dyld: launch, loading dependent libraries

    Dyld Error Message:

  Library not loaded: /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics
  Referenced from: /Users/USER/Desktop/Swift-Test.app/Contents/MacOS/../Frameworks/libswiftAppKit.dylib
  Reason: image not found

Binary Images:
       0x109c65000 -        0x109c6afff +private.Swift-Test (1.0 - 1) <649695D0-58FD-3D02-9176-2D40D4E711F2> /Users/USER/Desktop/Swift-Test.app/Contents/MacOS/Swift-Test
       0x109c83000 -        0x109dbffff +libswift_stdlib_core.dylib (1.0 - 600.0.34.4.5) <10AAC369-9404-321D-A892-49F65856D7AF> /Users/USER/Desktop/Swift-Test.app/Contents/Frameworks/libswift_stdlib_core.dylib
...

Cependant, ce message est irritant, car il existe certainement une bibliothèque CoreGraphics dans cette machine virtuelle. D'autres applications qui font un usage intensif de CoreGraphics fonctionnent très bien.




Alors que le code le confirme, Apple lui-même a déclaré que Swift sera compatible sur iOS 7 et Mavericks dans leur keynote technique ( état des plates-formes , session 102, autour de la marque 34 min 00 sec) à la WWDC 2014 .




J'ai testé une application basée sur Swift sur un iPod Touch (3e génération). Il semble que les applications basées sur Swift ne fonctionnent pas avec iOS 5.x mais fonctionnent avec iOS 6.x.

Voici ce qui apparaît dans le journal de débogage lorsque j'ai essayé de lancer l'application de test avec iOS 5.0.1:

dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswift_stdlib_core.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftCoreGraphics.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftDarwin.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftDispatch.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftFoundation.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftObjectiveC.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftUIKit.dylib with errno=1
dyld: Symbol not found: _OBJC_CLASS_$_NSObject
  Referenced from: /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswift_stdlib_core.dylib
  Expected in: /usr/lib/libobjc.A.dylib
 in /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswift_stdlib_core.dylib

Pour iOS 6.1.6, l'application fonctionne correctement sans afficher ces messages d'erreur.




J'ai aussi essayé une application très simple sur 10.8 (un bouton, met du texte sur une étiquette). Il s'est écrasé au démarrage, comme l'a déclaré Greg Parker:

Dyld Error Message:
  Symbol not found: __dispatch_source_type_memorypressure
  Referenced from: /Volumes/*/SwifTest.app/Contents/MacOS/../Frameworks/libswiftDispatch.dylib
  Expected in: /usr/lib/libSystem.B.dylib
in /Volumes/*/SwifTest.app/Contents/MacOS/../Frameworks/libswiftDispatch.dylib

(Cela utilisait une cible de déploiement de 10.7)




Oui, en fait Apple a annoncé que les applications Swift seront rétrocompatibles avec iOS 7 et OS X Mavericks. De plus, l'application WWDC est écrite dans le langage de programmation Swift.




Swift utilise le même temps d'exécution que l' Objective-C et peut même cohabiter Objective-C côte à côte dans la même application (selon la keynote de la WWDC 2014).

Cela devra être vérifié / vérifié en utilisant Xcode 6 et le nouveau SDK pour trouver une réponse finale.