基于Swift的应用程序是否可以在OS X 10.9 / iOS 7及更低版本上运行?


616

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

例如,我有一台运行OS X 10.8(Mountain Lion)的计算机,我想知道我用Swift编写的应用程序是否可以在其上运行。

还是我必须使用Mac OS创建Swift应用程序?


51
假设Swift被编译成一个“普通”可执行文件,并且假设OS中不需要Swift特定的运行时库,那么可以,它应该在较旧的系统上运行。我们只是还不知道。下载Xcode 6并尝试。
rmaddy14年

12
官方答复将在国情咨文视频中找到。
史蒂芬·费舍尔

3
@rmaddy FWIW:在WWDC的Swift演示中,最清楚地表明,Swift和Objective-C具有相同的运行时。
2014年

1
它是公共知识,甚至在主题演讲中提到它都在这些操作系统上运行。
rhummelmose 2014年

3
这个问题是在游览页面上用作示例的。
唐老鸭

Answers:


520

我刚刚为您测试过,Swift应用程序可以编译为标准二进制文件,并且可以在OS X 10.9和iOS 7上运行。


用于测试的简单Swift应用程序:

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
}

13
请参阅stackoverflow.com/questions/24007050/…-它与此答案(至少是“甚至更低”的部分)冲突。
rmaddy14年

14
我只测试了iOS 7.0和OS X 10.9。正如回答中所说。
Leandros 2014年

@Leandros通过使用var关键字,为什么我们需要在“ var controller:UIViewController = UIViewController()”这一行中两次键入UIViewController?var是否与JavaScript / C#不同(如果否,那么难过)?这是强制转换,但等号两边的对象类型都相同吗?

3
@TienDo我没有任何Swift经验,但是我想UIViewController冒号后面的第一个代表变量的类型,而第二个出现在=符号调用构造函数(初始化变量)之后。
ComFreek

2
对于iOS:在Xcode 6 beta中,存在高达iOS 6的部署目标。有一些研究同样的答案。
ySiggen 2014年

197

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


4
格雷格,感谢您来这里回答问题。您能否谈一谈10.8-> 10.9和6.x-> 7.0的哪些更改,这些更改允许运行Swift生成的代码?
IvanVučica2014年

20
Swift在Objective-C元数据中设置了一些位来标记Swift类。OS X 10.9和iOS 7.0中的libobjc已更改为忽略这些位,以准备Swift的到来。这些位会混淆较旧的OS版本。
格雷格·帕克

9
MUCH感激,如果苹果会考虑斯威夫特应用程序可以在旧平台工作过(至少从OSX 10.7起)。原因是我们仍然拥有许多使用此操作系统的客户,因此,如果最低支持的操作系统10.9,我们将无法使用Swift进行开发多年!
Mike Lischke 2014年

2
@GregParker有没有机会为Swift 2更新此答案,无论运行时要求是否已更改?
Andrey Tarantsov 2015年

1
Swift生成的可执行文件的最低支持部署目标仍然是iOS 7.0和OSX 10.9。iOS 7 / OSX 10.9或更早版本中不推荐使用的API将不可用。构建时,Swift仅支持Xcode随附的SDK。
Flash Sheridan 2015年

103

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


11
真的WWDC是用Swift编写的吗?
Satheeshwaran 2014年

7
是的,WWDCC应用程序是用Swift编写的。正如他们昨天所说。
Shial 2014年

22
杰伊·弗里曼(Jay Freeman)则
另辟

2
苹果的营销策略是企业常用的一种策略。Windows是用汇编编写的!好吧,只有引导加载程序和其他一些东西,但是它用汇编编写的。
科尔·约翰逊

4
@IvanVučica,但是4个类足以回答兼容性问题。
ilya n。

100

更新-根据Xcode 6 Beta 4

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

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

来自Xcode 6发行说明

因此,我先前的答案(如下所示)将不适用于任何进一步的开发。Swift将不再适用于iOS6及以下版本


一个Swift应用程序可以在iOS 6上运行。即使许多人说Swift将仅支持iOS 7+和OS X 10.9+,但据我的经验来看并非如此。

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

这是我测试过的代码:

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

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

因此,如果您不使用任何作为iOS 8 SDK的一部分添加的新API或某些特定于Swift的API(Objective-C不提供相应的API),则您的应用程序将在iOS 6或更高版本(测试和运行)上无缝运行在iOS 5上(未测试)。Swift中的大多数API只是现有Objective-C API的替代。实际上,它们在二进制文件中是相同的。

