基于swift的应用程序能在OS X 10.9/iOS 7及更低版本上运行吗?

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

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

或者我应该有什么创建一个Swift应用程序使用Mac OS?

110866 次浏览

Swift使用与objective - c相同的运行时,甚至可以在同一个应用程序中与Objective-C共存(根据WWDC 2014的主题)。

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

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

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

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

虽然代码证实了这一点,但苹果自己已经在WWDC 2014的技术主题演讲(平台状态,第102次会议,大约34秒标记)中表示,Swift将在iOS 7和Mavericks上兼容。

我看了所有回答:不,Swift不能在ios7以下的系统下工作。但是我说是的,我刚刚创建了一个Swift项目,它在Xcode 5中运行,部署目标为6.0。

  • 我只是在Xcode  6β中创建了一个演示项目,选择了Swift编程语言。
  • 关闭xcode 6 beta版,然后在xcode 5中以部署目标6.0打开这个演示项目
  • 同时选择6.1模拟器

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

这是模拟器的截图:

Enter image description here

这是一个演示以及

更新-根据Xcode 6 Beta 4

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

Swift编译器和Xcode现在强制ios7或OS X的最低部署目标 小牛。

.设置较早的部署目标将导致构建失败

From Xcode 6 release note

所以我之前的答案(如下所示)将不适用于任何进一步的开发。Swift将不再适用于iOS6及以下系统


Swift应用可以在iOS 6上运行。尽管很多人说Swift只支持iOS 7+和OS X 10.9+,但从我的经验来看,事实并非如此。

# EYZ0。正如苹果所说,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及


试试下面的代码:

它在没有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应用程序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的应用程序也可以正常工作。

我在iPod Touch(第三代)设备上测试了一个基于swift的基本应用程序。基于swift的应用似乎可以在iOS 5上使用。但适用于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.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的部署目标)

Swift应用程序支持iOS 7及以上版本,如Beta 4发布说明所述。# EYZ1

Swift应用程序支持OS X 10.9及以上版本平台。# EYZ1

这是我从apple Swift博客上读到的一篇文章,可能会有帮助:

# EYZ0:

如果你写了一个Swift应用程序,你可以相信你的应用程序将来会工作得很好。事实上,你可以用同一个应用程序返回到OS X Mavericks或iOS 7。这是可能的,因为Xcode在你的应用程序包中嵌入了一个小的Swift运行时库。因为这个库是嵌入式的,所以你的应用程序使用了一个一致的Swift版本,可以在过去、现在和未来的操作系统版本上运行。

二进制兼容性和框架:

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

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

简而言之:

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

这怎么可能?

Xcode嵌入了在你的应用程序包里的小Swift运行时库。因为这个库是嵌入式的,所以你的应用程序使用了一个一致的Swift版本,可以在过去、现在和未来的操作系统版本上运行。

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

因为我不是像一个苹果人在推特上告诉我的那样说这个答案,或者我写了hello world并测试了它。

我从苹果开发者博客取的。

所以你可以相信这个。

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

苹果开发者swift博客:Objective-C id as swift Any

2014年7月11日

兼容性

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

< p >应用程序兼容性 简单地说,如果你今天写了一个Swift应用程序,并在今年秋天iOS 8和OS X Yosemite发布时将其提交到app Store,你可以相信你的应用程序在未来会运行良好。这是可能的,因为Xcode在你的应用程序包中嵌入了一个小的Swift运行时库。因为这个库是嵌入式的,所以你的应用程序使用了一个一致的Swift版本,可以在过去、现在和未来的操作系统版本上运行
当涉及到Swift框架时。 目前,在Xcode 6.1.1 (6A2008a)版本中,如果Swift框架针对iOS 7.1,链接器报告警告

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

并且应用程序无法提交到AppStore。检查这个问题:防止动态库和框架在ios7中传递

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

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

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
}