Swiftベースのアプリケーションは OS X 10.9 (Mavericks)/ iOS 7以下で動作しますか?
例えば、私は OS X 10.8 (Mountain Lion)を走らせているマシンを持っています、そして私がSwiftで書いたアプリケーションがそれで動くかどうか疑問に思います。
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にデプロイできます。通常、古いOSバージョンでは起動時にクラッシュします。
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
の2つのファイルしかありません。
したがって、iOS 8 SDKの一部として追加された新しいAPIやSwift固有のAPI(Objective-Cでは対応するAPIは利用できません)を使用していない場合、アプリケーションはiOS 6以降(テスト済みおよび動作中)でもシームレスに動作します。 iOS 5の場合(未テスト)。 SwiftのほとんどのAPIは、既存のObjective-C APIに代わるものです。実際、それらはバイナリで同じです。
注:Swiftアプリケーションのデプロイメント対象のXcode 6 Beta 4によると、iOS 7またはOS X 10.9である必要があります(上記の更新を参照)。したがって、SwiftはiOS6以下では使用できなくなります
Swiftベースのアプリケーションは、同じアプリで OS X Mavericks または iOS 7 をターゲットに戻すことができます。
Xcodeは 小さなSwiftランタイムライブラリをアプリのバンドル に埋め込みます。ライブラリが埋め込まれているので、あなたのアプリは過去、現在、そして将来のOSリリースで動作するSwiftの一貫したバージョンを使用します。
私がこの答えを言っているのはAppleの一人の人がTwitterで私に言ったように言っているのではなく、hello worldを書いてテストしたからです。
アップルの開発者ブログ から入手しました。
だからあなたはこれを信頼することができます。
Swiftは Objective-C と同じランタイムを使用し、同じアプリケーション内にObjective-Cを並べて配置することもできます(WWDC 2014基調講演のとおり)。
これは Xcode 6と新しいSDKを使って最終的な答えを見つけるためにチェック/検証する必要があります。
いいえ、SwiftはiOS 7未満では動作しません。しかし、 _ yes _ と言ったのですが、Xcode 5と6.0のデプロイメントターゲットで動作するSwiftプロジェクトを作成しました。
それからそのプロジェクトは simulator 6.1 でうまく動きます。私の MacOS Xは10.9.3 なので、私はそう言った、それは iOS 7より低い10.9.3で動く - Mac OS X 。
これがシミュレータのスクリーンショットです。
コードはそれを確認しますが、Apple自体は、SwiftがiOS 7およびMavericksで技術基調講演(State of the platform、セッション102、約34分00秒のマーク) WWDC 2014 で。
Swiftアプリケーションは iOS 7以降 Beta 4リリースノートに記載されているように/でサポートされます。 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で実行することをテストしました
これは私がApple Swiftブログから読んだ記事です、役に立つかもしれません:
あなたがSwiftアプリを書くならば、あなたはあなたのアプリが将来うまくいくであろうと信じることができます。実際、同じアプリで、 OS X MavericksまたはiOS 7 に戻すこともできます。 Xcodeがあなたのアプリのバンドルの中に小さなSwiftランタイムライブラリを埋め込むので、これは可能です。ライブラリが埋め込まれているので、あなたのアプリは過去、現在、そして将来のOSリリースで動作するSwiftの一貫したバージョンを使用します。
アプリのランタイム互換性は保証されていますが、Swift言語自体も進化し続け、バイナリインタフェースも変わります。安全のために、アプリのすべてのコンポーネントは、同じバージョンのXcodeとSwiftコンパイラを使用して構築されていることを確認してください。
つまり、フレームワークは慎重に管理する必要があります。たとえば、プロジェクトでフレームワークを使用してコードを埋め込みエクステンションと共有する場合は、フレームワーク、アプリケーション、およびエクステンションをまとめて構築する必要があります。 Swiftを使用するバイナリフレームワークに頼るのは危険です - 特に第三者からのものです。 Swiftが変更されると、これらのフレームワークは他のアプリと互換性がなくなります。バイナリインターフェースが1〜2年で安定すると、SwiftランタイムはホストOSの一部となり、この制限はなくなります。
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を多用する他のアプリケーションは問題なく動作します。
私はiPod Touch(3rd gen)デバイスで素のSwiftベースのアプリを実行することをテストしました。 Swiftベースのアプリケーションのように見えます しない 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では、これらのエラーメッセージを表示せずにアプリは正常に動作します。
ここには古い答えがたくさんあるように思われるので、私はSwiftチームからの公式の回答を投稿したいと思いました。 SwiftはOS X MavericksとiOS 7との後方互換性があります
アップルの開発者Swiftブログ:Swift AnyとしてのObjective-CのID
2014年7月11日
互換性
WWDCでよく聞かれる質問の1つは、「Swiftの互換性ストーリーは何ですか?」です。これはすばらしい最初のトピックのようです。
App Compatibility iOS 8とOS X Yosemiteがリリースされた今週Swiftアプリを作成して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 Frameworksになると。今日のように、Xcodeバージョン6.1.1(6A2008a)では、SwiftフレームワークがiOS 7.1をターゲットにしている場合、リンカーは警告を報告します
ld: warning: embedded dylibs/frameworks only run on iOS 8 or later.
アプリケーションをAppStoreに送信することはできません。この問題をチェックしてください: 動的ライブラリとフレームワークがiOS 7で合格するのを防ぐための手掛かり /
はい。実際、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
}