基于Swift的应用程序是否可以在OS X 10.9(Mavericks)/ iOS 7及更低版本上运行?
例如,我有一台运行OS X 10.8(Mountain Lion)的机器,我想知道我在Swift中编写的应用程序是否会运行它。
答案 0 :(得分:518)
我刚刚为您测试过,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
}
答案 1 :(得分:198)
可以将Swift代码部署到OS X 10.9和iOS 7.0。它通常会在较旧的操作系统版本上启动时崩溃。
答案 2 :(得分:104)
答案 3 :(得分:100)
iOS 7和OS X 10.9最低部署目标
Swift编译器和Xcode现在强制实施iOS 7或OS X的最低部署目标 小牛。设置较早的部署目标会导致构建失败。
所以我之前的回答(如下所示)将不适用于任何进一步的开发。 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.swift
和ViewController.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及以下
答案 4 :(得分:33)
基于Swift的应用程序可以使用同一个应用程序回溯到 OS X Mavericks 或 iOS 7 。
Xcode在您应用的捆绑包中嵌入小型Swift运行时库。由于库是嵌入式的,因此您的应用程序使用一致的Swift版本,该版本可在过去,现在和将来的操作系统版本上运行。
因为我不是说这个答案是因为一个苹果人在推特上告诉我,或者我写了一个问候世界并对其进行了测试。
我是从apple developer blog获得的。
所以你可以相信这一点。
答案 5 :(得分:30)
Swift使用与Objective-C相同的运行时,甚至可以在同一个应用程序中使用并行的Objective-C(根据WWDC 2014主题演讲)。
这需要使用Xcode 6和新SDK进行检查/验证,以找到最终答案。
答案 6 :(得分:22)
我读了所有的答案:不,Swift不能用于iOS 7.但是我说 YES ,我刚刚创建了一个Swift项目,它在Xcode 5中运行,6.0部署目标
然后该项目在模拟器6.1 中运行良好。我的 MacOS X是10.9.3 ,所以我说是的,运行速度低于 iOS 7. 10.9.3 Mac OS X 。
这是模拟器的截图:
<强> Here is a demo as well 强>
答案 7 :(得分:20)
虽然代码证实了这一点,但Apple本身已经表示Swift将在其技术主题演讲中与iOS 7和Mavericks兼容(平台状态,会话102,大约34分00秒标记)在WWDC 2014。
答案 8 :(得分:15)
iOS 4及以上版本支持Swift应用程序,如Beta 4发行说明中所述。 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上运行
答案 9 :(得分: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的应用程序运行得很好。
答案 10 :(得分:14)
这是我从苹果Swift博客上读到的帖子,可能会有所帮助:
如果你编写一个Swift应用程序,你可以相信你的应用程序将来会很好用。事实上,您可以使用同一个应用程序回溯到 OS X Mavericks或iOS 7 。这是可能的,因为Xcode在您的应用程序包中嵌入了一个小的Swift运行时库。由于库是嵌入式的,因此您的应用程序使用一致的Swift版本,该版本可在过去,现在和将来的操作系统版本上运行。
虽然确保了应用程序的运行时兼容性,但Swift语言本身将继续发展,二进制接口也将发生变化。为了安全起见,应用应使用相同版本的Xcode和Swift编译器构建应用程序的所有组件,以确保它们协同工作。
这意味着需要谨慎管理框架。例如,如果您的项目使用框架与嵌入式扩展共享代码,您将需要一起构建框架,应用程序和扩展。依赖使用Swift的二进制框架是危险的 - 尤其是来自第三方的框架。随着Swift的变化,这些框架将与您的应用程序的其余部分不兼容。当二进制接口在一年或两年内稳定下来时,Swift运行时将成为主机操作系统的一部分,并且此限制将不再存在。
答案 11 :(得分:12)
我测试了在iPod Touch(第三代)设备上运行基于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 :(得分:12)
这里似乎有很多旧的答案,所以我只想发布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版本,该版本可在过去,现在和将来的操作系统版本上运行。
答案 13 :(得分: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的部署目标)
答案 14 :(得分: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
}
答案 15 :(得分:8)
谈到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
答案 16 :(得分:8)
是的,实际上Apple宣布Swift应用程序将向后兼容iOS 7和OS X Mavericks。此外,WWDC应用程序是用Swift编程语言编写的。
答案 17 :(得分:7)
快速更新,从 2015年2月15日生效,我们无法向使用iOS 8之前的 SDK 开发的商店提交应用。因此,记住这一点,最好不要担心这个问题,因为许多人建议用Swift制作的应用程序也可以部署到 OS X 10.9和iOS 7.0 。
答案 18 :(得分:0)
Answered code-snippet似乎有些陈旧。我已经修复并使其可在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
}