From ef4f9da99878198d42ab7e693d119e0b92ff8c49 Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:28:39 -0700 Subject: [PATCH 01/12] g-orchestrated: raise podspec deployment targets for Xcode 27 --- AppAuth.podspec | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AppAuth.podspec b/AppAuth.podspec index 4830ffe3b..d7590d2dd 100644 --- a/AppAuth.podspec +++ b/AppAuth.podspec @@ -31,12 +31,12 @@ It follows the OAuth 2.0 for Native Apps best current practice # classes of AppAuth with tokens on watchOS and tvOS, but currently the # library won't help you obtain authorization grants on those platforms. - ios_deployment_target = "12.0" - osx_deployment_target = "10.12" + ios_deployment_target = "15.0" + osx_deployment_target = "12.0" s.ios.deployment_target = ios_deployment_target s.osx.deployment_target = osx_deployment_target - s.watchos.deployment_target = "2.0" - s.tvos.deployment_target = "9.0" + s.watchos.deployment_target = "9.0" + s.tvos.deployment_target = "15.0" s.source = { :git => "https://github.com/openid/AppAuth-iOS.git", :tag => s.version } s.requires_arc = true From ecf2c08316ae555367240fe2e9209b062b9fb095 Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:28:43 -0700 Subject: [PATCH 02/12] g-orchestrated: raise SPM platform minimums and swift-tools-version for Xcode 27 --- Package.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Package.swift b/Package.swift index 208eaf467..ad338b44e 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.3 +// swift-tools-version:5.7 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -23,10 +23,10 @@ import PackageDescription let package = Package( name: "AppAuth", platforms: [ - .macOS(.v10_12), - .iOS(.v12), - .tvOS(.v9), - .watchOS(.v2) + .macOS(.v12), + .iOS(.v15), + .tvOS(.v15), + .watchOS(.v9) ], products: [ .library( From f66e134fe48a716e68cb37545c19f21ef1213a3a Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:28:47 -0700 Subject: [PATCH 03/12] g-orchestrated: raise Xcode project deployment targets for Xcode 27 --- AppAuth.xcodeproj/project.pbxproj | 72 +++++++++++++++---------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/AppAuth.xcodeproj/project.pbxproj b/AppAuth.xcodeproj/project.pbxproj index e17b22d34..7cfd05bc5 100644 --- a/AppAuth.xcodeproj/project.pbxproj +++ b/AppAuth.xcodeproj/project.pbxproj @@ -2653,7 +2653,7 @@ PRODUCT_BUNDLE_IDENTIFIER = net.openid.AppAuthTVTests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -2668,7 +2668,7 @@ PRODUCT_BUNDLE_IDENTIFIER = net.openid.AppAuthTVTests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; @@ -2702,7 +2702,7 @@ SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2733,7 +2733,7 @@ SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2815,14 +2815,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MACOSX_DEPLOYMENT_TARGET = 10.12; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WARNING_CFLAGS = "-Wno-gnu"; - WATCHOS_DEPLOYMENT_TARGET = 2.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -2873,22 +2873,22 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MACOSX_DEPLOYMENT_TARGET = 10.12; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; VALIDATE_PRODUCT = YES; WARNING_CFLAGS = "-Wno-gnu"; - WATCHOS_DEPLOYMENT_TARGET = 2.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; }; 340E73861C5D819B0076B1F6 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; @@ -2897,7 +2897,7 @@ 340E73871C5D819B0076B1F6 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; @@ -2909,7 +2909,7 @@ CLANG_ENABLE_MODULES = YES; HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/"; INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.AppAuthTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2926,7 +2926,7 @@ CLANG_ENABLE_MODULES = YES; HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/"; INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.AppAuthTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2979,7 +2979,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -2994,7 +2994,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; @@ -3008,7 +3008,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; SKIP_INSTALL = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -3022,7 +3022,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; SKIP_INSTALL = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; @@ -3040,7 +3040,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Sources/CoreFramework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.AppAuthCore; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -3066,7 +3066,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Sources/CoreFramework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.AppAuthCore; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -3091,7 +3091,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Sources/Framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-iOS"; PRODUCT_NAME = AppAuth; @@ -3116,7 +3116,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Sources/Framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-iOS"; PRODUCT_NAME = AppAuth; @@ -3135,7 +3135,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; HEADER_SEARCH_PATHS = .; INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-iOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -3149,7 +3149,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; HEADER_SEARCH_PATHS = .; INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-iOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -3178,7 +3178,7 @@ TARGETED_DEVICE_FAMILY = 4; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 2.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -3204,7 +3204,7 @@ TARGETED_DEVICE_FAMILY = 4; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 2.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; }; @@ -3227,7 +3227,7 @@ SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -3252,7 +3252,7 @@ SDKROOT = appletvos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -3269,7 +3269,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -3284,7 +3284,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; @@ -3379,7 +3379,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; SKIP_INSTALL = YES; - WATCHOS_DEPLOYMENT_TARGET = 2.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -3392,7 +3392,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; SKIP_INSTALL = YES; - WATCHOS_DEPLOYMENT_TARGET = 2.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; }; @@ -3403,7 +3403,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; HEADER_SEARCH_PATHS = .; INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-ExtensionTests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -3417,7 +3417,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; HEADER_SEARCH_PATHS = .; INFOPLIST_FILE = UnitTests/UnitTestsInfo.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.AppAuth-ExtensionTests"; PRODUCT_NAME = "$(TARGET_NAME)"; From 48c9ad7dae3e5d9167e513dd2a8cb4142b2eae76 Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:30:09 -0700 Subject: [PATCH 04/12] g-orchestrated: raise Example-iOS_ObjC deployment target to iOS 15 --- .../Example-iOS_ObjC.xcodeproj/project.pbxproj | 16 ++++++++-------- Examples/Example-iOS_ObjC/Podfile | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Examples/Example-iOS_ObjC/Example-iOS_ObjC.xcodeproj/project.pbxproj b/Examples/Example-iOS_ObjC/Example-iOS_ObjC.xcodeproj/project.pbxproj index 7f3f2de68..a37dec883 100644 --- a/Examples/Example-iOS_ObjC/Example-iOS_ObjC.xcodeproj/project.pbxproj +++ b/Examples/Example-iOS_ObjC/Example-iOS_ObjC.xcodeproj/project.pbxproj @@ -488,7 +488,7 @@ DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "Example-iOS_ObjC_Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.appauth.Example.Example-iOS-ObjC-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -520,7 +520,7 @@ DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "Example-iOS_ObjC_Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.appauth.Example.Example-iOS-ObjC-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -540,7 +540,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.AppAuthExampleTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -559,7 +559,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.AppAuthExampleTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -605,7 +605,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../Source/**"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -645,7 +645,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../Source/**"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -662,7 +662,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Source/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.Example; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -678,7 +678,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = Source/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.Example; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/Examples/Example-iOS_ObjC/Podfile b/Examples/Example-iOS_ObjC/Podfile index 9684ad6f9..f98491656 100644 --- a/Examples/Example-iOS_ObjC/Podfile +++ b/Examples/Example-iOS_ObjC/Podfile @@ -1,4 +1,4 @@ -platform :ios, '12.0' +platform :ios, '15.0' use_frameworks! From 46385beb6cdff662233d29b4b316f3035302eeef Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:30:16 -0700 Subject: [PATCH 05/12] g-orchestrated: raise Example-macOS deployment target to macOS 12 --- .../Example-macOS.xcodeproj/project.pbxproj | 12 ++++++------ Examples/Example-macOS/Podfile | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Examples/Example-macOS/Example-macOS.xcodeproj/project.pbxproj b/Examples/Example-macOS/Example-macOS.xcodeproj/project.pbxproj index 13bb1c957..e29f79b87 100644 --- a/Examples/Example-macOS/Example-macOS.xcodeproj/project.pbxproj +++ b/Examples/Example-macOS/Example-macOS.xcodeproj/project.pbxproj @@ -326,7 +326,7 @@ COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.Example-macOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example-macOS.app/Contents/MacOS/Example-macOS"; @@ -343,7 +343,7 @@ COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.Example-macOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example-macOS.app/Contents/MacOS/Example-macOS"; @@ -387,7 +387,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -425,7 +425,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; }; @@ -439,7 +439,7 @@ COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.appauth.Example-macOS"; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -453,7 +453,7 @@ COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.appauth.Example-macOS"; PRODUCT_NAME = "$(TARGET_NAME)"; }; diff --git a/Examples/Example-macOS/Podfile b/Examples/Example-macOS/Podfile index e0c0aced9..9f0524152 100644 --- a/Examples/Example-macOS/Podfile +++ b/Examples/Example-macOS/Podfile @@ -1,5 +1,5 @@ target 'Example-macOS' do - platform :osx, '10.12' + platform :osx, '12.0' # AppAuth Pod # In production, just use `pod 'AppAuth'` without the path reference. From 85f4c6db0b925d9a8b8fc830fbe0cf9100b062c7 Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:30:19 -0700 Subject: [PATCH 06/12] g-orchestrated: raise Example-tvOS deployment target to tvOS 15 --- Examples/Example-tvOS/Example-tvOS.xcodeproj/project.pbxproj | 4 ++-- Examples/Example-tvOS/Podfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Examples/Example-tvOS/Example-tvOS.xcodeproj/project.pbxproj b/Examples/Example-tvOS/Example-tvOS.xcodeproj/project.pbxproj index b2e8a7d1a..35cf10414 100644 --- a/Examples/Example-tvOS/Example-tvOS.xcodeproj/project.pbxproj +++ b/Examples/Example-tvOS/Example-tvOS.xcodeproj/project.pbxproj @@ -283,7 +283,7 @@ MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -334,7 +334,7 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; VALIDATE_PRODUCT = YES; }; name = Release; diff --git a/Examples/Example-tvOS/Podfile b/Examples/Example-tvOS/Podfile index 3e7ac1135..a3f50d021 100644 --- a/Examples/Example-tvOS/Podfile +++ b/Examples/Example-tvOS/Podfile @@ -1,4 +1,4 @@ -platform :tvos, '9.0' +platform :tvos, '15.0' use_frameworks! From 44546dde84261164881e67bd58f349dbb13fd62a Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:30:24 -0700 Subject: [PATCH 07/12] g-orchestrated: raise Carthage example deployment targets to iOS 15 --- .../Example.xcodeproj/project.pbxproj | 12 ++++++------ .../Example.xcodeproj/project.pbxproj | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Examples/Example-iOS_ObjC-Carthage/Example.xcodeproj/project.pbxproj b/Examples/Example-iOS_ObjC-Carthage/Example.xcodeproj/project.pbxproj index 839e13e5b..56e6cca8a 100644 --- a/Examples/Example-iOS_ObjC-Carthage/Example.xcodeproj/project.pbxproj +++ b/Examples/Example-iOS_ObjC-Carthage/Example.xcodeproj/project.pbxproj @@ -372,7 +372,7 @@ ); GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Example_Extension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.appauth.Example.Example-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -407,7 +407,7 @@ ); GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Example_Extension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.appauth.Example.Example-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -454,7 +454,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../Source/**"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -494,7 +494,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "../../Source/**"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -514,7 +514,7 @@ "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = Source/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.Example; @@ -534,7 +534,7 @@ "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = Source/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.Example; diff --git a/Examples/Example-iOS_Swift-Carthage/Example.xcodeproj/project.pbxproj b/Examples/Example-iOS_Swift-Carthage/Example.xcodeproj/project.pbxproj index 33f25f87b..306c441fc 100644 --- a/Examples/Example-iOS_Swift-Carthage/Example.xcodeproj/project.pbxproj +++ b/Examples/Example-iOS_Swift-Carthage/Example.xcodeproj/project.pbxproj @@ -353,7 +353,7 @@ "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = Example_Extension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.appauth.Example.Example-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -374,7 +374,7 @@ "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = Example_Extension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "net.openid.appauth.Example.Example-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -432,7 +432,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -483,7 +483,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -504,7 +504,7 @@ "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = Source/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.Example; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -526,7 +526,7 @@ "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = Source/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = net.openid.appauth.Example; PRODUCT_NAME = "$(TARGET_NAME)"; From faffbe4ea2b5dc01094fb7e1e76c09683ce94ab1 Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:30:45 -0700 Subject: [PATCH 08/12] g-orchestrated: update README minimum supported OS versions --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 20748f40e..6a30e3973 100644 --- a/README.md +++ b/README.md @@ -39,14 +39,13 @@ For tvOS, AppAuth implements [OAuth 2.0 Device Authorization Grant #### Supported Versions -AppAuth supports iOS 12 and above. +AppAuth supports iOS 15 and above. Authentication is performed using `ASWebAuthenticationSession`. #### Authorization Server Requirements -Both Custom URI Schemes (all supported versions of iOS) and Universal Links -(iOS 9+) can be used with the library. +Both Custom URI Schemes and Universal Links can be used with the library. In general, AppAuth can work with any authorization server that supports native apps, as documented in [RFC 8252](https://tools.ietf.org/html/rfc8252), @@ -58,7 +57,7 @@ confidentiality of the client secrets may not work well. #### Supported Versions -AppAuth supports macOS (OS X) 10.9 and above. +AppAuth supports macOS 12 and above. #### Authorization Server Requirements @@ -75,7 +74,7 @@ confidentiality of the client secrets may not work well. #### Supported Versions -AppAuth supports tvOS 9.0 and above. Please note that while it is possible to run the standard AppAuth library on tvOS, the documentation below describes implementing [OAuth 2.0 Device Authorization Grant](https://tools.ietf.org/html/rfc8628) (AppAuthTV). +AppAuth supports tvOS 15.0 and above. Please note that while it is possible to run the standard AppAuth library on tvOS, the documentation below describes implementing [OAuth 2.0 Device Authorization Grant](https://tools.ietf.org/html/rfc8628) (AppAuthTV). #### Authorization Server Requirements From 7ef4d291c4520633192bdcfc014620da14f4f1bf Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:30:49 -0700 Subject: [PATCH 09/12] g-orchestrated: add CHANGELOG entry for deployment target bump --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e79f0cb22..cabf94b13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ # UNRELEASED +- BREAKING: Raised minimum deployment targets to iOS 15.0, macOS 12.0, tvOS 15.0 and watchOS 9.0. Xcode 27 rejects lower deployment targets with a build error, so every AppAuth target had to move above its floor. Swift Package Manager users are additionally affected by a `swift-tools-version` bump from 5.3 to 5.7, which the new platform minimums require; resolving the package now needs Swift 5.7 / Xcode 14 or later. Projects that must keep supporting iOS 12-14 should stay on AppAuth 2.x, which remains buildable with Xcode 26 and earlier. - BREAKING: `resumeExternalUserAgentFlowWithURL:error:` is now required in `OIDExternalUserAgentSession` to fix a Swift compiler crash (no workaround) caused by its `@optional` status with `NSError **`. Implementers must now provide this method. Affects projects since 2.1.0. ([#955](https://github.com/openid/AppAuth-iOS/pull/955)) - Swift callers now spell the method `resumeExternalUserAgentFlow(_:)`. Since the method is no longer optional, you don't need optional-chaining anymore. For those migrating from 2.1.0, replace `try session.resumeExternalUserAgentFlow?(with: url)` with `try session.resumeExternalUserAgentFlow(url)`. Objective-C callers are unaffected. ([#966](https://github.com/openid/AppAuth-iOS/pull/966)) - Replace case range with explicit case labels in OIDTokenUtilities. Addresses issue #947. ([#963](https://github.com/openid/AppAuth-iOS/pull/963)) From 959bfd4fba2f58ca422c83adf396b9360171235f Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 11:12:49 -0700 Subject: [PATCH 10/12] g-orchestrated: use modern secure-coding APIs in unit tests The raised deployment targets (iOS 15, macOS 12, tvOS 15, watchOS 9) put +archivedDataWithRootObject: and +unarchiveObjectWithData: past their deprecation points on macOS and tvOS, and the project builds with -Werror. The @available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0) guards in the NSSecureCoding tests are now always true, so the legacy fallback branches they guarded are dead code; remove the guards and the branches. The AppAuthTV tests called the legacy APIs unconditionally, so convert those call sites to +archivedDataWithRootObject:requiringSecureCoding:error: and +unarchivedObjectOfClass:fromData:error:. --- .../OIDTVAuthorizationRequestTests.m | 10 +- .../OIDTVAuthorizationResponseTests.m | 10 +- UnitTests/AppAuthTV/OIDTVTokenRequestTests.m | 10 +- UnitTests/OIDAuthStateTests.m | 57 ++++------- UnitTests/OIDAuthorizationRequestTests.m | 19 ++-- UnitTests/OIDAuthorizationResponseTests.m | 19 ++-- UnitTests/OIDEndSessionRequestTests.m | 19 ++-- UnitTests/OIDRegistrationRequestTests.m | 19 ++-- UnitTests/OIDRegistrationResponseTests.m | 19 ++-- UnitTests/OIDServiceConfigurationTests.m | 19 ++-- UnitTests/OIDServiceDiscoveryTests.m | 96 ++++++------------- UnitTests/OIDTokenRequestTests.m | 19 ++-- UnitTests/OIDTokenResponseTests.m | 19 ++-- 13 files changed, 118 insertions(+), 217 deletions(-) diff --git a/UnitTests/AppAuthTV/OIDTVAuthorizationRequestTests.m b/UnitTests/AppAuthTV/OIDTVAuthorizationRequestTests.m index a5ccd6e1d..f39962a5c 100644 --- a/UnitTests/AppAuthTV/OIDTVAuthorizationRequestTests.m +++ b/UnitTests/AppAuthTV/OIDTVAuthorizationRequestTests.m @@ -180,8 +180,14 @@ - (void)testSecureCoding { scopes:nil additionalParameters:nil]; - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:authRequest]; - OIDTVAuthorizationRequest *authRequestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + NSError *error; + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:authRequest + requiringSecureCoding:YES + error:&error]; + OIDTVAuthorizationRequest *authRequestCopy = + [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDTVAuthorizationRequest class] + fromData:data + error:&error]; NSURL *authRequestCopyDeviceAuthorizationEndpoint = ((OIDTVServiceConfiguration *)authRequestCopy.configuration).deviceAuthorizationEndpoint; diff --git a/UnitTests/AppAuthTV/OIDTVAuthorizationResponseTests.m b/UnitTests/AppAuthTV/OIDTVAuthorizationResponseTests.m index 436232322..fba2a1ae5 100644 --- a/UnitTests/AppAuthTV/OIDTVAuthorizationResponseTests.m +++ b/UnitTests/AppAuthTV/OIDTVAuthorizationResponseTests.m @@ -237,8 +237,14 @@ - (void)testCopying { */ - (void)testSecureCoding { OIDTVAuthorizationResponse *response = [self testAuthorizationResponse]; - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:response]; - OIDTVAuthorizationResponse *responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + NSError *error; + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:response + requiringSecureCoding:YES + error:&error]; + OIDTVAuthorizationResponse *responseCopy = + [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDTVAuthorizationResponse class] + fromData:data + error:&error]; NSDictionary *testAdditionalParameters = @{kTestAdditionalParameterKey : kTestAdditionalParameterValue}; diff --git a/UnitTests/AppAuthTV/OIDTVTokenRequestTests.m b/UnitTests/AppAuthTV/OIDTVTokenRequestTests.m index cd56344fd..270deff20 100644 --- a/UnitTests/AppAuthTV/OIDTVTokenRequestTests.m +++ b/UnitTests/AppAuthTV/OIDTVTokenRequestTests.m @@ -168,8 +168,14 @@ - (void)testCopying { */ - (void)testSecureCoding { OIDTVTokenRequest *request = [self testTokenRequest]; - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:request]; - OIDTVTokenRequest *requestDecoded = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + NSError *error; + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:request + requiringSecureCoding:YES + error:&error]; + OIDTVTokenRequest *requestDecoded = + [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDTVTokenRequest class] + fromData:data + error:&error]; XCTAssertEqualObjects(requestDecoded.deviceCode, request.deviceCode); } diff --git a/UnitTests/OIDAuthStateTests.m b/UnitTests/OIDAuthStateTests.m index d18ab3405..ae2c6f625 100644 --- a/UnitTests/OIDAuthStateTests.m +++ b/UnitTests/OIDAuthStateTests.m @@ -206,16 +206,10 @@ - (void)testNonCompliantNSCodingNSErrors { [authstate updateWithAuthorizationError:oauthError]; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:authstate - requiringSecureCoding:YES - error:&error]; - XCTAssertNoThrow(data, @""); - } else { -#if !TARGET_OS_IOS - XCTAssertNoThrow([NSKeyedArchiver archivedDataWithRootObject:authstate], @""); -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:authstate + requiringSecureCoding:YES + error:&error]; + XCTAssertNoThrow(data, @""); } /*! @brief Tests @c OIDAuthState.updateWithAuthorizationResponse:error: with a success response. @@ -372,19 +366,12 @@ - (void)testSecureCoding { OIDAuthState *authStateCopy; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:authState - requiringSecureCoding:YES - error:&error]; - authStateCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthState class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:authState]; - authStateCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:authState + requiringSecureCoding:YES + error:&error]; + authStateCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthState class] + fromData:data + error:&error]; XCTAssertEqualObjects(authStateCopy.refreshToken, authState.refreshToken, @""); XCTAssertEqualObjects(authStateCopy.scope, authState.scope, @""); @@ -400,26 +387,14 @@ - (void)testSecureCoding { // Verify the error object is indeed restored. NSError *oauthError = [[self class] OAuthTokenInvalidGrantErrorWithUnderlyingError:nil]; [authState updateWithTokenResponse:nil error:oauthError]; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:authState - requiringSecureCoding:YES - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:authState]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:authState + requiringSecureCoding:YES + error:&error]; XCTAssertNotNil(authState.authorizationError, @""); - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - authStateCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthState class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - authStateCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + authStateCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthState class] + fromData:data + error:&error]; XCTAssertEqualObjects(authStateCopy.authorizationError.domain, authState.authorizationError.domain, @""); XCTAssertEqual(authStateCopy.authorizationError.code, authState.authorizationError.code, @""); diff --git a/UnitTests/OIDAuthorizationRequestTests.m b/UnitTests/OIDAuthorizationRequestTests.m index dcefc6ff2..948902a9d 100644 --- a/UnitTests/OIDAuthorizationRequestTests.m +++ b/UnitTests/OIDAuthorizationRequestTests.m @@ -325,19 +325,12 @@ - (void)testSecureCoding { OIDAuthorizationRequest *requestCopy; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:request - requiringSecureCoding:YES - error:&error]; - requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthorizationRequest class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:request]; - requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:request + requiringSecureCoding:YES + error:&error]; + requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthorizationRequest class] + fromData:data + error:&error]; // Not a full test of the configuration deserialization, but should be sufficient as a smoke test // to make sure the configuration IS actually getting serialized and deserialized in the diff --git a/UnitTests/OIDAuthorizationResponseTests.m b/UnitTests/OIDAuthorizationResponseTests.m index 6bfb5fce2..627226185 100644 --- a/UnitTests/OIDAuthorizationResponseTests.m +++ b/UnitTests/OIDAuthorizationResponseTests.m @@ -161,19 +161,12 @@ - (void)testSecureCoding { OIDAuthorizationResponse *responseCopy; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:response - requiringSecureCoding:YES - error:&error]; - responseCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthorizationResponse class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:response]; - responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:response + requiringSecureCoding:YES + error:&error]; + responseCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDAuthorizationResponse class] + fromData:data + error:&error]; // Not a full test of the request deserialization, but should be sufficient as a smoke test // to make sure the request IS actually getting serialized and deserialized in the diff --git a/UnitTests/OIDEndSessionRequestTests.m b/UnitTests/OIDEndSessionRequestTests.m index d9ded81be..65c75f83c 100644 --- a/UnitTests/OIDEndSessionRequestTests.m +++ b/UnitTests/OIDEndSessionRequestTests.m @@ -100,19 +100,12 @@ - (void)testSecureCoding { OIDEndSessionRequest *requestCopy; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:request - requiringSecureCoding:YES - error:&error]; - requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDEndSessionRequest class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:request]; - requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:request + requiringSecureCoding:YES + error:&error]; + requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDEndSessionRequest class] + fromData:data + error:&error]; XCTAssertNotNil(requestCopy.configuration); XCTAssertEqualObjects(requestCopy.configuration.authorizationEndpoint, diff --git a/UnitTests/OIDRegistrationRequestTests.m b/UnitTests/OIDRegistrationRequestTests.m index f2a7ba3e1..d04ecfc90 100644 --- a/UnitTests/OIDRegistrationRequestTests.m +++ b/UnitTests/OIDRegistrationRequestTests.m @@ -145,19 +145,12 @@ - (void)testSecureCoding { OIDRegistrationRequest *requestCopy; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:request - requiringSecureCoding:YES - error:&error]; - requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDRegistrationRequest class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:request]; - requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:request + requiringSecureCoding:YES + error:&error]; + requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDRegistrationRequest class] + fromData:data + error:&error]; // Not a full test of the configuration deserialization, but should be sufficient as a smoke test // to make sure the configuration IS actually getting serialized and deserialized in the diff --git a/UnitTests/OIDRegistrationResponseTests.m b/UnitTests/OIDRegistrationResponseTests.m index f98787e55..bb1e1caf1 100644 --- a/UnitTests/OIDRegistrationResponseTests.m +++ b/UnitTests/OIDRegistrationResponseTests.m @@ -122,19 +122,12 @@ - (void)testSecureCoding { OIDRegistrationResponse *responseCopy; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:response - requiringSecureCoding:YES - error:&error]; - responseCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDRegistrationResponse class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:response]; - responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:response + requiringSecureCoding:YES + error:&error]; + responseCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDRegistrationResponse class] + fromData:data + error:&error]; // Not a full test of the request deserialization, but should be sufficient as a smoke test // to make sure the request IS actually getting serialized and deserialized in the diff --git a/UnitTests/OIDServiceConfigurationTests.m b/UnitTests/OIDServiceConfigurationTests.m index bd4c5babb..02cfc855e 100644 --- a/UnitTests/OIDServiceConfigurationTests.m +++ b/UnitTests/OIDServiceConfigurationTests.m @@ -366,19 +366,12 @@ - (void)testSecureCoding { OIDServiceConfiguration *unarchived; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:configuration - requiringSecureCoding:YES - error:&error]; - unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDServiceConfiguration class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:configuration]; - unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:configuration + requiringSecureCoding:YES + error:&error]; + unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDServiceConfiguration class] + fromData:data + error:&error]; XCTAssertEqualObjects(configuration.authorizationEndpoint, unarchived.authorizationEndpoint, @""); XCTAssertEqualObjects(configuration.tokenEndpoint, unarchived.tokenEndpoint, @""); diff --git a/UnitTests/OIDServiceDiscoveryTests.m b/UnitTests/OIDServiceDiscoveryTests.m index f07d5e2a0..9e482340d 100644 --- a/UnitTests/OIDServiceDiscoveryTests.m +++ b/UnitTests/OIDServiceDiscoveryTests.m @@ -448,26 +448,14 @@ - (void)testSecureCoding { [[OIDServiceDiscovery alloc] initWithDictionary:serviceDiscoveryDictionary error:&error]; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:discovery - requiringSecureCoding:YES - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:discovery]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:discovery + requiringSecureCoding:YES + error:&error]; OIDServiceDiscovery *unarchived; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDServiceDiscovery class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + unarchived = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDServiceDiscovery class] + fromData:data + error:&error]; XCTAssertEqualObjects(discovery.discoveryDictionary, unarchived.discoveryDictionary); } @@ -482,32 +470,20 @@ - (void)testSecureCodingDecodeOld { [[OIDServiceDiscoveryOldEncoding alloc] initWithDictionary:serviceDiscoveryDictionary error:&error]; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:discovery - requiringSecureCoding:YES - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:discovery]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:discovery + requiringSecureCoding:YES + error:&error]; OIDServiceDiscovery *unarchived; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - NSSet *allowedClasses = [NSSet setWithArray:@[[OIDServiceDiscovery class], - [NSDictionary class], - [NSArray class], - [NSString class], - [NSNumber class], - [NSNull class]]]; - unarchived = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowedClasses - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + NSSet *allowedClasses = [NSSet setWithArray:@[[OIDServiceDiscovery class], + [NSDictionary class], + [NSArray class], + [NSString class], + [NSNumber class], + [NSNull class]]]; + unarchived = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowedClasses + fromData:data + error:&error]; XCTAssertEqualObjects(discovery.discoveryDictionary, unarchived.discoveryDictionary); } @@ -522,32 +498,20 @@ - (void)testSecureCodingOldDecodeNew { [[OIDServiceDiscoveryOldDecoding alloc] initWithDictionary:serviceDiscoveryDictionary error:&error]; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:discovery - requiringSecureCoding:YES - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:discovery]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:discovery + requiringSecureCoding:YES + error:&error]; OIDServiceDiscovery *unarchived; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - NSSet *allowedClasses = [NSSet setWithArray:@[[OIDServiceDiscoveryOldDecoding class], - [NSDictionary class], - [NSArray class], - [NSString class], - [NSNumber class], - [NSNull class]]]; - unarchived = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowedClasses - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + NSSet *allowedClasses = [NSSet setWithArray:@[[OIDServiceDiscoveryOldDecoding class], + [NSDictionary class], + [NSArray class], + [NSString class], + [NSNumber class], + [NSNull class]]]; + unarchived = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowedClasses + fromData:data + error:&error]; XCTAssertNil(error); XCTAssertEqualObjects(discovery.discoveryDictionary, unarchived.discoveryDictionary); } diff --git a/UnitTests/OIDTokenRequestTests.m b/UnitTests/OIDTokenRequestTests.m index 59a2f8ae6..0fddbf618 100644 --- a/UnitTests/OIDTokenRequestTests.m +++ b/UnitTests/OIDTokenRequestTests.m @@ -281,19 +281,12 @@ - (void)testSecureCoding { OIDTokenRequest *requestCopy; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:request - requiringSecureCoding:YES - error:&error]; - requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDTokenRequest class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:request]; - requestCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:request + requiringSecureCoding:YES + error:&error]; + requestCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDTokenRequest class] + fromData:data + error:&error]; // Not a full test of the configuration deserialization, but should be sufficient as a smoke test // to make sure the configuration IS actually getting serialized and deserialized in the diff --git a/UnitTests/OIDTokenResponseTests.m b/UnitTests/OIDTokenResponseTests.m index cce020b73..0b44e5a65 100644 --- a/UnitTests/OIDTokenResponseTests.m +++ b/UnitTests/OIDTokenResponseTests.m @@ -178,19 +178,12 @@ - (void)testSecureCoding { OIDTokenResponse *responseCopy; NSError *error; NSData *data; - if (@available(iOS 12.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *)) { - data = [NSKeyedArchiver archivedDataWithRootObject:response - requiringSecureCoding:YES - error:&error]; - responseCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDTokenResponse class] - fromData:data - error:&error]; - } else { -#if !TARGET_OS_IOS - data = [NSKeyedArchiver archivedDataWithRootObject:response]; - responseCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; -#endif - } + data = [NSKeyedArchiver archivedDataWithRootObject:response + requiringSecureCoding:YES + error:&error]; + responseCopy = [NSKeyedUnarchiver unarchivedObjectOfClass:[OIDTokenResponse class] + fromData:data + error:&error]; // Not a full test of the request deserialization, but should be sufficient as a smoke test // to make sure the request IS actually getting serialized and deserialized in the From 7425e4cd19007f17811c67ea2c715c8a642520d7 Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 11:24:46 -0700 Subject: [PATCH 11/12] g-orchestrated: add an advisory Xcode 27 CI job CI pins Xcode 16.4 on macos-15, so it cannot see Xcode 27 breakage at all -- which is why the deployment-target floors went unnoticed until a release testing session. Xcode 27 is available on the preview 'xcode-27' runner image, where Xcode 27 beta is the only (and default) Xcode and the simulator runtimes are the 27.0 generation. Add a job that runs the existing six-scheme matrix there. The image is preview, so the job is continue-on-error and cannot gate a merge; no existing job is touched. --- .github/workflows/tests.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f76e9be10..b90b28373 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -67,3 +67,32 @@ jobs: uses: codecov/codecov-action@v6 with: version: v0.7.3 + + xcode-27-preview-test: + # Xcode 27 is currently only available on the preview `xcode-27` image, + # on which Xcode 27 beta is the only (thus, default) Xcode and the simulator + # runtimes are the 27.0 generation. The image is preview, so this job is does + # not block merges. + # https://github.com/actions/runner-images/issues/14404 + runs-on: xcode-27 + continue-on-error: true + strategy: + fail-fast: false + matrix: + flags: [ + "-scheme AppAuth-iOS -destination 'platform=iOS Simulator,name=iPhone 17,OS=27.0' -sdk 'iphonesimulator'", + "-scheme AppAuth-macOS -destination 'platform=macOS' -sdk 'macosx'", + "-scheme AppAuth_macOS -destination 'platform=macOS' -sdk 'macosx'", + "-scheme AppAuth-tvOS -destination 'platform=tvOS Simulator,name=Apple TV,OS=27.0' -sdk 'appletvsimulator'", + "-scheme AppAuth_tvOS -destination 'platform=tvOS Simulator,name=Apple TV,OS=27.0' -sdk 'appletvsimulator'", + "-scheme AppAuthTV -destination 'platform=tvOS Simulator,name=Apple TV,OS=27.0' -sdk 'appletvsimulator'" + ] + steps: + - uses: actions/checkout@v5 + - name: Warm up simulator runtimes + run: xcrun simctl list devices available + - name: Run unit test targets + run: | + xcodebuild test \ + -project AppAuth.xcodeproj \ + ${{ matrix.flags }} From 4147a6498861bcbf64b8ba70f426574ed648afbb Mon Sep 17 00:00:00 2001 From: Worthing ~ <115107835+w-goog@users.noreply.github.com> Date: Wed, 12 Aug 2026 14:26:09 -0700 Subject: [PATCH 12/12] g-orchestrated: name the tvOS 27 simulator explicitly The xcode-27 preview image ships no simulator called plain "Apple TV" -- its only tvOS 27.0 devices are "Apple TV 4K (3rd generation)" and the 1080p variant -- so all three tvOS entries in the Xcode 27 job failed to resolve a destination. Name the 4K device. The xcode-project-test job keeps name=Apple TV: that device does exist on macos-15, where it runs. --- .github/workflows/tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b90b28373..72353b449 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -83,9 +83,9 @@ jobs: "-scheme AppAuth-iOS -destination 'platform=iOS Simulator,name=iPhone 17,OS=27.0' -sdk 'iphonesimulator'", "-scheme AppAuth-macOS -destination 'platform=macOS' -sdk 'macosx'", "-scheme AppAuth_macOS -destination 'platform=macOS' -sdk 'macosx'", - "-scheme AppAuth-tvOS -destination 'platform=tvOS Simulator,name=Apple TV,OS=27.0' -sdk 'appletvsimulator'", - "-scheme AppAuth_tvOS -destination 'platform=tvOS Simulator,name=Apple TV,OS=27.0' -sdk 'appletvsimulator'", - "-scheme AppAuthTV -destination 'platform=tvOS Simulator,name=Apple TV,OS=27.0' -sdk 'appletvsimulator'" + "-scheme AppAuth-tvOS -destination 'platform=tvOS Simulator,name=Apple TV 4K (3rd generation),OS=27.0' -sdk 'appletvsimulator'", + "-scheme AppAuth_tvOS -destination 'platform=tvOS Simulator,name=Apple TV 4K (3rd generation),OS=27.0' -sdk 'appletvsimulator'", + "-scheme AppAuthTV -destination 'platform=tvOS Simulator,name=Apple TV 4K (3rd generation),OS=27.0' -sdk 'appletvsimulator'" ] steps: - uses: actions/checkout@v5