基于Swift的应用程序在OS X 10.9 / iOS 7或更低版​​本上工作吗?

基于Swift的应用程序可以在OS X 10.9 (Mavericks)/ iOS 7或更低版​​本上运行吗?

例如,我有一台运行OS X 10.8 (Mountain Lion)的机器,我想知道如果我在Swift中编写的应用程序将运行在它上面。

我只是为你testing它,Swift应用程序编译成标准的二进制文件,可以在OS X 10.9和iOS 7上运行。


简单的Swift应用程序用于testing:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var controller = UIViewController() var view = UIView(frame: CGRectMake(0, 0, 320, 568)) view.backgroundColor = UIColor.redColor() controller.view = view var label = UILabel(frame: CGRectMake(0, 0, 200, 21)) label.center = CGPointMake(160, 284) label.textAlignment = NSTextAlignment.Center label.text = "I'am a test label" controller.view.addSubview(label) self.window!.rootViewController = controller self.window!.makeKeyAndVisible() return true } 

Swift代码可以部署到OS X 10.9和iOS 7.0。 它通常会在较旧的操作系统版本上启动时崩溃。

苹果已经宣布,Swift应用程序将向后兼容iOS 7和OS X Mavericks。 WWDC应用程序是用Swift编写的。

更新 – 根据Xcode 6 Beta 4

iOS 7和OS X 10.9最低部署目标

Swift编译器和Xcode现在强制执行iOS 7或OS X Mavericks的最低部署目标。 设置较早的部署目标会导致生成失败。

从Xcode 6发行说明

所以我以前的答案(下面显示)将不适用于任何进一步的发展。 Swift将不再适用于iOS6及更低版本


一个Swift应用程序可以在iOS 6上运行。尽pipe很多人都说Swift只支持iOS 7+和OS X 10.9+,但根据我的经验,这不是。

我已经testing了一个在iOS 6设备上完全用Swift编写的简单应用程序。 它工作得很好 。 正如苹果所说,Swift代码与Objective-C代码是二进制兼容的。 它使用相同的编译器和运行时来创build二进制文件。

这是我testing的代码:

 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") } } 

这是一个简单的应用程序,只是以编程方式添加button。 我的应用程序只包含两个文件, AppDelegate.swiftViewController.swift

所以,如果你没有使用任何作为iOS 8 SDK或Swift特定API的一部分添加的新API(相应的API不可用于Objective-C),那么你的应用程序将在iOS 6或更高版本(经过testing和工作)上无缝地工作,甚至在iOS 5上(未经testing)。 Swift中的大多数API只是替代现有的Objective-C API。 实际上它们在二进制中是一样的。

注意:根据Xcode 6 beta 4的swift应用程序部署目标应该是iOS 7或OS X 10.9(请参阅上面的更新)。 所以swift将不再适用于iOS6及更低版本


简单来说:

基于Swift的应用程序可以使用相同的应用程序回到OS X MavericksiOS 7

这怎么可能 ?

Xcode 在您的应用程序包中embedded一​​个小型Swift运行时库 。 由于该库是embedded式的,因此您的应用程序将使用在过去,现在和将来的操作系统版本上运行的一致版本的Swift。

我为什么要相信这个答案?

因为我不是这样回答,就像一个苹果的人在twitter上告诉我的,或者我写了你好世界并且testing了它。

我从苹果开发者博客拿走了它。

所以你可以相信这一点。

Swift使用与Objective-C相同的运行环境,甚至可以在同一个应用程序中并排使用Objective-C(根据WWDC 2014主题演讲)。

这需要使用Xcode 6和新的SDK来检查/validation才能find最终答案。

我读了所有答案,说:不,Swift不支持低于iOS 7.但是我说是的 ,我刚刚创build了一个Swift项目,运行在Xcode 5 6.0部署目标。

  • 我只是在select了Swift编程语言的Xcode 6 BETA中创build一个演示项目。
  • closuresXcode 6testing版,然后用Xcode 5在部署目标6.0中打开这个演示项目
  • 并select模拟器6.1。

那么该项目在模拟器6.1中运行良好。 我的Mac OS X是10.9.3,所以我说是的,运行在比iOS 710.9.3的Mac OS X上

这里是模拟器的截图:

在这里输入图像说明

这里也是一个演示 : http : //www.filedropper.com/demo_5

尽pipe代码证实了这一点,但苹果本身已经表示,Swift将在WWDC 2014上与iOS 7和Mavericks的技术主题( 平台状态 ,会话102,大约34分00秒标记)兼容。

如Beta 4发行说明中所述, iOS 7及更高版本支持Swift应用程序。 Xcode 6 Beta中的iOS 6.0,6.1,7.0,7.1,8.0

