首页 文章

基于Swift的应用程序是否适用于OS X 10.9 / iOS 7及更低版本?

提问于
浏览
605

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

例如,我有一台运行OS X 10.8(Mountain Lion)的机器,我想知道我在Swift中编写的应用程序是否会运行它 .

18 回答

  • 8

    如Beta 4发行说明中所述, iOS 7 and above 支持Swift应用程序 . Xcode 6 Beta中的iOS 6.0,6.1,7.0,7.1,8.0

    平台 OS X 10.9 and above 支持Swift应用程序 . 部署目标中的OS X 10.4到10.10 . 我已经测试了10.5到10.10的目标,并在10.9.3上运行

  • 12

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

  • 99

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

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

  • 7

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

  • 15

    更新 - 根据Xcode 6 Beta 4

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

    From Xcode 6 release note

    So my previous answer(Shown below) will not be applicable to any further development. Swift will no longer available for iOS6 and below


    Swift应用程序可以在iOS 6上运行 . 虽然很多人都说Swift只支持iOS 7和OS X 10.9,但从我的经验来看并非如此 .

    I have tested a simple application written completely in Swift in an iOS 6 device. It works perfectly fine . 正如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的替代品 . 实际上它们在二进制中是相同的 .

    Note: As per Xcode 6 beta 4 for swift apps deployment target should be iOS 7 or OS X 10.9(see the above update). So swift will no longer available for iOS6 and below


  • 512

    简而言之:

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

    怎么可能?

    Xcode嵌入 small Swift runtime library within your app’s bundle . 由于库是嵌入式的,因此您的应用程序使用一致的Swift版本,该版本可在过去,现在和未来的OS版本上运行 .

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

    因为我不是说这个答案就像一个苹果家伙在推特上告诉我或者我写了你好世界并测试了它 .

    我从apple developer blog拿走了它 .

    所以你可以相信这一点 .

  • 11

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

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

  • 22

    我读了所有的答案说:不,Swift不能用于iOS 7.但是我说 YES ,我刚刚创建了一个Swift项目,它在Xcode 5中运行,具有6.0部署目标 .

    • 我只是在选择了Swift编程语言的 Xcode 6 BETA 中创建一个演示项目 .

    • 关闭Xcode 6 beta,我在部署目标6.0的Xcode 5中打开这个演示项目

    • 并选择 simulator 6.1 .

    那个项目在 simulator 6.1 运行良好 . 我的 MacOS X is 10.9.3 ,所以我说是的,它的运行速度低于 iOS 7. with 10.9.3 Mac OS X .

    这是模拟器的屏幕截图:

    Enter image description here

    Here is a demo as well

  • 30

    看来Swift应用程序 don'tOS 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的应用程序运行得很好 .

  • 20

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

    应用程序兼容性:

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

    二进制兼容性和框架:

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

    这意味着需要仔细管理框架 . 例如,如果您的项目使用框架与嵌入式扩展共享代码,那么您将需要一起构建框架,应用程序和扩展 . 依赖使用Swift的二进制框架是危险的 - 尤其是来自第三方的框架 . 随着Swift的改变,这些框架将与您的应用程序的其余部分不兼容 . 当二进制接口在一年或两年内稳定时,Swift运行时将成为主机操作系统的一部分,并且此限制将不再存在 .

  • 14

    我测试了在iPod Touch(第三代)设备上运行基于Swift的裸机应用程序 . 看起来基于Swift的应用程序 don't 适用于iOS 5.x但 do 适用于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,应用程序运行正常,但不显示这些错误消息 .

  • 10

    这里似乎有很多旧的答案,所以我只想发布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,您可以相信您的应用程序将在以后很好地运行 . In fact, you can target back to OS X Mavericks or iOS 7 with that same app. 这是可能的,因为Xcode在您的应用程序包中嵌入了一个小的Swift运行时库 . 由于库是嵌入式的,因此您的应用程序使用一致的Swift版本,该版本可在过去,现在和未来的OS版本上运行 .

  • 8

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

  • 102

    请尝试以下代码:

    它没有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
    }
    
  • 32

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

  • 12

    谈到Swift Frameworks . 至于今天,使用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

  • 196

    快速更新,从 February 15th, 2015 生效,我们无法将应用程序提交到使用 SDK prior to iOS 8 开发的商店 . 所以,记住这一点,最好不要担心这个问题,因为很多人都建议用Swift制作的应用程序也可以部署到 OS X 10.9 and iOS 7.0 .

相关问题