注意:根据Xcode 6 beta 4的快速应用程序部署目标,应为iOS 7或OS X 10.9(请参阅上述更新)。因此Swift将不再适用于iOS6及以下版本



与以前的系统更新相同,某些框架/类已停产,必须有条件地予以支持。
Miriam H.

@TienDo不需要分号:)即使您错误地输入了(这是一个传统)也不成问题
Anil Varghese 2014年

3
但是,如果您确实需要,仍然可以使用分号。一行中的两个语句用分号分隔
PaulWoodIII 2014年

33

简单来说:

基于Swift的应用程序可以使用同一应用程序重新定向OS X MavericksiOS 7

这怎么可能 ?

Xcode 在应用程序的bundle中嵌入了一个小的Swift运行时库。由于该库是嵌入式库,因此您的应用程序使用在过去,现在和将来的OS版本上运行的Swift的一致版本。

为什么我应该相信这个答案?

因为我不是说这个答案,就像一个苹果家伙在推特上告诉我的那样,否则我写了hello world并对其进行了测试。

我从苹果开发者博客上摘下来的

这样您就可以相信。


2
“小”大约需要20 mb左右。:)
BangOperator's

1
将整个运行时包含在二进制文件中似乎有些肿,但是由于Swift仍然不是完全稳定,因此让开发人员在自己的时间内使用新版本的Swift重新编译是有意义的,而不是更新某些共享库和破坏每个人的应用程序。一旦Swift稳定下来,我假设运行时将与其他所有内容一起存储在dylib中。
William T Froggard '17

@WilliamTFroggard-是的,希望如此
Durai Amuthan.H

30

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

这需要使用Xcode 6和新的SDK 进行检查/验证,以找到最终答案。


1
看起来使用Xcode Beta 6可以让您在10.9.3上运行swift应用程序,但是我不确定swift应用程序可以运行多久(例如10.7或10.8)?
约翰

22

我读了所有回答:不,Swift不能在低于iOS 7的环境下运行。但是我说,我只是创建了一个Swift项目,该项目确实在带有6.0部署目标的Xcode 5中运行。

  • 我只是使用选定的Swift编程语言在Xcode 6 BETA中创建了一个演示项目。
  • 关闭Xcode 6 beta,然后在Xcode 5中以部署目标6.0打开此演示项目
  • 并选择模拟器6.1

然后该项目在模拟器6.1中运行良好。我的MacOS X是10.9.3,所以我说是的,它运行在低于iOS 7的操作系统上,而Mac OS X是10.9.3。

这是模拟器的屏幕截图:

在此处输入图片说明

这也是一个演示


3
问题:没有Swift支持,XCode-5如何构建Swift源?
Subin Sebastian 2014年

您可以看到模拟器的屏幕截图:)我没有在photoshop中创建以上附加的屏幕截图
Nitin Gohel

我的意思是,我已经将目标C应用程序转换为Swift并拥有ios 6上的客户。那么快速的应用程序会起作用吗?
Maneesh Sharma

首先,您尝试使用演示代码(如果可行),然后是确定性工作
Nitin Gohel,2016年

20

尽管代码确认了这一点,但苹果公司本身已经在2014年WWDC的技术主题演讲(平台状态,第 102场,大约34分00秒)中表示,Swift将与iOS 7和Mavericks兼容。


15

如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。我已经针对10.5到10.10进行了测试,并在10.9.3上运行


1
我认为各种部署目标尚不正确(XCode 6是beta)。仅仅因为您可以选择值并不意味着它起作用。我尝试将OSX 10.7作为目标,但无法正常工作。还要注意,格雷格·帕克(Greg Parker)上面已经给出了有关平台的权威确认。
Mike Lischke 2014年

@Mike Lischke,再次,我进行了一些测试来支持我的论点。当选择Deployment Target 10.7时,我可以运行OS X应用程序。但是,我确实感谢您提出了OS X应用程序支持的主题。
vladof81

那你怎么解释我的结果呢?那格雷格·帕克写了什么呢?如果Swift Apps可以在10.7上运行,我会感到非常高兴,但是到目前为止,我还没有看到一个可行的示例。当然,我也可以将10.7设置为部署目标,但这没有什么区别。该应用程序疯狂。
Mike Lischke 2014年

