From ba803d946c36ddc464d57ec586a7aaefbb146360 Mon Sep 17 00:00:00 2001 From: Mikhail Rubanov Date: Mon, 29 Jun 2026 15:01:16 -0300 Subject: [PATCH] Lower deployment target to iOS 16 with availability gating Drop the @Observable on StickerShaderUpdater (unobserved callback dispatcher) and gate the iOS 17 shader/accelerometer APIs behind @available(iOS 17, *) so the module imports into iOS 16 targets. stickerEffect() stays callable on iOS 16 as a no-op. Co-Authored-By: Claude Opus 4.8 --- Package.swift | 2 +- Sources/Sticker/StickerEffect/StickerEffect.swift | 4 +++- .../Effects/AccelerometerStickerMotionEffect.swift | 2 ++ .../Sticker/StickerShaderUpdater/StickerShaderUpdater.swift | 2 -- Sources/Sticker/Utils/Extensions/ShaderLibraryExtension.swift | 2 ++ 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Package.swift b/Package.swift index 771f479..2ac320b 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let package = Package( name: "Sticker", platforms: [ - .iOS(.v17), + .iOS(.v16), .macOS(.v14), .visionOS(.v1) ], diff --git a/Sources/Sticker/StickerEffect/StickerEffect.swift b/Sources/Sticker/StickerEffect/StickerEffect.swift index b5e04cf..48af086 100644 --- a/Sources/Sticker/StickerEffect/StickerEffect.swift +++ b/Sources/Sticker/StickerEffect/StickerEffect.swift @@ -7,6 +7,7 @@ import SwiftUI +@available(iOS 17, *) private struct StickerEffectViewModifier: ViewModifier { @State private var motion: StickerMotion = .init() @@ -73,7 +74,7 @@ private struct StickerEffectViewModifier: ViewModifier { extension View { @ViewBuilder public func stickerEffect(_ isEnabled: Bool = true) -> some View { - if isEnabled { + if isEnabled, #available(iOS 17, *) { modifier(StickerEffectViewModifier()) } else { self @@ -81,6 +82,7 @@ extension View { } } +@available(iOS 17, *) #Preview { VStack { Circle() diff --git a/Sources/Sticker/StickerMotionEffect/Effects/AccelerometerStickerMotionEffect.swift b/Sources/Sticker/StickerMotionEffect/Effects/AccelerometerStickerMotionEffect.swift index 14145da..d55a12d 100644 --- a/Sources/Sticker/StickerMotionEffect/Effects/AccelerometerStickerMotionEffect.swift +++ b/Sources/Sticker/StickerMotionEffect/Effects/AccelerometerStickerMotionEffect.swift @@ -9,6 +9,7 @@ import SwiftUI import CoreMotion +@available(iOS 17, *) public struct AccelerometerStickerMotionEffect: StickerMotionEffect { let intensity: Double let maxRotation: Angle @@ -45,6 +46,7 @@ public struct AccelerometerStickerMotionEffect: StickerMotionEffect { } } +@available(iOS 17, *) public extension StickerMotionEffect where Self == AccelerometerStickerMotionEffect { static var accelerometer: Self { .accelerometer() diff --git a/Sources/Sticker/StickerShaderUpdater/StickerShaderUpdater.swift b/Sources/Sticker/StickerShaderUpdater/StickerShaderUpdater.swift index 4987ec6..d181a62 100644 --- a/Sources/Sticker/StickerShaderUpdater/StickerShaderUpdater.swift +++ b/Sources/Sticker/StickerShaderUpdater/StickerShaderUpdater.swift @@ -6,9 +6,7 @@ // import SwiftUI -import Observation -@Observable final class StickerShaderUpdater { typealias ChangeHandler = (_ motion: StickerMotion) -> Void diff --git a/Sources/Sticker/Utils/Extensions/ShaderLibraryExtension.swift b/Sources/Sticker/Utils/Extensions/ShaderLibraryExtension.swift index 8a227b9..e9c3a2d 100644 --- a/Sources/Sticker/Utils/Extensions/ShaderLibraryExtension.swift +++ b/Sources/Sticker/Utils/Extensions/ShaderLibraryExtension.swift @@ -7,6 +7,7 @@ import SwiftUI +@available(iOS 17, *) extension ShaderLibrary { static var moduleLibrary: ShaderLibrary { .bundle(.module) } @@ -53,6 +54,7 @@ extension ShaderLibrary { } } +@available(iOS 17, *) public extension ShaderLibrary { @available(iOS 18.0, macOS 15.0, visionOS 2.0, tvOS 18.0, watchOS 11.0, *) static func compileStickerShaders() async throws {