基于Swift的应用程序是否可以在OS X 10.9(Mavericks)/ iOS 7及更低版本上运行?
例如,我有一台运行OS X 10.8(Mountain Lion)的计算机,我想知道我用Swift编写的应用程序是否可以在其上运行。
还是我必须使用Mac OS创建Swift应用程序?
基于Swift的应用程序是否可以在OS X 10.9(Mavericks)/ iOS 7及更低版本上运行?
例如,我有一台运行OS X 10.8(Mountain Lion)的计算机,我想知道我用Swift编写的应用程序是否可以在其上运行。
还是我必须使用Mac OS创建Swift应用程序?
Answers:
我刚刚为您测试过,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
}
UIViewController
冒号后面的第一个代表变量的类型,而第二个出现在=
符号调用构造函数(初始化变量)之后。
可以将Swift代码部署到OS X 10.9和iOS 7.0。在较旧的OS版本上启动时,它通常会崩溃。
苹果已经宣布,Swift应用程序将与iOS 7和OS X Mavericks向后兼容。WWDC应用程序是用Swift编写的。
iOS 7和OS X 10.9最低部署目标
Swift编译器和Xcode现在强制执行iOS 7或OS X Mavericks的最低部署目标。设置较早的部署目标会导致构建失败。
因此,我先前的答案(如下所示)将不适用于任何进一步的开发。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.swift
和ViewController.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及以下版本
基于Swift的应用程序可以使用同一应用程序重新定向到OS X Mavericks或iOS 7。
Xcode 在应用程序的bundle中嵌入了一个小的Swift运行时库。由于该库是嵌入式库,因此您的应用程序使用在过去,现在和将来的OS版本上运行的Swift的一致版本。
因为我不是说这个答案,就像一个苹果家伙在推特上告诉我的那样,否则我写了hello world并对其进行了测试。
我从苹果开发者博客上摘下来的。
这样您就可以相信。
Swift使用与Objective-C相同的运行时,甚至可以在同一应用程序中并排使用Objective-C(根据WWDC 2014主题演讲)。
这需要使用Xcode 6和新的SDK 进行检查/验证,以找到最终答案。
我读了所有回答:不,Swift不能在低于iOS 7的环境下运行。但是我说是,我只是创建了一个Swift项目,该项目确实在带有6.0部署目标的Xcode 5中运行。
然后该项目在模拟器6.1中运行良好。我的MacOS X是10.9.3,所以我说是的,它运行在低于iOS 7的操作系统上,而Mac OS X是10.9.3。。
这是模拟器的屏幕截图:
如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上运行
看来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的其他应用程序也可以正常工作。
这是我从apple Swift博客阅读的帖子,可能会有所帮助:
如果您编写了一个Swift应用程序,您可以相信您的应用程序在将来会很好用。实际上,您可以使用同一应用将其定位回OS X Mavericks或iOS 7。这是可能的,因为Xcode在您的应用程序包中嵌入了一个小的Swift运行时库。由于该库是嵌入式库,因此您的应用程序使用在过去,现在和将来的OS版本上运行的Swift的一致版本。
在确保应用程序的运行时兼容性的同时,Swift语言本身将继续发展,并且二进制接口也将发生变化。为安全起见,应使用相同版本的Xcode和Swift编译器构建应用程序的所有组件,以确保它们可以一起使用。
这意味着需要仔细管理框架。例如,如果您的项目使用框架与嵌入式扩展共享代码,则将需要一起构建框架,应用程序和扩展。依靠使用Swift的二进制框架(尤其是第三方)会很危险。随着Swift的变化,这些框架将与您的其他应用程序不兼容。当二进制接口稳定一两年后,Swift运行时将成为主机OS的一部分,并且此限制将不再存在。
我测试了在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,该应用程序可以正常运行而不会显示这些错误消息。
这里似乎有很多旧答案,所以我只想发布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的一致版本。
我还在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的部署目标)
尝试以下代码:
没有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。检查此问题:Lint以防止动态库和框架随iOS 7一起传递
Mach-O Type
必须为Dynamic Library
,但是,iOS 7 Static Library
仅接受。
快速更新(自2015年2月15日起生效),我们无法将使用iOS 8之前的SDK开发的应用提交到商店。因此,请记住这一点,最好不要担心此问题,因为许多人建议使用Swift开发的应用程序也可以部署到OS X 10.9和iOS 7.0。
Leandros发布的已回答代码段似乎有些陈旧。我已经修复并使其可在Swift 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
}