@Mike Lischke,您是否在设备上测试过iOS应用?
vladof81 2014年

1
我也看到了它并测试了Xcode 6 beta中的所有部署目标(与答案相同)。使用2个不同的测试应用程序工作正常。
ySiggen 2014年

14

看来Swift应用程序不能OS X 10.7上运行。我刚刚创建了一个简单的GUI应用程序(一个视图,一个标签,一个按钮),该应用程序在Mavericks上运行良好。基本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
...

但是,此消息令人不快,因为此VM中肯定有一个CoreGraphics库。大量使用CoreGraphics的其他应用程序也可以正常工作。


14

这是我从apple Swift博客阅读的帖子,可能会有所帮助:

应用程式相容性

如果您编写了一个Swift应用程序,您可以相信您的应用程序在将来会很好用。实际上,您可以使用同一应用将其定位回OS X Mavericks或iOS 7。这是可能的,因为Xcode在您的应用程序包中嵌入了一个小的Swift运行时库。由于该库是嵌入式库,因此您的应用程序使用在过去,现在和将来的OS版本上运行的Swift的一致版本。

二进制兼容性和框架:

在确保应用程序的运行时兼容性的同时,Swift语言本身将继续发展,并且二进制接口也将发生变化。为安全起见,应使用相同版本的Xcode和Swift编译器构建应用程序的所有组件,以确保它们可以一起使用。

这意味着需要仔细管理框架。例如,如果您的项目使用框架与嵌入式扩展共享代码,则将需要一起构建框架,应用程序和扩展。依靠使用Swift的二进制框架(尤其是第三方)会很危险。随着Swift的变化,这些框架将与您的其他应用程序不兼容。当二进制接口稳定一两年后,Swift运行时将成为主机OS的一部分,并且此限制将不再存在。


12

我测试了在iPod Touch(第3代)设备上运行基于Swift的裸机应用程序。看来基于Swift的应用无法在iOS 5.x上运行,但可以在iOS 6.x上运行。

这是我尝试使用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

对于iOS 6.1.6,该应用程序可以正常运行而不会显示这些错误消息。


12

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

Apple开发人员Swift博客:Objective-C id as Swift Any

2014年7月11日

兼容性

我们在WWDC上听到的最常见的问题之一是:“ Swift的兼容性故事是什么?”。这似乎是一个很棒的第一个主题。

应用程序兼容性简而言之,如果您今天编写一个Swift应用程序并在iOS 8和OS X Yosemite发行时于今年秋天将其提交给App Store,您可以相信您的应用程序将来会很好用。实际上,您可以使用同一应用将其定位回OS X Mavericks或iOS 7。这是可能的,因为Xcode在您的应用程序包中嵌入了一个小的Swift运行时库。由于该库是嵌入式库,因此您的应用程序使用在过去,现在和将来的OS版本上运行的Swift的一致版本。


11

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


10

尝试以下代码:

没有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
}

以及如何使用nav.rootviewcontroller?
艾伦2014年

8

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


8

谈到Swift框架。对于今天,对于Xcode 6.1.1(6A2008a)版本,如果Swift框架针对iOS 7.1,则链接器报告警告

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

并且应用程序无法提交到AppStore。检查此问题:Lint以防止动态库和框架随iOS 7一起传递


Swift Framework Mach-O Type必须为Dynamic Library,但是,iOS 7 Static Library仅接受。
DawnSong

7

快速更新(自2015年2月15日起生效),我们无法将使用iOS 8之前SDK开发的应用提交到商店。因此,请记住这一点,最好不要担心此问题,因为许多人建议使用Swift开发的应用程序也可以部署到OS X 10.9和iOS 7.0


您能为我们提供资料吗?
Binus

1
Base SDK和Deployment Target之间有区别。您可以拥有iOS 9的基本SDK 和iOS 7的部署目标,然后提交到iTunes Connect。拒绝投票,因为您未提供来源。
心教堂

1
:目前苹果仍然文件提到了的iOS 4.3支持developer.apple.com/library/content/documentation/IDEs/...
心教堂

1

Leandros发布的已回答代码段似乎有些陈旧。我已经修复并使其可在Swift 5中编译。

迅捷5

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let controller = UIViewController()
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 568))
    view.backgroundColor = UIColor.red
    controller.view = view

    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
    label.center = CGPoint(x: 160, y: 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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.