【问题标题】:Do Swift-based applications work on OS X 10.9/iOS 7 and lower?基于 Swift 的应用程序是否可以在 OS X 10.9/iOS 7 及更低版本上运行?
【发布时间】:2014-07-22 23:57:56
【问题描述】:

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

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

或者我应该如何使用 Mac OS 创建一个 Swift 应用程序?

【问题讨论】:

  • 假设 Swift 被编译成一个“正常”的可执行文件,并且假设操作系统中不需要 Swift 特定的运行时库,那么是的,它应该在旧系统上运行。我们只是还不知道。下载 Xcode 6 并尝试一下。
  • 国情咨文视频中会找到官方答案。
  • @rmaddy FWIW:在 WWDC 上,在 Swift 演示中,最清楚地表明 Swift 和 Objective-C 具有相同的运行时。
  • 这是公共知识,甚至在主题演讲中提到它可以在这些操作系统上运行。
  • 这个问题是在tour page 上用作示例的问题。

标签: swift xcode macos


【解决方案1】:

我刚刚为你测试过,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
}

【讨论】:

  • stackoverflow.com/questions/24007050/… - 它与这个答案冲突(至少是“甚至更低”的部分)。
  • 我只测试了 iOS 7.0 和 OS X 10.9。如答案所述。
  • @Leandros 通过使用 var 关键字,为什么我们需要在 "var controller: UIViewController = UIViewController()" 这一行中输入两次 UIViewController? var 是否与 JavaScript/C# 不同(如果不是,那么很伤心)?这是强制转换,但等号两边的对象类型相同吗?
  • @TienDo 我没有任何 Swift 经验,但我想冒号后的第一个 UIViewController 代表变量的类型,而 = 符号后的第二个出现调用构造函数(初始化变量)。
  • 对于 iOS:在 Xcode 6 beta 中,有直到 iOS 6 的部署目标。我对它们进行了全部测试,找到了。有一些答案是相同的。
【解决方案2】:

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

【讨论】:

  • Greg,感谢您来这里回答问题。你能说一下 10.8->10.9 和 6.x->7.0 的哪些变化允许从 Swift 生成的代码运行吗?
  • Swift 在 Objective-C 元数据中设置一些位来标记 Swift 类。 OS X 10.9 和 iOS 7.0 中的 libobjc 已更改为忽略这些位,以便为 Swift 的到来做准备。旧的操作系统版本会被这些位混淆。
  • 如果 Apple 考虑让 Swift 应用程序也可以在旧平台上运行(至少从 OSX 10.7 开始),我会非常感谢。原因是我们仍然有很多客户使用这个操作系统,所以如果 10.9 是最低支持的操作系统,我们将无法开始使用 Swift 开发多年!
  • @GregParker 您是否有机会为 Swift 2 更新此答案,无论运行时要求是否已更改?
  • 支持 Swift 构建的可执行文件的最低部署目标仍然是 iOS 7.0 和 OSX 10.9。在 iOS 7/OSX 10.9 或更早版本中弃用的 API 将不可用。在构建时,Swift 仅支持它在 Xcode 中附带的 SDK。
【解决方案3】:

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

【讨论】:

  • 真的 WWDC 是用 Swift 编写的吗??
  • 是的,WWDCC 应用程序是用 Swift 编写的。正如他们昨天所说。
  • Apple 的营销策略是企业常用的营销策略。 Windows 是用汇编语言编写的!好吧,只有引导加载程序和其他一些东西,但它用汇编编写的。
  • @IvanVučica 但 4 个类足以回答兼容性问题。
【解决方案4】:

更新 - 根据 Xcode 6 Beta 4

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

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

From Xcode 6 release note

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


Swift 应用程序可以在 iOS 6 上运行。尽管很多人都说 Swift 将只支持 iOS 7+ 和 OS X 10.9+,但根据我的经验并非如此。

我已经在 iOS 6 设备上测试了一个完全用 Swift 编写的简单应用程序。它工作得很好。正如 Apple 所说,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(相应的 API 不适用于 Objective-C),您的应用程序将在 iOS 6 或更高版本上无缝运行(经过测试并正常运行),即使在 iOS 5(未经测试)上也是如此。 Swift 中的大多数 API 只是现有 Objective-C API 的替代品。实际上它们在二进制中是相同的。

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


【讨论】:

  • 和之前的系统更新一样,部分框架/类已经停产,需要有条件地支持。
  • @TienDo 不需要分号:) 即使你输入错误(这是一个传统)也不会成为问题
  • 但是如果你真的想要,你仍然可以使用分号。一行中的两条语句用分号隔开
【解决方案5】:

简而言之:

基于 Swift 的应用程序可以通过相同的应用程序定位回 OS X MavericksiOS 7

怎么可能?

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

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

因为我并没有像一个苹果人在推特上告诉我的那样给出这个答案,或者我写了 hello world 并对其进行了测试。

我是从apple developer blog那里拿到的。

所以你可以相信这个。

【讨论】:

  • "small" 大约需要 20 mb 左右。 :)
  • 在二进制文件中包含整个运行时可能看起来有点臃肿,但由于 Swift 还不是完全稳定的,所以他们允许开发人员在自己的时间使用新版本的 Swift 重新编译是有意义的,而不是更新一些共享库并破坏每个人的应用程序。一旦 Swift 稳定下来,我假设运行时将与其他所有内容一起存储在某个 dylib 中。
  • @WilliamTFroggard - 是的,希望如此
