From 9061beace3a804e5d93d29529978b575dc3f958a Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Wed, 4 Dec 2019 17:12:44 +0800 Subject: [PATCH 1/5] Add all the available version check, allows for lower firmware deployment target version user --- SDWebImageSwiftUI/Classes/AnimatedImage.swift | 13 +++++++++++++ SDWebImageSwiftUI/Classes/ImageManager.swift | 1 + .../Classes/ImageViewWrapper.swift | 17 +++++++++++------ .../Classes/Indicator/ActivityIndicator.swift | 2 ++ .../Classes/Indicator/Indicator.swift | 4 ++++ .../Classes/Indicator/ProgressIndicator.swift | 2 ++ .../Classes/SDWebImageSwiftUI.swift | 9 +++++++++ .../Classes/Transition/Transition.swift | 1 + SDWebImageSwiftUI/Classes/WebImage.swift | 9 ++++++++- 9 files changed, 51 insertions(+), 7 deletions(-) diff --git a/SDWebImageSwiftUI/Classes/AnimatedImage.swift b/SDWebImageSwiftUI/Classes/AnimatedImage.swift index ed7dc20f..5017011d 100644 --- a/SDWebImageSwiftUI/Classes/AnimatedImage.swift +++ b/SDWebImageSwiftUI/Classes/AnimatedImage.swift @@ -12,6 +12,7 @@ import SDWebImage #if os(iOS) || os(tvOS) || os(macOS) /// A coordinator object used for `AnimatedImage`native view bridge for UIKit/AppKit/WatchKit. +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public final class AnimatedImageCoordinator: NSObject { /// Any user-provided object for actual coordinator, such as delegate method, taget-action @@ -22,6 +23,7 @@ public final class AnimatedImageCoordinator: NSObject { } /// Data Binding Object, only properties in this object can support changes from user with @State and refresh +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) final class AnimatedImageModel : ObservableObject { /// URL image @Published var url: URL? @@ -36,6 +38,7 @@ final class AnimatedImageModel : ObservableObject { } /// Completion Handler Binding Object, supports dynamic @State changes +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) final class AnimatedImageHandler: ObservableObject { // Completion Handler @Published var successBlock: ((PlatformImage, SDImageCacheType) -> Void)? @@ -47,6 +50,7 @@ final class AnimatedImageHandler: ObservableObject { } /// Layout Binding Object, supports dynamic @State changes +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) final class AnimatedImageLayout : ObservableObject { var contentMode: ContentMode? var aspectRatio: CGFloat? @@ -58,6 +62,7 @@ final class AnimatedImageLayout : ObservableObject { } /// Configuration Binding Object, supports dynamic @State changes +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) final class AnimatedImageConfiguration: ObservableObject { var incrementalLoad: Bool? var maxBufferSize: UInt? @@ -73,6 +78,7 @@ final class AnimatedImageConfiguration: ObservableObject { } /// A Image View type to load image from url, data or bundle. Supports animated and static image format. +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct AnimatedImage : PlatformViewRepresentable { @ObservedObject var imageModel = AnimatedImageModel() @ObservedObject var imageHandler = AnimatedImageHandler() @@ -444,6 +450,7 @@ public struct AnimatedImage : PlatformViewRepresentable { } // Layout +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension AnimatedImage { /// Configurate this view's image with the specified cap insets and options. @@ -483,6 +490,7 @@ extension AnimatedImage { } // Aspect Ratio +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension AnimatedImage { /// Constrains this view's dimensions to the specified aspect ratio. /// - Parameters: @@ -541,6 +549,7 @@ extension AnimatedImage { } // AnimatedImage Modifier +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension AnimatedImage { /// Total loop count for animated image rendering. Defaults to nil. @@ -610,6 +619,7 @@ extension AnimatedImage { } // Completion Handler +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension AnimatedImage { /// Provide the action when image load fails. @@ -641,6 +651,7 @@ extension AnimatedImage { } // View Coordinator Handler +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension AnimatedImage { /// Provide the action when view representable create the native view. @@ -668,6 +679,7 @@ extension AnimatedImage { } // Web Image convenience +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension AnimatedImage { /// Associate a placeholder when loading image with url @@ -695,6 +707,7 @@ extension AnimatedImage { } #if DEBUG +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct AnimatedImage_Previews : PreviewProvider { static var previews: some View { Group { diff --git a/SDWebImageSwiftUI/Classes/ImageManager.swift b/SDWebImageSwiftUI/Classes/ImageManager.swift index 36afc991..4111fa97 100644 --- a/SDWebImageSwiftUI/Classes/ImageManager.swift +++ b/SDWebImageSwiftUI/Classes/ImageManager.swift @@ -9,6 +9,7 @@ import SwiftUI import SDWebImage +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) class ImageManager : ObservableObject { @Published var image: PlatformImage? // loaded image, note when progressive loading, this will published multiple times with different partial image @Published var isLoading: Bool = false // whether network is loading or cache is querying, should only be used for indicator binding diff --git a/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift b/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift index 2e911a75..b5b4c165 100644 --- a/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift +++ b/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift @@ -12,6 +12,7 @@ import SDWebImage #if os(iOS) || os(tvOS) || os(macOS) /// Use wrapper to solve tne `UIImageView`/`NSImageView` frame size become image size issue (SwiftUI's Bug) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public class AnimatedImageViewWrapper : PlatformView { var wrapped = SDAnimatedImageView() var interpolationQuality = CGInterpolationQuality.default @@ -67,29 +68,33 @@ public class AnimatedImageViewWrapper : PlatformView { } } -private var sd_imageNameKey: Void? -private var sd_imageDataKey: Void? + /// Store the Animated Image loading state, to avoid re-query duinrg `updateView(_:)` until Source of Truth changes +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension PlatformView { + static private var sd_imageNameKey: Void? + static private var sd_imageDataKey: Void? + var sd_imageName: String? { get { - objc_getAssociatedObject(self, &sd_imageNameKey) as? String + objc_getAssociatedObject(self, &UIView.sd_imageNameKey) as? String } set { - objc_setAssociatedObject(self, &sd_imageNameKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + objc_setAssociatedObject(self, &UIView.sd_imageNameKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } var sd_imageData: Data? { get { - objc_getAssociatedObject(self, &sd_imageDataKey) as? Data + objc_getAssociatedObject(self, &UIView.sd_imageDataKey) as? Data } set { - objc_setAssociatedObject(self, &sd_imageDataKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + objc_setAssociatedObject(self, &UIView.sd_imageDataKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } } /// Use wrapper to solve the `UIProgressView`/`NSProgressIndicator` frame origin NaN crash (SwiftUI's bug) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public class ProgressIndicatorWrapper : PlatformView { #if os(macOS) var wrapped = NSProgressIndicator() diff --git a/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift b/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift index a1595707..7103c77e 100644 --- a/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift +++ b/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift @@ -10,6 +10,7 @@ import SwiftUI #if os(macOS) || os(iOS) || os(tvOS) /// An activity indicator (system style) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct ActivityIndicator: PlatformViewRepresentable { @Binding var isAnimating: Bool var style: Style @@ -71,6 +72,7 @@ public struct ActivityIndicator: PlatformViewRepresentable { #endif } +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension ActivityIndicator { public enum Style { case medium diff --git a/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift b/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift index 403480b8..35a1b36e 100644 --- a/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift +++ b/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift @@ -10,6 +10,7 @@ import Foundation import SwiftUI /// A type to build the indicator +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct Indicator where T : View { var content: (Binding, Binding) -> T @@ -26,6 +27,7 @@ public struct Indicator where T : View { /// A implementation detail View Modifier with indicator /// SwiftUI View Modifier construced by using a internal View type which modify the `body` /// It use type system to represent the view hierarchy, and Swift `some View` syntax to hide the type detail for users +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct IndicatorViewModifier : ViewModifier where T : View { @ObservedObject var imageManager: ImageManager @@ -44,6 +46,7 @@ struct IndicatorViewModifier : ViewModifier where T : View { } #if os(macOS) || os(iOS) || os(tvOS) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension Indicator where T == ActivityIndicator { /// Activity Indicator public static var activity: Indicator { @@ -61,6 +64,7 @@ extension Indicator where T == ActivityIndicator { } } +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension Indicator where T == ProgressIndicator { /// Progress Indicator public static var progress: Indicator { diff --git a/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift b/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift index b9da9e12..6924d800 100644 --- a/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift +++ b/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift @@ -10,6 +10,7 @@ import SwiftUI #if os(macOS) || os(iOS) || os(tvOS) /// A progress bar indicator (system style) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct ProgressIndicator: PlatformViewRepresentable { @Binding var isAnimating: Bool @Binding var progress: CGFloat @@ -101,6 +102,7 @@ public struct ProgressIndicator: PlatformViewRepresentable { #endif } +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension ProgressIndicator { public enum Style { case `default` diff --git a/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift b/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift index bca01237..c679c492 100644 --- a/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift +++ b/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift @@ -10,11 +10,14 @@ import Foundation import SwiftUI #if os(macOS) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public typealias PlatformImage = NSImage #else +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public typealias PlatformImage = UIImage #endif +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension Image { init(platformImage: PlatformImage) { #if os(macOS) @@ -26,21 +29,27 @@ extension Image { } #if os(macOS) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public typealias PlatformView = NSView #endif #if os(iOS) || os(tvOS) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public typealias PlatformView = UIView #endif #if os(watchOS) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public typealias PlatformView = WKInterfaceObject #endif #if os(macOS) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public typealias PlatformViewRepresentable = NSViewRepresentable #endif #if os(iOS) || os(tvOS) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public typealias PlatformViewRepresentable = UIViewRepresentable #endif #if os(watchOS) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public typealias PlatformViewRepresentable = WKInterfaceObjectRepresentable #endif diff --git a/SDWebImageSwiftUI/Classes/Transition/Transition.swift b/SDWebImageSwiftUI/Classes/Transition/Transition.swift index 287a5e14..ff14f49f 100644 --- a/SDWebImageSwiftUI/Classes/Transition/Transition.swift +++ b/SDWebImageSwiftUI/Classes/Transition/Transition.swift @@ -8,6 +8,7 @@ import SwiftUI +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension AnyTransition { /// Fade-in transition diff --git a/SDWebImageSwiftUI/Classes/WebImage.swift b/SDWebImageSwiftUI/Classes/WebImage.swift index 95563011..435378a4 100644 --- a/SDWebImageSwiftUI/Classes/WebImage.swift +++ b/SDWebImageSwiftUI/Classes/WebImage.swift @@ -9,7 +9,8 @@ import SwiftUI import SDWebImage -/// A Image View type to load image from url. Supports static image format. +/// A Image View type to load image from url. Supports static/animated image format. +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct WebImage : View { var configurations: [(Image) -> Image] = [] @@ -90,6 +91,7 @@ public struct WebImage : View { } // Layout +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension WebImage { func configure(_ block: @escaping (Image) -> Image) -> WebImage { var result = self @@ -127,6 +129,7 @@ extension WebImage { } // Completion Handler +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension WebImage { /// Provide the action when image load fails. @@ -158,6 +161,7 @@ extension WebImage { } // WebImage Modifier +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension WebImage { /// Associate a placeholder when loading image with url @@ -198,6 +202,7 @@ extension WebImage { } // Indicator +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension WebImage { /// Associate a indicator when loading image with url @@ -214,6 +219,7 @@ extension WebImage { } // Animated Image support (Beta) +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension WebImage { /// Make the image to support animated images. The animation will start when view appears, and pause when disappears. @@ -259,6 +265,7 @@ extension WebImage { } #if DEBUG +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct WebImage_Previews : PreviewProvider { static var previews: some View { Group { From 056cc697131cc71946cd0b4bf25628e4cc43d25a Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Wed, 4 Dec 2019 20:01:55 +0800 Subject: [PATCH 2/5] Use the BUILD_LIBRARY_FOR_DISTRIBUTION to generate swift interface instead of Swift module --- Package.swift | 3 +-- SDWebImageSwiftUI.podspec | 5 +++++ SDWebImageSwiftUI.xcodeproj/project.pbxproj | 2 ++ SDWebImageSwiftUI/Classes/ImageViewWrapper.swift | 8 ++++---- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Package.swift b/Package.swift index b2c34f98..91c33a1a 100644 --- a/Package.swift +++ b/Package.swift @@ -25,8 +25,7 @@ let package = Package( .target( name: "SDWebImageSwiftUI", dependencies: ["SDWebImage"], - path: "SDWebImageSwiftUI/Classes", - exclude: ["ObjC"] + path: "SDWebImageSwiftUI/Classes" ), ] ) diff --git a/SDWebImageSwiftUI.podspec b/SDWebImageSwiftUI.podspec index 148274c5..600aa559 100644 --- a/SDWebImageSwiftUI.podspec +++ b/SDWebImageSwiftUI.podspec @@ -27,6 +27,11 @@ It brings all your favorite features from SDWebImage, like async image loading, s.watchos.deployment_target = '6.0' s.source_files = 'SDWebImageSwiftUI/Classes/**/*', 'SDWebImageSwiftUI/Module/*.h' + s.pod_target_xcconfig = { + 'SUPPORTS_MACCATALYST' => 'YES', + 'DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER' => 'NO', + 'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES' + } s.frameworks = 'SwiftUI' s.dependency 'SDWebImage', '~> 5.3' diff --git a/SDWebImageSwiftUI.xcodeproj/project.pbxproj b/SDWebImageSwiftUI.xcodeproj/project.pbxproj index fa37c7c0..94f3aa6f 100644 --- a/SDWebImageSwiftUI.xcodeproj/project.pbxproj +++ b/SDWebImageSwiftUI.xcodeproj/project.pbxproj @@ -500,6 +500,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -566,6 +567,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; diff --git a/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift b/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift index b5b4c165..a2e66a8a 100644 --- a/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift +++ b/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift @@ -77,18 +77,18 @@ extension PlatformView { var sd_imageName: String? { get { - objc_getAssociatedObject(self, &UIView.sd_imageNameKey) as? String + objc_getAssociatedObject(self, &PlatformView.sd_imageNameKey) as? String } set { - objc_setAssociatedObject(self, &UIView.sd_imageNameKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + objc_setAssociatedObject(self, &PlatformView.sd_imageNameKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } var sd_imageData: Data? { get { - objc_getAssociatedObject(self, &UIView.sd_imageDataKey) as? Data + objc_getAssociatedObject(self, &PlatformView.sd_imageDataKey) as? Data } set { - objc_setAssociatedObject(self, &UIView.sd_imageDataKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + objc_setAssociatedObject(self, &PlatformView.sd_imageDataKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } } From 99766155102caeca296f5dbd95720b8af08fb8e0 Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Fri, 6 Dec 2019 17:53:47 +0800 Subject: [PATCH 3/5] Update Podspec with weak linking for SwiftUI, Combine --- SDWebImageSwiftUI.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDWebImageSwiftUI.podspec b/SDWebImageSwiftUI.podspec index 600aa559..b56527d8 100644 --- a/SDWebImageSwiftUI.podspec +++ b/SDWebImageSwiftUI.podspec @@ -33,7 +33,7 @@ It brings all your favorite features from SDWebImage, like async image loading, 'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES' } - s.frameworks = 'SwiftUI' + s.weak_frameworks = 'SwiftUI', 'Combine' s.dependency 'SDWebImage', '~> 5.3' s.swift_version = '5.1' end From edae2e27a5be1f15772c43082504cbd6e370f7ae Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Fri, 6 Dec 2019 21:31:41 +0800 Subject: [PATCH 4/5] Add the weak linking for Xcode project (Carthage) --- SDWebImageSwiftUI.xcodeproj/project.pbxproj | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/SDWebImageSwiftUI.xcodeproj/project.pbxproj b/SDWebImageSwiftUI.xcodeproj/project.pbxproj index 94f3aa6f..6aefb55b 100644 --- a/SDWebImageSwiftUI.xcodeproj/project.pbxproj +++ b/SDWebImageSwiftUI.xcodeproj/project.pbxproj @@ -553,6 +553,12 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-weak_framework", + SwiftUI, + "-weak_framework", + Combine, + ); SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -613,6 +619,12 @@ MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + OTHER_LDFLAGS = ( + "-weak_framework", + SwiftUI, + "-weak_framework", + Combine, + ); SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; From f2cb9d04f185bc4515168b7f24acd35a548a177a Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Fri, 6 Dec 2019 22:15:17 +0800 Subject: [PATCH 5/5] Add the readme about backward deployment for CocoaPods and Carthage --- README.md | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 99977985..7b32021a 100644 --- a/README.md +++ b/README.md @@ -213,7 +213,7 @@ For more information, it's really recommended to check our demo, to learn detail ### Common Problems -+ Using Image/WebImage/AnimatedImage in Button/NavigationLink +#### Using Image/WebImage/AnimatedImage in Button/NavigationLink SwiftUI's `Button` apply overlay to its content (except `Text`) by default, this is common mistake to write code like this, which cause strange behavior: @@ -251,6 +251,65 @@ NavigationView { } ``` +#### Use for backward deployment and weak linking SwiftUI + +SDWebImageSwiftUI supports to use when your App Target has a deployment target version less than iOS 13/macOS 10.15/tvOS 13/watchOS 6. Which will weak linking of SwiftUI(Combine) to allows writing code with available check at runtime. + +To use backward deployment, you have to do the follow things: + ++ Add `-weak_framework SwiftUI -weak_framework Combine` in your App Target's `Other Linker Flags` build setting + +You should notice that all the third party SwiftUI framework should have this build setting as well, not only just ourself (we already added). Or when running on iOS 12 device, it will trigger the runtime dyld error on startup. + ++ Use CocoaPods or Carthage (SwiftPM does not support weak linking nor backward deployment currently) + +For Carthage user, the built binary framework will use [Library Evolution](https://swift.org/blog/abi-stability-and-more/) to support for backward deployment. + +For CocoaPods user, you should skip the platform validation in Podfile with + +```ruby +platform :ios, '13.0' # This does not effect your App Target's deployment target version, just a hint for CocoaPods +``` + ++ Add **all the SwiftUI code** with the available annotation and runtime check, like this: + +```swift +// AppDelegate.swift +func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // ... + if #available(iOS 13, *) { + window.rootViewController = UIHostingController(rootView: contentView) + } else { + window.rootViewController = ViewController() + } + // ... +} + +// ViewController.swift +class ViewController: UIViewController { + var label: UILabel = UILabel() + override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = .white + self.view.addSubview(label) + self.label.text = "Hello World iOS 12!" + self.label.sizeToFit() + self.label.center = self.view.center + } +} + +// ContentView.swift +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) +struct ContentView : View { + var body: some View { + Group { + Text("Hello World iOS 13!") + WebImage(url: URL(string: "https://i.loli.net/2019/09/24/rX2RkVWeGKIuJvc.jpg")) + } + } +} +``` + ## Demo To run the example using SwiftUI, following the steps: