[英]Do Swift-based applications work on OS X 10.9/iOS 7 and lower?
我刚刚为你测试过,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 代码可以部署到 OS X 10.9 和 iOS 7.0。 它通常会在较旧的操作系统版本上启动时崩溃。
Apple 宣布 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 编写的简单应用程序。 它工作得很好。 正如 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(请参阅上面的更新)。 So swift 将不再适用于 iOS6 及以下
基于 Swift 的应用程序可以使用相同的应用程序返回OS X Mavericks或iOS 7 。
Xcode 将一个小型 Swift 运行时库嵌入到您的应用程序包中。 由于该库是嵌入式的,因此您的应用程序使用一致版本的 Swift,可以在过去、现在和未来的操作系统版本上运行。
因为我并不是像一个苹果人在 Twitter 上告诉我的那样说出这个答案,或者我写了 hello world 并对其进行了测试。
我从苹果开发者博客上拿来的。
所以你可以相信这个。
Swift 使用与Objective-C相同的运行时,甚至可以在同一个应用程序中并排使用 Objective-C(根据 WWDC 2014 主题演讲)。
这需要使用Xcode 6 和新 SDK 进行检查/验证才能找到最终答案。
我阅读了所有回答说:不,Swift 不能在低于 iOS 7 的情况下工作。但我说是,我刚刚创建了一个 Swift 项目,该项目确实在 Xcode 5 中运行,部署目标为 6.0。
然后该项目在模拟器 6.1 中运行良好。 我的MacOS X 是 10.9.3 ,所以我说是的,它运行在低于iOS 7. 10.9.3 Mac OS X 。
这是模拟器的截图:
虽然代码证实了这一点,但 Apple 自己在WWDC 2014的技术主题演讲(平台状态,第102 场会议,大约 34 分 00 秒)中表示,Swift 将与 iOS 7 和 Mavericks 兼容。
如 Beta 4 发行说明中所述, iOS 7 及更高版本支持 Swift 应用程序。
Xcode 6 Beta 中的 iOS 6.0、6.1、7.0、7.1、8.0
Swift 应用程序在OS X 10.9 及更高版本的平台上受支持。
部署目标中的 OS X 10.4 到 10.10。
我已经针对 10.5 到 10.10 进行了测试,并在 10.9.3 上运行
看来 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 的应用程序工作得很好。
这是我从苹果 Swift 博客上读到的帖子,可能会有所帮助:
如果您编写了一个 Swift 应用程序,您可以相信您的应用程序将在未来运行良好。 事实上,您可以使用相同的应用程序返回OS X Mavericks 或 iOS 7 。 这是可能的,因为 Xcode 在您的应用程序包中嵌入了一个小型 Swift 运行时库。 由于该库是嵌入式的,因此您的应用程序使用一致版本的 Swift,可以在过去、现在和未来的操作系统版本上运行。
在确保您的应用程序的运行时兼容性的同时,Swift 语言本身会不断发展,二进制接口也会发生变化。 为安全起见,您的应用程序的所有组件都应使用相同版本的 Xcode 和 Swift 编译器构建,以确保它们协同工作。
这意味着需要谨慎管理框架。 例如,如果您的项目使用框架与嵌入式扩展共享代码,您将希望一起构建框架、应用程序和扩展。 依赖使用 Swift 的二进制框架是很危险的——尤其是来自第三方的。 随着 Swift 的变化,这些框架将与应用程序的其余部分不兼容。 当二进制接口在一两年内稳定下来时,Swift 运行时将成为主机操作系统的一部分,这种限制将不再存在。
我测试了在 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 运行时库。 由于该库是嵌入式的,因此您的应用程序使用一致版本的 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。 检查这个问题:防止动态库和框架通过 iOS 7 的 Lint
是的,事实上 Apple 已经宣布 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 中编译。
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.