OS X 10.9及以上平台上支持Swift应用程序。 部署目标中的OS X 10.4到10.10。 我已经testing了从10.5到10.10,并在10.9.3上运行

看来Swift应用程序不能OS X 10.7上运行。 我刚刚创build了一个简单的GUI应用程序(一个视图,一个标签,一个button),在小牛上运行良好。 基本SDK设置为10.9,部署目标设置为10.7。 我将该应用程序从DerivedData文件夹复制到我的10.7虚拟机,并在启动时崩溃,显示此错误:

 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 ... 

但是这个消息让人恼火,因为这个虚拟机当然有一个CoreGraphics库。 其他大量使用CoreGraphics的应用程序工作得很好。

这是我从苹果Swift博客阅读的post,可能会有所帮助:

应用兼容性

如果你写一个Swift应用程序,你可以相信你的应用程序将在未来运行良好。 实际上,您可以使用相同的应用程序将目标locking回OS X Mavericks或iOS 7 。 这是可能的,因为Xcode在您的应用程序包中embedded了一个小型的Swift运行时库。 由于该库是embedded式的,因此您的应用程序将使用在过去,现在和将来的操作系统版本上运行的一致版本的Swift。

二进制兼容性和框架:

尽pipe您的应用程序的运行时兼容性得到了保证,但Swift语言本身将继续发展,二进制接口也将发生变化。 为了安全起见,应用程序的所有组件都应该使用相同版本的Xcode和Swift编译器来构build,以确保它们一起工作。

这意味着框架需要仔细pipe理。 例如,如果您的项目使用框架与embedded式扩展共享代码,则需要一起构build框架,应用程序和扩展。 依赖使用Swift的二进制框架(尤其是来自第三方)是危险的。 随着Swift的变化,这些框架将与您的应用程序的其余部分不兼容。 当二进制接口在一两年内稳定后,Swift运行时将成为主机操作系统的一部分,这个限制将不再存在。

我testing了在iPod Touch(第三代)设备上运行的基于Swift的裸机应用程序。 它似乎基于Swift的应用程序不适用于iOS 5.x,但可以与iOS 6.x一起使用。

以下是我在尝试使用iOS 5.0.1启动testing应用程序时在debugging日志中显示的内容:

 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 

对于iOS 6.1.6,应用程序运行良好,不显示这些错误消息。

这里似乎有很多旧的答案,所以我只想发布Swift团队的官方回应。 Swift向后兼容OS X Mavericks和iOS 7

https://developer.apple.com/swift/blog/

2014年7月11日

兼容性

我们在WWDC上听到的一个最常见的问题是:“Swift的兼容性问题是什么?”。 这似乎是一个伟大的第一个话题。

应用程序兼容性简而言之,如果您今天编写Swift应用程序并在今年秋天将应用程序提交给App Store,那么您可以相信,您的应用程序将在未来运行良好。 实际上,您可以使用相同的应用程序回到OS X Mavericks或iOS 7。 这是可能的,因为Xcode在您的应用程序包中embedded了一个小型Swift运行时库。 由于该库是embedded式的,因此您的应用程序将使用在过去,现在和将来的操作系统版本上运行的一致版本的Swift。

我也尝试了一个非常简单的应用程序在10.8(一个button,在标签上设置文本)。 正如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 

(这是使用10.7的部署目标)

试试下面的代码:

它的工作没有StoryBoard:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.window!.backgroundColor = UIColor.whiteColor() // Create a nav/vc pair using the custom ViewController class let nav = UINavigationController() let vc = ViewController(nibName: "ViewController", bundle: nil) // Push the vc onto the nav nav.pushViewController(vc, animated: false) // Set the window's root view controller self.window!.rootViewController = nav // Present the window self.window!.makeKeyAndVisible() return true } 

当涉及到Swift框架。 至于今天,Xcode版本6.1.1(6A2008a),如果Swift框架是针对iOS 7.1的,链接器报告警告

 ld: warning: embedded dylibs/frameworks only run on iOS 8 or later. 

并且应用程序不能提交给AppStore。 检查这个问题https://github.com/CocoaPods/CocoaPods/issues/3193

是的,事实上苹果已经宣布,Swift应用程序将向后兼容iOS 7和OS X Mavericks。 此外,WWDC应用程序是用Swift编程语言编写的。

快速更新,从2015年2月15日起生效,我们无法将应用程序提交到使用iOS 8之前SDK开发的商店。 所以,牢记这一点,不用担心这个问题,因为很多人都build议使用Swift制作的应用程序也可以部署到OS X 10.9和iOS 7.0