From dca5f28eebe4462eecca102138615facaec354e8 Mon Sep 17 00:00:00 2001 From: oozoofrog Date: Sat, 14 Feb 2026 15:23:16 +0900 Subject: [PATCH 1/2] Refine modernization changes and add Swift test coverage --- Package.swift | 16 +++++++ README.md | 5 ++ .../DocumentPathResolver.swift | 18 ++++++++ .../SwiftPlayer.xcodeproj/project.pbxproj | 14 +++--- SwiftPlayer/SwiftPlayer/AppDelegate.swift | 37 ++++++--------- SwiftPlayer/SwiftPlayer/ViewController.swift | 46 ++++++++++--------- .../DocumentPathResolverTests.swift | 29 ++++++++++++ tutorial/tutorial.xcodeproj/project.pbxproj | 14 +++--- tutorial/tutorial/AppDelegate.swift | 36 ++++++--------- 9 files changed, 135 insertions(+), 80 deletions(-) create mode 100644 Package.swift create mode 100644 Sources/ModernizationSupport/DocumentPathResolver.swift create mode 100644 Tests/ModernizationSupportTests/DocumentPathResolverTests.swift diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..c15f5c1 --- /dev/null +++ b/Package.swift @@ -0,0 +1,16 @@ +// swift-tools-version: 6.0 +import PackageDescription + +let package = Package( + name: "ModernizationSupport", + platforms: [ + .macOS(.v13) + ], + products: [ + .library(name: "ModernizationSupport", targets: ["ModernizationSupport"]) + ], + targets: [ + .target(name: "ModernizationSupport"), + .testTarget(name: "ModernizationSupportTests", dependencies: ["ModernizationSupport"]) + ] +) diff --git a/README.md b/README.md index 8dd9f6c..559d6cd 100644 --- a/README.md +++ b/README.md @@ -48,3 +48,8 @@ SDL2.0 + ffmpeg 3.1.1 + swift is different from olds now working on tutorial4 + + +## Modernization checks +- Run Swift package tests for modernization utilities: + - `swift test` diff --git a/Sources/ModernizationSupport/DocumentPathResolver.swift b/Sources/ModernizationSupport/DocumentPathResolver.swift new file mode 100644 index 0000000..5570adb --- /dev/null +++ b/Sources/ModernizationSupport/DocumentPathResolver.swift @@ -0,0 +1,18 @@ +import Foundation + +public enum DocumentPathResolver { + public static func userDocumentRoot(from absoluteDocumentPath: String) -> String? { + let components = absoluteDocumentPath.split(separator: "/").map(String.init) + guard components.count >= 3 else { return nil } + return "/" + components[0...2].joined(separator: "/") + "/Documents" + } + + public static func appScopedDocumentAliasRoot(from absoluteDocumentPath: String, appName: String = "ffmpeg_tutorial") -> String? { + guard let root = userDocumentRoot(from: absoluteDocumentPath) else { return nil } + return root + "/" + appName + } + + public static func needsSymlinkRefresh(currentLinkTarget: String?, expectedTarget: String) -> Bool { + return currentLinkTarget != expectedTarget + } +} diff --git a/SwiftPlayer/SwiftPlayer.xcodeproj/project.pbxproj b/SwiftPlayer/SwiftPlayer.xcodeproj/project.pbxproj index c835261..30e1e14 100644 --- a/SwiftPlayer/SwiftPlayer.xcodeproj/project.pbxproj +++ b/SwiftPlayer/SwiftPlayer.xcodeproj/project.pbxproj @@ -247,7 +247,7 @@ D848FE6B1D745F4D0058E322 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0800; + LastSwiftUpdateCheck = 1600; LastUpgradeCheck = 0800; ORGANIZATIONNAME = "Kwanghoon Choi"; TargetAttributes = { @@ -392,7 +392,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -436,7 +436,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -456,7 +456,7 @@ "\"$(SRCROOT)/../SDL-iOS/include\"", ); INFOPLIST_FILE = SwiftPlayer/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "\"$(SRCROOT)/../ffmpeg/lib\"", @@ -466,7 +466,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "SwiftPlayer/SwiftPlayer-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -481,7 +481,7 @@ "\"$(SRCROOT)/../SDL-iOS/include\"", ); INFOPLIST_FILE = SwiftPlayer/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "\"$(SRCROOT)/../ffmpeg/lib\"", @@ -490,7 +490,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.ngenii.SwiftPlayer; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "SwiftPlayer/SwiftPlayer-Bridging-Header.h"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/SwiftPlayer/SwiftPlayer/AppDelegate.swift b/SwiftPlayer/SwiftPlayer/AppDelegate.swift index 7e0d547..311bbb4 100644 --- a/SwiftPlayer/SwiftPlayer/AppDelegate.swift +++ b/SwiftPlayer/SwiftPlayer/AppDelegate.swift @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. @@ -83,31 +83,22 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } func createSymbolickLinkForDocuments() { - if let attributes = try? FileManager.default.attributesOfItem(atPath: self.documentPathForUserWithAppName), let type: FileAttributeType = attributes[.type] as? FileAttributeType { - if type == .typeSymbolicLink && (self.docPath as String) == self.linkOfDocumentPathForUserWithAppName { - return - } + let destinationPath = self.docPath as String + + if let attributes = try? FileManager.default.attributesOfItem(atPath: self.documentPathForUserWithAppName), + let type = attributes[.type] as? FileAttributeType, + type == .typeSymbolicLink, + destinationPath == self.linkOfDocumentPathForUserWithAppName { + return } + do { - let attributes = try? FileManager.default.attributesOfItem(atPath: self.documentPathForUserWithAppName) - if let attributes = attributes { - - let type: FileAttributeType = attributes[.type] as! FileAttributeType - if type == .typeSymbolicLink { - try FileManager.default.removeItem(atPath: self.documentPathForUserWithAppName) - try FileManager.default.createSymbolicLink(atPath: self.documentPathForUserWithAppName, withDestinationPath: self.docPath as String) - } - else { - try FileManager.default.removeItem(atPath: self.documentPathForUserWithAppName) - try FileManager.default.createSymbolicLink(atPath: self.documentPathForUserWithAppName, withDestinationPath: self.docPath as String) - } - } else { - try FileManager.default.createSymbolicLink(atPath: self.documentPathForUserWithAppName, withDestinationPath: self.docPath as String) + if FileManager.default.fileExists(atPath: self.documentPathForUserWithAppName) { + try FileManager.default.removeItem(atPath: self.documentPathForUserWithAppName) } - - } catch let err as NSError { - assertionFailure(err.localizedDescription) + try FileManager.default.createSymbolicLink(atPath: self.documentPathForUserWithAppName, withDestinationPath: destinationPath) + } catch { + assertionFailure(error.localizedDescription) } } } - diff --git a/SwiftPlayer/SwiftPlayer/ViewController.swift b/SwiftPlayer/SwiftPlayer/ViewController.swift index 25085b9..33d2b5f 100644 --- a/SwiftPlayer/SwiftPlayer/ViewController.swift +++ b/SwiftPlayer/SwiftPlayer/ViewController.swift @@ -24,8 +24,7 @@ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. - let prevIO = UIApplication.shared.statusBarOrientation - if UIInterfaceOrientationIsPortrait(prevIO) { + if UIDevice.current.orientation.isPortrait || UIDevice.current.orientation == .unknown { UIDevice.current.setValue(UIDeviceOrientation.landscapeLeft.rawValue, forKey: "orientation") } } @@ -37,25 +36,30 @@ class ViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - weak var weakSelf = self - if let path = self.path, 0 < path.lengthOfBytes(using: .utf8) { - self.player = Player(path: path) - - self.player?.start(start: { - DispatchQueue.main.async { - guard weakSelf?.setupSDL(player: weakSelf!.player!) ?? false else { - weakSelf?.player?.cancel() - return - } - - weakSelf?.displayLink = CADisplayLink(target: self, selector: #selector(ViewController.update(link:))) - weakSelf?.displayLink?.add(to: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) - } - }, stop: { - var event = SDL_Event(quit: SDL_QuitEvent(type: SDL_QUIT.rawValue, timestamp: 0)) - SDL_PushEvent(&event) - }) + guard let path = self.path, 0 < path.lengthOfBytes(using: .utf8) else { + return } + + self.player = Player(path: path) + + self.player?.start(start: { [weak self] in + DispatchQueue.main.async { + guard let self else { + return + } + + guard let player = self.player, self.setupSDL(player: player) else { + self.player?.cancel() + return + } + + self.displayLink = CADisplayLink(target: self, selector: #selector(ViewController.update(link:))) + self.displayLink?.add(to: .current, forMode: .default) + } + }, stop: { + var event = SDL_Event(quit: SDL_QuitEvent(type: SDL_QUIT.rawValue, timestamp: 0)) + SDL_PushEvent(&event) + }) } override func viewDidDisappear(_ animated: Bool) { @@ -69,7 +73,7 @@ class ViewController: UIViewController { } var start: Double = 0 - func update(link: CADisplayLink) { + @objc func update(link: CADisplayLink) { if 0 == start { start = link.timestamp } diff --git a/Tests/ModernizationSupportTests/DocumentPathResolverTests.swift b/Tests/ModernizationSupportTests/DocumentPathResolverTests.swift new file mode 100644 index 0000000..1fec6cc --- /dev/null +++ b/Tests/ModernizationSupportTests/DocumentPathResolverTests.swift @@ -0,0 +1,29 @@ +import XCTest +@testable import ModernizationSupport + +final class DocumentPathResolverTests: XCTestCase { + func testUserDocumentRootFromSimulatorPath() { + let path = "/Users/test/Library/Developer/CoreSimulator/Devices/abc/data/Containers/Data/Application/xyz/Documents" + XCTAssertEqual( + DocumentPathResolver.userDocumentRoot(from: path), + "/Users/test/Library/Documents" + ) + } + + func testUserDocumentRootWithInvalidPathReturnsNil() { + XCTAssertNil(DocumentPathResolver.userDocumentRoot(from: "/tmp")) + } + + func testAppScopedDocumentAliasRootUsesDefaultAppName() { + let path = "/Users/test/Library/Developer/CoreSimulator/Devices/abc/data" + XCTAssertEqual( + DocumentPathResolver.appScopedDocumentAliasRoot(from: path), + "/Users/test/Library/Documents/ffmpeg_tutorial" + ) + } + + func testNeedsSymlinkRefreshWhenTargetsDiffer() { + XCTAssertTrue(DocumentPathResolver.needsSymlinkRefresh(currentLinkTarget: "/old", expectedTarget: "/new")) + XCTAssertFalse(DocumentPathResolver.needsSymlinkRefresh(currentLinkTarget: "/same", expectedTarget: "/same")) + } +} diff --git a/tutorial/tutorial.xcodeproj/project.pbxproj b/tutorial/tutorial.xcodeproj/project.pbxproj index c0e6595..fef69a8 100644 --- a/tutorial/tutorial.xcodeproj/project.pbxproj +++ b/tutorial/tutorial.xcodeproj/project.pbxproj @@ -448,7 +448,7 @@ A96D16E81D5860C5009F7AC2 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0800; + LastSwiftUpdateCheck = 1600; LastUpgradeCheck = 0800; ORGANIZATIONNAME = gretech; TargetAttributes = { @@ -603,7 +603,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -644,7 +644,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -680,7 +680,7 @@ PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "tutorial/tutorial-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -712,7 +712,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "tutorial/tutorial-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; @@ -741,7 +741,7 @@ SDKROOT = macosx; SWIFT_OBJC_BRIDGING_HEADER = "tutorial6/tutorial6-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -768,7 +768,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_OBJC_BRIDGING_HEADER = "tutorial6/tutorial6-Bridging-Header.h"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/tutorial/tutorial/AppDelegate.swift b/tutorial/tutorial/AppDelegate.swift index e9607ff..7ab85b0 100644 --- a/tutorial/tutorial/AppDelegate.swift +++ b/tutorial/tutorial/AppDelegate.swift @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { // Override point for customization after application launch. av_register_all() @@ -87,30 +87,22 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } func createSymbolickLinkForDocuments() { - if let attributes = try? FileManager.default.attributesOfItem(atPath: self.documentPathForUserWithAppName), let type: FileAttributeType = attributes[.type] as? FileAttributeType { - if type == .typeSymbolicLink && (self.docPath as String) == self.linkOfDocumentPathForUserWithAppName { - return - } + let destinationPath = self.docPath as String + + if let attributes = try? FileManager.default.attributesOfItem(atPath: self.documentPathForUserWithAppName), + let type = attributes[.type] as? FileAttributeType, + type == .typeSymbolicLink, + destinationPath == self.linkOfDocumentPathForUserWithAppName { + return } + do { - let attributes = try? FileManager.default.attributesOfItem(atPath: self.documentPathForUserWithAppName) - if let attributes = attributes { - - let type: FileAttributeType = attributes[.type] as! FileAttributeType - if type == .typeSymbolicLink { - try FileManager.default.removeItem(atPath: self.documentPathForUserWithAppName) - try FileManager.default.createSymbolicLink(atPath: self.documentPathForUserWithAppName, withDestinationPath: self.docPath as String) - } - else { - try FileManager.default.removeItem(atPath: self.documentPathForUserWithAppName) - try FileManager.default.createSymbolicLink(atPath: self.documentPathForUserWithAppName, withDestinationPath: self.docPath as String) - } - } else { - try FileManager.default.createSymbolicLink(atPath: self.documentPathForUserWithAppName, withDestinationPath: self.docPath as String) + if FileManager.default.fileExists(atPath: self.documentPathForUserWithAppName) { + try FileManager.default.removeItem(atPath: self.documentPathForUserWithAppName) } - - } catch let err as NSError { - assertionFailure(err.localizedDescription) + try FileManager.default.createSymbolicLink(atPath: self.documentPathForUserWithAppName, withDestinationPath: destinationPath) + } catch { + assertionFailure(error.localizedDescription) } } From 1e747515d6493659c2d8bc89284e9f3907fdd135 Mon Sep 17 00:00:00 2001 From: oozoofrog Date: Sat, 14 Feb 2026 16:04:39 +0900 Subject: [PATCH 2/2] Raise minimum deployment targets to iOS 26 and macOS 26 --- Package.swift | 3 ++- SwiftPlayer/SwiftPlayer.xcodeproj/project.pbxproj | 8 ++++---- tutorial/tutorial.xcodeproj/project.pbxproj | 8 ++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Package.swift b/Package.swift index c15f5c1..1933241 100644 --- a/Package.swift +++ b/Package.swift @@ -4,7 +4,8 @@ import PackageDescription let package = Package( name: "ModernizationSupport", platforms: [ - .macOS(.v13) + .iOS("26.0"), + .macOS("26.0") ], products: [ .library(name: "ModernizationSupport", targets: ["ModernizationSupport"]) diff --git a/SwiftPlayer/SwiftPlayer.xcodeproj/project.pbxproj b/SwiftPlayer/SwiftPlayer.xcodeproj/project.pbxproj index 30e1e14..e56ad38 100644 --- a/SwiftPlayer/SwiftPlayer.xcodeproj/project.pbxproj +++ b/SwiftPlayer/SwiftPlayer.xcodeproj/project.pbxproj @@ -392,7 +392,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -436,7 +436,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -456,7 +456,7 @@ "\"$(SRCROOT)/../SDL-iOS/include\"", ); INFOPLIST_FILE = SwiftPlayer/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "\"$(SRCROOT)/../ffmpeg/lib\"", @@ -481,7 +481,7 @@ "\"$(SRCROOT)/../SDL-iOS/include\"", ); INFOPLIST_FILE = SwiftPlayer/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "\"$(SRCROOT)/../ffmpeg/lib\"", diff --git a/tutorial/tutorial.xcodeproj/project.pbxproj b/tutorial/tutorial.xcodeproj/project.pbxproj index fef69a8..fca37c1 100644 --- a/tutorial/tutorial.xcodeproj/project.pbxproj +++ b/tutorial/tutorial.xcodeproj/project.pbxproj @@ -603,7 +603,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -644,7 +644,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -736,7 +736,7 @@ /usr/local/Cellar/sdl2/2.0.4/lib, /usr/local/Cellar/ffmpeg/3.1.3/lib, ); - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 26.0; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_OBJC_BRIDGING_HEADER = "tutorial6/tutorial6-Bridging-Header.h"; @@ -764,7 +764,7 @@ /usr/local/Cellar/sdl2/2.0.4/lib, /usr/local/Cellar/ffmpeg/3.1.3/lib, ); - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 26.0; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_OBJC_BRIDGING_HEADER = "tutorial6/tutorial6-Bridging-Header.h";