【解决方案6】:

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

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

【讨论】:

  • 看起来使用 Xcode Beta 6 将允许您在 10.9.3 上运行 swift 应用程序,但我不确定 swift 应用程序能够运行多远,例如 10.7 或 10.8?
【解决方案7】:

我阅读了所有回答:不,Swift 不适用于低于 iOS 7 的版本。但我说是的,我刚刚创建了一个在 Xcode 5 中运行且具有 6.0 部署目标的 Swift 项目.

  • 我刚刚在 Xcode 6 BETA 中创建了一个演示项目,并选择了 Swift 编程语言。
  • 关闭 Xcode 6 beta,我在 Xcode 5 中打开这个演示项目,部署目标为 6.0
  • 同时选择simulator 6.1

然后该项目在 simulator 6.1 中运行良好。我的 MacOS X 是 10.9.3,所以我说是的,它在低于 iOS 7 的环境下运行。使用 10.9.3 Mac OS X

这是模拟器的截图:

Here is a demo as well

【讨论】:

  • 问题:没有swift支持XCode-5如何构建swift源码?
  • 你可以看到模拟器截图 :) 我没有在 photoshop 中创建上面附加的截图
  • 我的意思是我已经将一个客观的 c 应用程序转换为 swift 并且有使用 ios 6 的客户。那么 swift 应用程序会起作用吗?
  • 首先你尝试使用演示代码,如果它有效,那么是的,definaty 有效
【解决方案8】:

虽然代码证实了这一点,但 Apple 在其技术主题演讲中表示 Swift 将兼容 iOS 7 和 Mavericks(平台状态,第 102 节,大约 34 分 00 秒)在WWDC 2014

【讨论】:

    【解决方案9】:

    如 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 上运行

    【讨论】:

    • 我认为各种部署目标还不正确(XCode 6 是测试版)。仅仅因为您可以选择该值并不意味着它有效。我尝试使用 OSX 10.7 作为目标,但它确实工作。另请注意,Greg Parker 已在上面给出了有关平台的权威确认。
    • @Mike Lischke,再次,我有几个测试来支持我的论点。当我选择部署目标 10.7 时,我可以运行 OS X 应用程序。但我很感激你提出了 OS X 应用程序支持的线程。
    • 那你如何解释我的结果呢?格雷格帕克写的怎么样?如果 Swift Apps 可以在 10.7 上运行,我会非常高兴,但到目前为止我还没有看到一个可行的示例。当然,我也可以将 10.7 设置为部署目标,但这并没有什么不同。应用程序崩溃。
    • @Mike Lischke,你在设备上测试过 iOS 应用吗?
    • 我也看到并测试了 Xcode 6 beta 中的所有部署目标(与答案相同)。使用 2 个不同的测试应用运行良好。
    【解决方案10】:

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

    【讨论】:

      【解决方案11】:

      这是我从苹果 Swift 博客上读到的帖子,可能会有所帮助:

      应用兼容性

      如果您编写了一个 Swift 应用程序,您可以相信您的应用程序在未来会运行良好。事实上,您可以使用同一个应用程序重新定位到 OS X Mavericks 或 iOS 7。这是可能的,因为 Xcode 在您的应用程序包中嵌入了一个小型 Swift 运行时库。由于该库是嵌入式的,因此您的应用使用一致的 Swift 版本,可在过去、现在和未来的操作系统版本上运行。

      二进制兼容性和框架:

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

      这意味着需要谨慎管理框架。例如,如果您的项目使用框架与嵌入式扩展共享代码,您将希望一起构建框架、应用程序和扩展。依赖使用 Swift 的二进制框架是很危险的——尤其是来自第三方的。随着 Swift 的变化,这些框架将与您的应用程序的其余部分不兼容。当二进制接口在一两年内稳定下来时,Swift 运行时将成为宿主操作系统的一部分,这种限制将不再存在。

      【讨论】:

        【解决方案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,应用程序运行良好,不显示这些错误消息。

        【讨论】:

          【解决方案13】:

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

          Apple developer swift blog : 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 运行时库。由于该库是嵌入式的,因此您的应用使用一致的 Swift 版本,可在过去、现在和未来的操作系统版本上运行。

          【讨论】:

            【解决方案14】:

            我还在 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 的部署目标)

            【讨论】:

              【解决方案15】:

              试试下面的代码:

              它在没有 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 ??
              【解决方案16】:

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

              【讨论】:

                【解决方案17】:

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

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

                并且应用程序无法提交到 AppStore。检查这个问题:Lint to prevent dynamic libraries and frameworks from passing with iOS 7

                【讨论】:

                • Swift 框架的Mach-O Type 必须是Dynamic Library,然而,iOS 7 只接受Static Library
                【解决方案18】:

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

                【讨论】:

                • 你能给我们提供一个来源吗?
                • Base SDK 和 Deployment Target 是有区别的。您可以拥有 iOS 9 的 Base SDK 和 iOS 7 的部署目标并提交到 iTunes Connect。因为您没有提供来源而投反对票。
                • 当前的 Apple 文档仍然提到对 iOS 4.3 的支持:developer.apple.com/library/content/documentation/IDEs/…
                【解决方案19】:

                Leandros 发布的Answered code-snippet 似乎有点老了。我已修复并使其可在 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
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-11-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多