接入Firebase埋点和AppLovinSDK广告

This commit is contained in:
忆海16 2024-04-22 10:40:00 +08:00
parent c2ae7720ae
commit 803519a909
78 changed files with 15168 additions and 4488 deletions

View File

@ -6,23 +6,30 @@ target 'wallpaper_project' do
use_frameworks! use_frameworks!
# Pods for wallpaper_project # Pods for wallpaper_project
pod 'SnapKit' pod 'SnapKit'
#pod 'AFNetworking' #pod 'AFNetworking'
pod 'SDWebImage' pod 'SDWebImage'
pod 'IQKeyboardManagerSwift' pod 'IQKeyboardManagerSwift'
pod 'BRPickerView' pod 'BRPickerView'
pod 'Alamofire' pod 'Alamofire'
pod 'FSPagerView' pod 'FSPagerView'
pod 'SVProgressHUD' pod 'SVProgressHUD'
pod 'CYLTabBarController' pod 'CYLTabBarController'
pod 'GYSide' pod 'GYSide'
pod 'JXSegmentedView' pod 'JXSegmentedView'
pod 'MJExtension' pod 'MJExtension'
pod 'MJRefresh' pod 'MJRefresh'
pod 'FLAnimatedImage' pod 'FLAnimatedImage'
pod 'lottie-ios' pod 'lottie-ios'
pod 'AppLovinSDK'
post_install do |installer| pod 'AppLovinDSPLinkedInAdapter'
pod 'AppLovinMediationVungleAdapter'
pod 'AppLovinMediationByteDanceAdapter'
# pod 'Firebase/Analytics'
#pod 'Firebase/Analytics'
pod 'Firebase/Core'
pod 'Firebase/AnalyticsWithoutAdIdSupport'
post_install do |installer|
installer.generated_projects.each do |project| installer.generated_projects.each do |project|
project.targets.each do |target| project.targets.each do |target|
target.build_configurations.each do |config| target.build_configurations.each do |config|
@ -30,5 +37,5 @@ post_install do |installer|
end end
end end
end end
end end
end end

View File

@ -1,5 +1,21 @@
PODS: PODS:
- Alamofire (5.9.0) - Ads-Global/BUAdSDK_Compatible (5.9.0.6):
- Ads-Global/BURelyAdSDK
- Ads-Global/Dep_Compatible
- Ads-Global/BURelyAdSDK (5.9.0.6)
- Ads-Global/Dep_Compatible (5.9.0.6):
- BURelyFoundation_Global/Pangle (~> 0.2.1.4)
- Alamofire (5.9.1)
- AppLovinDSPLinkedInAdapter (1.2.2.0):
- AppLovinSDK
- LinkedinAudienceNetwork (= 1.2.2)
- AppLovinMediationByteDanceAdapter (5.9.0.6.0):
- Ads-Global/BUAdSDK_Compatible (= 5.9.0.6)
- AppLovinSDK
- AppLovinMediationVungleAdapter (7.3.1.0):
- AppLovinSDK
- VungleAds (= 7.3.1)
- AppLovinSDK (12.4.1)
- BRPickerView (2.8.1): - BRPickerView (2.8.1):
- BRPickerView/AddressPickerView (= 2.8.1) - BRPickerView/AddressPickerView (= 2.8.1)
- BRPickerView/Base (= 2.8.1) - BRPickerView/Base (= 2.8.1)
@ -12,29 +28,165 @@ PODS:
- BRPickerView/Base - BRPickerView/Base
- BRPickerView/StringPickerView (2.8.1): - BRPickerView/StringPickerView (2.8.1):
- BRPickerView/Base - BRPickerView/Base
- BURelyFoundation_Global/AFNetworking (0.2.1.4)
- BURelyFoundation_Global/APM (0.2.1.4)
- BURelyFoundation_Global/Foundation (0.2.1.4):
- BURelyFoundation_Global/NETWork
- BURelyFoundation_Global/Gecko (0.2.1.4):
- BURelyFoundation_Global/Foundation
- BURelyFoundation_Global/Header (0.2.1.4)
- BURelyFoundation_Global/NETWork (0.2.1.4):
- BURelyFoundation_Global/AFNetworking
- BURelyFoundation_Global/Pangle (0.2.1.4):
- BURelyFoundation_Global/AFNetworking
- BURelyFoundation_Global/APM
- BURelyFoundation_Global/Foundation
- BURelyFoundation_Global/Gecko
- BURelyFoundation_Global/Header
- BURelyFoundation_Global/NETWork
- BURelyFoundation_Global/SDWebImage
- BURelyFoundation_Global/YYModel
- BURelyFoundation_Global/ZFPlayer
- BURelyFoundation_Global/Zip
- BURelyFoundation_Global/SDWebImage (0.2.1.4):
- BURelyFoundation_Global/Foundation
- BURelyFoundation_Global/YYModel (0.2.1.4)
- BURelyFoundation_Global/ZFPlayer (0.2.1.4):
- BURelyFoundation_Global/Foundation
- BURelyFoundation_Global/Zip
- BURelyFoundation_Global/Zip (0.2.1.4):
- BURelyFoundation_Global/Foundation
- CYLTabBarController (1.29.2): - CYLTabBarController (1.29.2):
- CYLTabBarController/Core (= 1.29.2) - CYLTabBarController/Core (= 1.29.2)
- CYLTabBarController/Core (1.29.2) - CYLTabBarController/Core (1.29.2)
- Firebase/AnalyticsWithoutAdIdSupport (10.24.0):
- Firebase/CoreOnly
- FirebaseAnalytics/WithoutAdIdSupport (~> 10.24.0)
- Firebase/Core (10.24.0):
- Firebase/CoreOnly
- FirebaseAnalytics (~> 10.24.0)
- Firebase/CoreOnly (10.24.0):
- FirebaseCore (= 10.24.0)
- FirebaseAnalytics (10.24.0):
- FirebaseAnalytics/AdIdSupport (= 10.24.0)
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- FirebaseAnalytics/AdIdSupport (10.24.0):
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleAppMeasurement (= 10.24.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- FirebaseAnalytics/WithoutAdIdSupport (10.24.0):
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleAppMeasurement/WithoutAdIdSupport (= 10.24.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- FirebaseCore (10.24.0):
- FirebaseCoreInternal (~> 10.0)
- GoogleUtilities/Environment (~> 7.12)
- GoogleUtilities/Logger (~> 7.12)
- FirebaseCoreInternal (10.24.0):
- "GoogleUtilities/NSData+zlib (~> 7.8)"
- FirebaseInstallations (10.24.0):
- FirebaseCore (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- PromisesObjC (~> 2.1)
- FLAnimatedImage (1.0.17) - FLAnimatedImage (1.0.17)
- FSPagerView (0.8.3) - FSPagerView (0.8.3)
- GoogleAppMeasurement (10.24.0):
- GoogleAppMeasurement/AdIdSupport (= 10.24.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- GoogleAppMeasurement/AdIdSupport (10.24.0):
- GoogleAppMeasurement/WithoutAdIdSupport (= 10.24.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- GoogleAppMeasurement/WithoutAdIdSupport (10.24.0):
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- GoogleUtilities/AppDelegateSwizzler (7.13.0):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Privacy
- GoogleUtilities/Environment (7.13.0):
- GoogleUtilities/Privacy
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/Logger (7.13.0):
- GoogleUtilities/Environment
- GoogleUtilities/Privacy
- GoogleUtilities/MethodSwizzler (7.13.0):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GoogleUtilities/Network (7.13.0):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Privacy
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (7.13.0)":
- GoogleUtilities/Privacy
- GoogleUtilities/Privacy (7.13.0)
- GoogleUtilities/Reachability (7.13.0):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GoogleUtilities/UserDefaults (7.13.0):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GYSide (0.0.5) - GYSide (0.0.5)
- IQKeyboardManagerSwift (7.0.1) - IQKeyboardManagerSwift (6.5.16)
- JXSegmentedView (1.3.0) - JXSegmentedView (1.3.3)
- LinkedinAudienceNetwork (1.2.2)
- lottie-ios (4.4.1) - lottie-ios (4.4.1)
- MJExtension (3.4.1) - MJExtension (3.4.2)
- MJRefresh (3.7.6) - MJRefresh (3.7.9)
- SDWebImage (5.19.0): - nanopb (2.30910.0):
- SDWebImage/Core (= 5.19.0) - nanopb/decode (= 2.30910.0)
- SDWebImage/Core (5.19.0) - nanopb/encode (= 2.30910.0)
- nanopb/decode (2.30910.0)
- nanopb/encode (2.30910.0)
- PromisesObjC (2.4.0)
- SDWebImage (5.19.1):
- SDWebImage/Core (= 5.19.1)
- SDWebImage/Core (5.19.1)
- SnapKit (5.7.1) - SnapKit (5.7.1)
- SVProgressHUD (2.3.1): - SVProgressHUD (2.3.1):
- SVProgressHUD/Core (= 2.3.1) - SVProgressHUD/Core (= 2.3.1)
- SVProgressHUD/Core (2.3.1) - SVProgressHUD/Core (2.3.1)
- VungleAds (7.3.1)
DEPENDENCIES: DEPENDENCIES:
- Alamofire - Alamofire
- AppLovinDSPLinkedInAdapter
- AppLovinMediationByteDanceAdapter
- AppLovinMediationVungleAdapter
- AppLovinSDK
- BRPickerView - BRPickerView
- CYLTabBarController - CYLTabBarController
- Firebase/AnalyticsWithoutAdIdSupport
- Firebase/Core
- FLAnimatedImage - FLAnimatedImage
- FSPagerView - FSPagerView
- GYSide - GYSide
@ -49,37 +201,71 @@ DEPENDENCIES:
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- Ads-Global
- Alamofire - Alamofire
- AppLovinDSPLinkedInAdapter
- AppLovinMediationByteDanceAdapter
- AppLovinMediationVungleAdapter
- AppLovinSDK
- BRPickerView - BRPickerView
- BURelyFoundation_Global
- CYLTabBarController - CYLTabBarController
- Firebase
- FirebaseAnalytics
- FirebaseCore
- FirebaseCoreInternal
- FirebaseInstallations
- FLAnimatedImage - FLAnimatedImage
- FSPagerView - FSPagerView
- GoogleAppMeasurement
- GoogleUtilities
- GYSide - GYSide
- IQKeyboardManagerSwift - IQKeyboardManagerSwift
- JXSegmentedView - JXSegmentedView
- LinkedinAudienceNetwork
- lottie-ios - lottie-ios
- MJExtension - MJExtension
- MJRefresh - MJRefresh
- nanopb
- PromisesObjC
- SDWebImage - SDWebImage
- SnapKit - SnapKit
- SVProgressHUD - SVProgressHUD
- VungleAds
SPEC CHECKSUMS: SPEC CHECKSUMS:
Alamofire: 02b772c9910e8eba1a079227c32fbd9e46c90a24 Ads-Global: 3ed9f8c6f11d4d6a4496e1dd74a4537f10b41b65
Alamofire: f36a35757af4587d8e4f4bfa223ad10be2422b8c
AppLovinDSPLinkedInAdapter: 093f25d472b4073f8203fa72a68347cbd589e232
AppLovinMediationByteDanceAdapter: d902ba6e2a6c0061bf2675ec74428b37620b59ca
AppLovinMediationVungleAdapter: b42444550ca03233753cfeb36a5660f94d038fb5
AppLovinSDK: c57ad0d34625c971d2db127f8ef60570b28ff51a
BRPickerView: 2531a2d4d0fea0b57a1c738de215af0f88863a2f BRPickerView: 2531a2d4d0fea0b57a1c738de215af0f88863a2f
BURelyFoundation_Global: 17ed9cd58d138feefd8c0711dd3294766adcb28e
CYLTabBarController: db44b5901a28693a8a4279e4721b3aafdd36c178 CYLTabBarController: db44b5901a28693a8a4279e4721b3aafdd36c178
Firebase: 91fefd38712feb9186ea8996af6cbdef41473442
FirebaseAnalytics: b5efc493eb0f40ec560b04a472e3e1a15d39ca13
FirebaseCore: 11dc8a16dfb7c5e3c3f45ba0e191a33ac4f50894
FirebaseCoreInternal: bcb5acffd4ea05e12a783ecf835f2210ce3dc6af
FirebaseInstallations: 8f581fca6478a50705d2bd2abd66d306e0f5736e
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
FSPagerView: 670405b2f18e2a87fa37f20b00de783e562c25a8 FSPagerView: 670405b2f18e2a87fa37f20b00de783e562c25a8
GoogleAppMeasurement: f3abf08495ef2cba7829f15318c373b8d9226491
GoogleUtilities: d053d902a8edaa9904e1bd00c37535385b8ed152
GYSide: 672895491bf7a809f0631dd8a122ab5d1d601aae GYSide: 672895491bf7a809f0631dd8a122ab5d1d601aae
IQKeyboardManagerSwift: 7f6b1b1d1497855d2beea7f2f10ffcc6978525b1 IQKeyboardManagerSwift: 12d89768845bb77b55cc092ecc2b1f9370f06b76
JXSegmentedView: fec0d335355b6e019c494fe2e030bde8a36d2df6 JXSegmentedView: 651b60fcf705258ba9395edd53876dbd2853fb68
LinkedinAudienceNetwork: de299f32547bd528916b3c9f113015f74347398c
lottie-ios: e047b1d2e6239b787cc5e9755b988869cf190494 lottie-ios: e047b1d2e6239b787cc5e9755b988869cf190494
MJExtension: 21c5f6f8c4d5d8844b7ae8fbae08fed0b501f961 MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
MJRefresh: 2fe7fb43a5167ceda20bb7e63f130c04fd1814a5 MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
SDWebImage: 981fd7e860af070920f249fd092420006014c3eb nanopb: 438bc412db1928dac798aa6fd75726007be04262
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
SDWebImage: 40b0b4053e36c660a764958bff99eed16610acbb
SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22 SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22
VungleAds: 04a17ab51fb61f41cd6d666fd0024509005740fe
PODFILE CHECKSUM: 8919f964b95c5ac6e11bc2a3a3200b4dd02b3b9c PODFILE CHECKSUM: e5237cccfc6fa11c317ad1e1cbd81ea18c1f4a05
COCOAPODS: 1.15.2 COCOAPODS: 1.15.2

View File

@ -132,7 +132,7 @@ Once you have your Swift package set up, adding Alamofire as a dependency is as
```swift ```swift
dependencies: [ dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.9.0")) .package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.9.1"))
] ]
``` ```

View File

@ -39,5 +39,5 @@ public let AF = Session.default
/// Namespace for informational Alamofire values. /// Namespace for informational Alamofire values.
public enum AFInfo { public enum AFInfo {
/// Current Alamofire version. /// Current Alamofire version.
public static let version = "5.9.0" public static let version = "5.9.1"
} }

View File

@ -25,7 +25,7 @@
import Foundation import Foundation
/// An order-preserving and case-insensitive representation of HTTP headers. /// An order-preserving and case-insensitive representation of HTTP headers.
public struct HTTPHeaders { public struct HTTPHeaders: Equatable, Hashable, Sendable {
private var headers: [HTTPHeader] = [] private var headers: [HTTPHeader] = []
/// Creates an empty instance. /// Creates an empty instance.
@ -185,7 +185,7 @@ extension HTTPHeaders: CustomStringConvertible {
// MARK: - HTTPHeader // MARK: - HTTPHeader
/// A representation of a single HTTP header's name / value pair. /// A representation of a single HTTP header's name / value pair.
public struct HTTPHeader: Hashable { public struct HTTPHeader: Equatable, Hashable, Sendable {
/// Name of the header. /// Name of the header.
public let name: String public let name: String

View File

@ -26,7 +26,7 @@
/// `HTTPMethod.get != HTTPMethod(rawValue: "get")`. /// `HTTPMethod.get != HTTPMethod(rawValue: "get")`.
/// ///
/// See https://tools.ietf.org/html/rfc7231#section-4.3 /// See https://tools.ietf.org/html/rfc7231#section-4.3
public struct HTTPMethod: RawRepresentable, Equatable, Hashable { public struct HTTPMethod: RawRepresentable, Equatable, Hashable, Sendable {
/// `CONNECT` method. /// `CONNECT` method.
public static let connect = HTTPMethod(rawValue: "CONNECT") public static let connect = HTTPMethod(rawValue: "CONNECT")
/// `DELETE` method. /// `DELETE` method.

View File

@ -1,7 +1,7 @@
// //
// IQKeyboardManagerConstants.swift // IQKeyboardManagerConstants.swift
// https://github.com/hackiftekhar/IQKeyboardManager // https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi. // Copyright (c) 2013-20 Iftekhar Qurashi.
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -23,11 +23,11 @@
import Foundation import Foundation
// MARK: IQAutoToolbarManageBehavior // MARK: IQAutoToolbarManageBehaviour
/** /**
`IQAutoToolbarBySubviews` `IQAutoToolbarBySubviews`
Creates Toolbar according to subview's hierarchy of Textfield's in view. Creates Toolbar according to subview's hirarchy of Textfield's in view.
`IQAutoToolbarByTag` `IQAutoToolbarByTag`
Creates Toolbar according to tag property of TextField's. Creates Toolbar according to tag property of TextField's.
@ -36,7 +36,7 @@ Creates Toolbar according to tag property of TextField's.
Creates Toolbar according to the y,x position of textField in it's superview coordinate. Creates Toolbar according to the y,x position of textField in it's superview coordinate.
*/ */
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@objc public enum IQAutoToolbarManageBehavior: Int { @objc public enum IQAutoToolbarManageBehaviour: Int {
case bySubviews case bySubviews
case byTag case byTag
case byPosition case byPosition
@ -50,8 +50,7 @@ Creates Toolbar according to the y,x position of textField in it's superview coo
Do not show NextPrevious buttons in any case. Do not show NextPrevious buttons in any case.
`IQPreviousNextDisplayModeAlwaysShow` `IQPreviousNextDisplayModeAlwaysShow`
Always show nextPrevious buttons, Always show nextPrevious buttons, if there are more than 1 textField then both buttons will be visible but will be shown as disabled.
if there are more than 1 textField then both buttons will be visible but will be shown as disabled.
*/ */
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@objc public enum IQPreviousNextDisplayMode: Int { @objc public enum IQPreviousNextDisplayMode: Int {

View File

@ -1,7 +1,7 @@
// //
// IQPlaceholderable.swift // IQPlaceholderable.swift
// https://github.com/hackiftekhar/IQKeyboardManager // https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi. // Copyright (c) 2013-20 Iftekhar Qurashi.
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -25,7 +25,6 @@ import Foundation
import UIKit import UIKit
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@MainActor
public protocol IQPlaceholderable: AnyObject { public protocol IQPlaceholderable: AnyObject {
var placeholder: String? { get set } var placeholder: String? { get set }

View File

@ -1,7 +1,7 @@
// //
// IQTextView.swift // IQTextView.swift
// https://github.com/hackiftekhar/IQKeyboardManager // https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi. // Copyright (c) 2013-20 Iftekhar Qurashi.
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -25,42 +25,33 @@ import UIKit
/** @abstract UITextView with placeholder support */ /** @abstract UITextView with placeholder support */
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@MainActor
@objc open class IQTextView: UITextView { @objc open class IQTextView: UITextView {
@objc required public init?(coder aDecoder: NSCoder) { @objc required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder) super.init(coder: aDecoder)
NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), name: UITextView.textDidChangeNotification, object: self)
name: UITextView.textDidChangeNotification, object: self)
} }
@objc override public init(frame: CGRect, textContainer: NSTextContainer?) { @objc override public init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer) super.init(frame: frame, textContainer: textContainer)
NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), name: UITextView.textDidChangeNotification, object: self)
name: UITextView.textDidChangeNotification, object: self)
} }
@objc override open func awakeFromNib() { @objc override open func awakeFromNib() {
super.awakeFromNib() super.awakeFromNib()
NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), name: UITextView.textDidChangeNotification, object: self)
name: UITextView.textDidChangeNotification, object: self)
} }
private var placeholderInsets: UIEdgeInsets { private var placeholderInsets: UIEdgeInsets {
let top: CGFloat = self.textContainerInset.top return UIEdgeInsets(top: self.textContainerInset.top, left: self.textContainerInset.left + self.textContainer.lineFragmentPadding, bottom: self.textContainerInset.bottom, right: self.textContainerInset.right + self.textContainer.lineFragmentPadding)
let left: CGFloat = self.textContainerInset.left + self.textContainer.lineFragmentPadding
let bottom: CGFloat = self.textContainerInset.bottom
let right: CGFloat = self.textContainerInset.right + self.textContainer.lineFragmentPadding
return UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
} }
private var placeholderExpectedFrame: CGRect { private var placeholderExpectedFrame: CGRect {
let insets: UIEdgeInsets = self.placeholderInsets let placeholderInsets = self.placeholderInsets
let maxWidth: CGFloat = self.frame.width-insets.left-insets.right let maxWidth = self.frame.width-placeholderInsets.left-placeholderInsets.right
let size: CGSize = CGSize(width: maxWidth, height: self.frame.height-insets.top-insets.bottom) let expectedSize = placeholderLabel.sizeThatFits(CGSize(width: maxWidth, height: self.frame.height-placeholderInsets.top-placeholderInsets.bottom))
let expectedSize: CGSize = placeholderLabel.sizeThatFits(size)
return CGRect(x: insets.left, y: insets.top, width: maxWidth, height: expectedSize.height) return CGRect(x: placeholderInsets.left, y: placeholderInsets.top, width: maxWidth, height: expectedSize.height)
} }
lazy var placeholderLabel: UILabel = { lazy var placeholderLabel: UILabel = {
@ -127,7 +118,7 @@ import UIKit
placeholderLabel.frame = placeholderExpectedFrame placeholderLabel.frame = placeholderExpectedFrame
} }
@objc private func refreshPlaceholder() { @objc internal func refreshPlaceholder() {
let text: String = text ?? attributedText?.string ?? "" let text: String = text ?? attributedText?.string ?? ""
if text.isEmpty { if text.isEmpty {
@ -155,7 +146,7 @@ import UIKit
didSet { didSet {
if let unwrappedFont: UIFont = font { if let unwrappedFont = font {
placeholderLabel.font = unwrappedFont placeholderLabel.font = unwrappedFont
} else { } else {
placeholderLabel.font = UIFont.systemFont(ofSize: 12) placeholderLabel.font = UIFont.systemFont(ofSize: 12)
@ -186,8 +177,8 @@ import UIKit
return super.intrinsicContentSize return super.intrinsicContentSize
} }
var newSize: CGSize = super.intrinsicContentSize var newSize = super.intrinsicContentSize
let placeholderInsets: UIEdgeInsets = self.placeholderInsets let placeholderInsets = self.placeholderInsets
newSize.height = placeholderExpectedFrame.height + placeholderInsets.top + placeholderInsets.bottom newSize.height = placeholderExpectedFrame.height + placeholderInsets.top + placeholderInsets.bottom
return newSize return newSize

View File

@ -1,7 +1,7 @@
// //
// IQBarButtonItem.swift // IQBarButtonItem.swift
// https://github.com/hackiftekhar/IQKeyboardManager // https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi. // Copyright (c) 2013-20 Iftekhar Qurashi.
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -21,15 +21,12 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE. // THE SOFTWARE.
// import Foundation - UIKit contains Foundation
import UIKit import UIKit
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@MainActor
@objc open class IQBarButtonItem: UIBarButtonItem { @objc open class IQBarButtonItem: UIBarButtonItem {
internal static let flexibleBarButtonItem: IQBarButtonItem = IQBarButtonItem(barButtonSystemItem: .flexibleSpace,
target: nil, action: nil)
@objc public override init() { @objc public override init() {
super.init() super.init()
initialize() initialize()
@ -59,10 +56,10 @@ import UIKit
@objc override open var tintColor: UIColor? { @objc override open var tintColor: UIColor? {
didSet { didSet {
var textAttributes: [NSAttributedString.Key: Any] = [:] var textAttributes = [NSAttributedString.Key: Any]()
textAttributes[.foregroundColor] = tintColor textAttributes[.foregroundColor] = tintColor
if let attributes: [NSAttributedString.Key: Any] = titleTextAttributes(for: .normal) { if let attributes = titleTextAttributes(for: .normal) {
for (key, value) in attributes { for (key, value) in attributes {
textAttributes[key] = value textAttributes[key] = value
} }
@ -73,22 +70,18 @@ import UIKit
} }
/** /**
Boolean to know if it's a system item or custom item, Boolean to know if it's a system item or custom item, we are having a limitation that we cannot override a designated initializer, so we are manually setting this property once in initialization
we are having a limitation that we cannot override a designated initializer,
so we are manually setting this property once in initialization
*/ */
internal var isSystemItem: Bool = false @objc internal var isSystemItem = false
/** /**
Additional target & action to do get callback action. Additional target & action to do get callback action. Note that setting custom target & selector doesn't affect native functionality, this is just an additional target to get a callback.
Note that setting custom target & selector doesn't affect native functionality,
this is just an additional target to get a callback.
@param target Target object. @param target Target object.
@param action Target Selector. @param action Target Selector.
*/ */
@objc open func setTarget(_ target: AnyObject?, action: Selector?) { @objc open func setTarget(_ target: AnyObject?, action: Selector?) {
if let target: AnyObject = target, let action: Selector = action { if let target = target, let action = action {
invocation = IQInvocation(target, action) invocation = IQInvocation(target, action)
} else { } else {
invocation = nil invocation = nil
@ -96,8 +89,7 @@ import UIKit
} }
/** /**
Customized Invocation to be called when button is pressed. Customized Invocation to be called when button is pressed. invocation is internally created using setTarget:action: method.
invocation is internally created using setTarget:action: method.
*/ */
@objc open var invocation: IQInvocation? { @objc open var invocation: IQInvocation? {
didSet { didSet {

View File

@ -1,7 +1,7 @@
// //
// IQInvocation.swift // IQInvocation.swift
// https://github.com/hackiftekhar/IQKeyboardManager // https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi. // Copyright (c) 2013-20 Iftekhar Qurashi.
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -24,7 +24,6 @@
import UIKit import UIKit
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@MainActor
@objc public final class IQInvocation: NSObject { @objc public final class IQInvocation: NSObject {
@objc public weak var target: AnyObject? @objc public weak var target: AnyObject?
@objc public var action: Selector @objc public var action: Selector
@ -35,8 +34,12 @@ import UIKit
} }
@objc public func invoke(from: Any) { @objc public func invoke(from: Any) {
if let target: AnyObject = target { if let target = target {
UIApplication.shared.sendAction(action, to: target, from: from, for: UIEvent()) UIApplication.shared.sendAction(action, to: target, from: from, for: UIEvent())
} }
} }
deinit {
target = nil
}
} }

View File

@ -1,7 +1,7 @@
// //
// IQPreviousNextView.swift // IQPreviousNextView.swift
// https://github.com/hackiftekhar/IQKeyboardManager // https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi. // Copyright (c) 2013-20 Iftekhar Qurashi.
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -24,6 +24,6 @@
import UIKit import UIKit
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@MainActor
@objc open class IQPreviousNextView: UIView { @objc open class IQPreviousNextView: UIView {
} }

View File

@ -1,7 +1,7 @@
// //
// IQTitleBarButtonItem.swift // IQTitleBarButtonItem.swift
// https://github.com/hackiftekhar/IQKeyboardManager // https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi. // Copyright (c) 2013-20 Iftekhar Qurashi.
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -24,13 +24,12 @@
import UIKit import UIKit
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@MainActor
@objc open class IQTitleBarButtonItem: IQBarButtonItem { @objc open class IQTitleBarButtonItem: IQBarButtonItem {
@objc open var titleFont: UIFont? { @objc open var titleFont: UIFont? {
didSet { didSet {
if let unwrappedFont: UIFont = titleFont { if let unwrappedFont = titleFont {
titleButton?.titleLabel?.font = unwrappedFont titleButton?.titleLabel?.font = unwrappedFont
} else { } else {
titleButton?.titleLabel?.font = UIFont.systemFont(ofSize: 13) titleButton?.titleLabel?.font = UIFont.systemFont(ofSize: 13)
@ -51,7 +50,7 @@ import UIKit
didSet { didSet {
if let color: UIColor = titleColor { if let color = titleColor {
titleButton?.setTitleColor(color, for: .disabled) titleButton?.setTitleColor(color, for: .disabled)
} else { } else {
titleButton?.setTitleColor(UIColor.lightGray, for: .disabled) titleButton?.setTitleColor(UIColor.lightGray, for: .disabled)
@ -66,7 +65,7 @@ import UIKit
didSet { didSet {
if let color: UIColor = selectableTitleColor { if let color = selectableTitleColor {
titleButton?.setTitleColor(color, for: .normal) titleButton?.setTitleColor(color, for: .normal)
} else { } else {
#if swift(>=5.1) #if swift(>=5.1)
@ -93,7 +92,6 @@ import UIKit
_titleView?.backgroundColor = UIColor.clear _titleView?.backgroundColor = UIColor.clear
titleButton = UIButton(type: .system) titleButton = UIButton(type: .system)
titleButton?.accessibilityTraits = .staticText
titleButton?.isEnabled = false titleButton?.isEnabled = false
titleButton?.titleLabel?.numberOfLines = 3 titleButton?.titleLabel?.numberOfLines = 3
titleButton?.setTitleColor(UIColor.lightGray, for: .disabled) titleButton?.setTitleColor(UIColor.lightGray, for: .disabled)
@ -109,37 +107,25 @@ import UIKit
titleButton?.titleLabel?.font = self.titleFont titleButton?.titleLabel?.font = self.titleFont
_titleView?.addSubview(titleButton!) _titleView?.addSubview(titleButton!)
let lowPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultLow.rawValue-1) let layoutDefaultLowPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultLow.rawValue-1)
let highPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultHigh.rawValue-1) let layoutDefaultHighPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultHigh.rawValue-1)
_titleView?.translatesAutoresizingMaskIntoConstraints = false _titleView?.translatesAutoresizingMaskIntoConstraints = false
_titleView?.setContentHuggingPriority(lowPriority, for: .vertical) _titleView?.setContentHuggingPriority(layoutDefaultLowPriority, for: .vertical)
_titleView?.setContentHuggingPriority(lowPriority, for: .horizontal) _titleView?.setContentHuggingPriority(layoutDefaultLowPriority, for: .horizontal)
_titleView?.setContentCompressionResistancePriority(highPriority, for: .vertical) _titleView?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .vertical)
_titleView?.setContentCompressionResistancePriority(highPriority, for: .horizontal) _titleView?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .horizontal)
titleButton?.translatesAutoresizingMaskIntoConstraints = false titleButton?.translatesAutoresizingMaskIntoConstraints = false
titleButton?.setContentHuggingPriority(lowPriority, for: .vertical) titleButton?.setContentHuggingPriority(layoutDefaultLowPriority, for: .vertical)
titleButton?.setContentHuggingPriority(lowPriority, for: .horizontal) titleButton?.setContentHuggingPriority(layoutDefaultLowPriority, for: .horizontal)
titleButton?.setContentCompressionResistancePriority(highPriority, for: .vertical) titleButton?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .vertical)
titleButton?.setContentCompressionResistancePriority(highPriority, for: .horizontal) titleButton?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .horizontal)
let top: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .top, let top = NSLayoutConstraint.init(item: titleButton!, attribute: .top, relatedBy: .equal, toItem: _titleView, attribute: .top, multiplier: 1, constant: 0)
relatedBy: .equal, let bottom = NSLayoutConstraint.init(item: titleButton!, attribute: .bottom, relatedBy: .equal, toItem: _titleView, attribute: .bottom, multiplier: 1, constant: 0)
toItem: _titleView, attribute: .top, let leading = NSLayoutConstraint.init(item: titleButton!, attribute: .leading, relatedBy: .equal, toItem: _titleView, attribute: .leading, multiplier: 1, constant: 0)
multiplier: 1, constant: 0) let trailing = NSLayoutConstraint.init(item: titleButton!, attribute: .trailing, relatedBy: .equal, toItem: _titleView, attribute: .trailing, multiplier: 1, constant: 0)
let bottom: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .bottom,
relatedBy: .equal,
toItem: _titleView, attribute: .bottom,
multiplier: 1, constant: 0)
let leading: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .leading,
relatedBy: .equal,
toItem: _titleView, attribute: .leading,
multiplier: 1, constant: 0)
let trailing: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .trailing,
relatedBy: .equal,
toItem: _titleView, attribute: .trailing,
multiplier: 1, constant: 0)
_titleView?.addConstraints([top, bottom, leading, trailing]) _titleView?.addConstraints([top, bottom, leading, trailing])

View File

@ -1,7 +1,7 @@
// //
// IQToolbar.swift // IQToolbar.swift
// https://github.com/hackiftekhar/IQKeyboardManager // https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi. // Copyright (c) 2013-20 Iftekhar Qurashi.
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -25,7 +25,6 @@ import UIKit
/** @abstract IQToolbar for IQKeyboardManager. */ /** @abstract IQToolbar for IQKeyboardManager. */
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@MainActor
@objc open class IQToolbar: UIToolbar, UIInputViewAudioFeedback { @objc open class IQToolbar: UIToolbar, UIInputViewAudioFeedback {
override init(frame: CGRect) { override init(frame: CGRect) {
@ -60,16 +59,6 @@ import UIKit
self.backgroundColor = nil self.backgroundColor = nil
} }
/**
Additional bar buttons to show at the leading side.
*/
open var additionalLeadingItems: [UIBarButtonItem] = []
/**
Additional bar buttons to show at the trailing side.
*/
open var additionalTrailingItems: [UIBarButtonItem] = []
/** /**
Previous bar button of toolbar. Previous bar button of toolbar.
*/ */
@ -112,7 +101,6 @@ import UIKit
get { get {
if privateTitleBarButton == nil { if privateTitleBarButton == nil {
privateTitleBarButton = IQTitleBarButtonItem(title: nil) privateTitleBarButton = IQTitleBarButtonItem(title: nil)
privateTitleBarButton?.accessibilityTraits = .staticText
privateTitleBarButton?.accessibilityLabel = "Title" privateTitleBarButton?.accessibilityLabel = "Title"
privateTitleBarButton?.accessibilityIdentifier = privateTitleBarButton?.accessibilityLabel privateTitleBarButton?.accessibilityIdentifier = privateTitleBarButton?.accessibilityLabel
} }
@ -150,8 +138,8 @@ import UIKit
if privateFixedSpaceBarButton == nil { if privateFixedSpaceBarButton == nil {
privateFixedSpaceBarButton = IQBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) privateFixedSpaceBarButton = IQBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
} }
privateFixedSpaceBarButton?.isSystemItem = true privateFixedSpaceBarButton!.isSystemItem = true
privateFixedSpaceBarButton?.width = 6 privateFixedSpaceBarButton!.width = 6
return privateFixedSpaceBarButton! return privateFixedSpaceBarButton!
} }
@ -162,7 +150,7 @@ import UIKit
} }
@objc override open func sizeThatFits(_ size: CGSize) -> CGSize { @objc override open func sizeThatFits(_ size: CGSize) -> CGSize {
var sizeThatFit: CGSize = super.sizeThatFits(size) var sizeThatFit = super.sizeThatFits(size)
sizeThatFit.height = 44 sizeThatFit.height = 44
return sizeThatFit return sizeThatFit
} }
@ -170,7 +158,7 @@ import UIKit
@objc override open var tintColor: UIColor! { @objc override open var tintColor: UIColor! {
didSet { didSet {
if let unwrappedItems: [UIBarButtonItem] = items { if let unwrappedItems = items {
for item in unwrappedItems { for item in unwrappedItems {
item.tintColor = tintColor item.tintColor = tintColor
} }

View File

@ -1,7 +1,7 @@
// //
// IQUIView+IQKeyboardToolbar.swift // IQUIView+IQKeyboardToolbar.swift
// https://github.com/hackiftekhar/IQKeyboardManager // https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi. // Copyright (c) 2013-20 Iftekhar Qurashi.
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -23,38 +23,130 @@
import UIKit import UIKit
/**
IQBarButtonItemConfiguration for creating toolbar with bar button items
*/
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@MainActor @objc public final class IQBarButtonItemConfiguration: NSObject {
private struct AssociatedKeys {
static var toolbar: Int = 0 @objc public init(barButtonSystemItem: UIBarButtonItem.SystemItem, action: Selector) {
static var hidePlaceholder: Int = 0 self.barButtonSystemItem = barButtonSystemItem
static var placeholder: Int = 0 self.image = nil
self.title = nil
self.action = action
super.init()
}
@objc public init(image: UIImage, action: Selector) {
self.barButtonSystemItem = nil
self.image = image
self.title = nil
self.action = action
super.init()
}
@objc public init(title: String, action: Selector) {
self.barButtonSystemItem = nil
self.image = nil
self.title = title
self.action = action
super.init()
}
public let barButtonSystemItem: UIBarButtonItem.SystemItem? // System Item to be used to instantiate bar button.
@objc public let image: UIImage? // Image to show on bar button item if it's not a system item.
@objc public let title: String? // Title to show on bar button item if it's not a system item.
@objc public let action: Selector? // action for bar button item. Usually 'doneAction:(IQBarButtonItem*)item'.
} }
/**
UIImage category methods to get next/prev images
*/
@available(iOSApplicationExtension, unavailable) @available(iOSApplicationExtension, unavailable)
@MainActor @objc public extension UIImage {
public extension IQKeyboardManagerWrapper where Base: UIView {
static func keyboardPreviousImage() -> UIImage? {
struct Static {
static var keyboardUpImage: UIImage?
}
if Static.keyboardUpImage == nil {
// swiftlint:disable line_length
let base64Data = "iVBORw0KGgoAAAANSUhEUgAAAD8AAAAkCAYAAAA+TuKHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAGmklEQVRoBd1ZWWwbRRie2bVz27s2adPGxzqxqAQCIRA3CDVJGxpKaEtRoSAVISQQggdeQIIHeIAHkOCBFyQeKlARhaYHvUJa0ksVoIgKUKFqKWqdeG2nR1Lsdeo0h73D54iku7NO6ySOk3alyPN//+zM/81/7MyEkDl66j2eJXWK8vocTT82rTgXk/t8vqBNEI9QSp9zOeVkPJnomgs7ik5eUZQ6OxGOEEq9WcKUksdlWbqU0LRfi70ARSXv8Xi8dkE8CsJ+I1FK6BNYgCgW4A8jPtvtopFHqNeWCLbDIF6fkxQjK91O1z9IgRM59bMAFoV8YEFgka1EyBJfMhkH5L9ACFstS9IpRMDJyfoVEp918sGamoVCme0QyN3GG87wAKcTOBYA4hrJKf+VSCb+nsBnqYHVnr2ntra2mpWWH0BVu52fhRH2XSZDmsA/xensokC21Pv9T3J4wcWrq17gob1er7tEhMcJuYsfGoS3hdTweuBpxaM0iCJph8fLuX7DJMPWnI2GOzi8YOKseD4gB+RSQezMRRx5vRPEn88Sz7IIx8KHgT3FCBniWJUyke6o8/uXc3jBxIKTd7vdTsFJfkSo38NbCY/vPRsOPwt81KgLqeoBXc+sBjZsxLF4ZfgM7goqSqMRL1S7oOSrq6sdLodjH0rYfbyByPEOePwZ4CO8Liv3RCL70Wctr8+mA2NkT53P91iu92aCFYx8TU1NpbOi8gfs2R7iDYLxnXqYPg3c5Fm+Xygcbs/omXXATZGBBagQqNAe9Psf4d+ZiVwQ8qjqFVVl5dmi9ShvDEL90IieXtVDevic5ruOyYiAXYiA9YSxsZow0YnSKkKFjoAn8OAENsPGjKs9qnp5iSDuBXFLXsLjR4fSIy29vb2DU7UThW4d8n0zxjXtRVAYNaJnlocikWNTHZPvP1PPl2LLujM3cfbzwJXUyukQzxrZraptRCcbEDm60Wh4S0IE7McByVJQjf3yac+EfEm9ouxAcWu2TsS6koOplr6+vstWXf5IKBrejBR4ybIAlLpE1JE6j8eyh8h/dEKmS95e7w9sy57G+MkQ6sdYMrmiv79/gNdNR0YEbGKUvIIFQMRffRBtbkG0HQj6fHdcRafWmg55Gzy+BR5vtUzF2O96kjSH4nHNopsB0B0Ob6SEvcYvAPYS1UwQDyqLFcu5IZ/pTMUkjxfEoD/wLVY9+z02PXDL8RE9s0y9qMZNigIJcU37TZblfj7aUAMqURLXuqqq9sQHBi5NZbqpkBfh8a9BPLtDMz3wyImh9GhTLBab0uSmQfIQcNQ95pJkDVG3wtgdC1KFA+HaSodjdzKZ/Neou1Y7X/JC0K98BeIvWAdjp+jwUKN6/nyfVVd4JK4lunDrkwJhc6Gl1GGjwhqnLO3UNC2Rz8z5kKfw+EYQf5EfEKF+Wh+kDd0XYxd43WzKiIBfEAEjiIAm0zyUSFiU1XJF+feJy5evW3euR57C41+A+MumSbICY2dGmd6gnlPPWXRFABABP7llCXsA2mCcDjVAJoK4qryycsfAwEDSqOPb1yQPj38O4q/yL4F4aCiTXhqNRmMWXREBFMGjslOywUbToQeyyy4IrVVO53bUgEk/uZOSr/MHPsOd0hs8F4R6mI2ONKi9vRFeNxdyIqkddknOMhA2nyuy+wAqtEol8rbEYCLnZisneXj8UxB/00KGkUiGsqU90WiPRTeHACLgoNsp4eBDHzaagRS4RbCzle6ysq3xVIq/LiMW8ti5fYRVfMs4yFibsdgI05eqqhqy6OYBEE9qnSiCLhRB7tRHFzDR1oIasBU1wHTAMpHHjcmHIP4OzwXf8XMkk24IR6NneN18klEE97mc0gJwuN9oF+SFNlF8vNJR1YYacGVcN0Eet6XvY6Pw3rhi/Bc5fiEzShp7eiOnx7H5/IsI6EAELEIE3Gu0EymwyCbQZocktWEfMHa3MEa+zqe8KwjCB8bO/7f70kxvVGPqyRy6eQshAtpdsuTDN/9us5F0MQ4zTS5BaIsPDQ3jO+5/G+fjj82dIDF2CZeKjd3R6J8W3Y0BYFca+JJQssFqLuvSUqlmESHSiZywGzsgx+OZNFnWE4scN+I3WJshAnYjAm5FBNxptp16y+y2hICLEtOVMXJcI0xvDveGi/ofU7NxBZN0XIpuIIy0mUZkZNNZVf1kDAt6lZagEhjGnxbweh8wdbw5hOwdxHbwY/j9BpTM9xi4MGzFvZhpk3Bz8J5gkb19ym7cJr5w/wEmUjzJqoNVhwAAAABJRU5ErkJggg=="
// swiftlint:enable line_length
if let data = Data(base64Encoded: base64Data, options: .ignoreUnknownCharacters) {
Static.keyboardUpImage = UIImage(data: data, scale: 3)
}
// Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
Static.keyboardUpImage = Static.keyboardUpImage?.imageFlippedForRightToLeftLayoutDirection()
}
return Static.keyboardUpImage
}
static func keyboardNextImage() -> UIImage? {
struct Static {
static var keyboardDownImage: UIImage?
}
if Static.keyboardDownImage == nil {
// swiftlint:disable line_length
let base64Data = "iVBORw0KGgoAAAANSUhEUgAAAD8AAAAkCAYAAAA+TuKHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAGp0lEQVRoBd1ZCWhcRRiemff25WrydmOtuXbfZlMo4lEpKkppm6TpZUovC4UqKlQoUhURqQcUBcWDIkhVUCuI9SpJa+2h0VZjUawUEUUUirLNXqmxSnc32WaT7O4bv0nd5R1bc+2maR8s7z9m5v+/+f/5Z94sIf89jW73Yp/bfUuWvwLfDp/H8zhwObLYmCCaPJ6FjLJPCWNHNU1bkFVeQW/Zp2l7KWUvNmlaB3DJAhvz1ntvI5R1EUpnUUKdEifHGuvr519BwKUmj/cDYNtwARNd5/NoH4GWKIhzlFKXCSzn/xCut/jD4V9N8suPYYj4ewC+2e46f55Rwp/geExKSmdzJn2l1WrXmuSXF8MQ8XfyAeeEn9KTyV3MHwq9RTh50IqLEjJHUkh3Y13dPKvuMuApIr6bUHKP1VeE+Y8MIa09Z8/+JQlltD/+Q7VaFcW6X2VsjFmbRRnbUFFZeai/v/+cUTeDaYqIv4GlfL/NR879I3qmORwOnxG6UfCCiMbjJ51VagKdlgs+91BaKVO6oVJVD8bj8WhOPkMJn1t7jTL6gNU9pHpgKJ1q7u3tjWR1OfBCEOuPf+9Sq4YwAW3ZBqNvSqsYpeuc5WUHYolE3KSbQYzP430FwB+yuoSCFtKHaXP4z3DIqDOBFwpkwHfVThXLgrYaG6IGOAmT1pZVVHw8MDDQb9TNBLrJre0E8EdtvnAeSRPeHOwN9lh1NvCiASbgG5fqRLDJEmMHsSU6GFuDGrAfNWDAqLuUNE5uL6A2bbf5wPkZrmdaAuGw36aDIC940TAajx1HBijIgEWmjpRWS4ytrnKq+1EDEibdJWAa3dqzjLGnrKaxxvt4OtXS09v7u1WX5S8KXjRABnQ7VbUCEV+Y7SDeWAJX4dfuLCnZFzt//rxRN500jqo74NvTVptY42fTnLcGI5FTVp2R/1/womEsHj/mwgxg27vd2BH8bCrLq0rKyjoTicSgUTcdNIrbkwD+nM2WOJ3qmaVI9d9sOotgTPCiPTLgi+oqdTbOAbea+lM6xyHLK8pnVXSiCCZNuiIyjZr2GArSS1YTOKie45n0UqT6L1ZdPn5c4EVHHIS6sA3WYLZvNg6E9L9GZmwZzgEdqAFDRl0xaET8EQB/2To21ngsQ0kbIv6zVXcxftzgxQDIgM+qVbUeGbDAPCCtxbfxUhdjHdGhoWGzrnAcIr4NwHflGbGf6PqyQCj0Yx7dRUUTAi9GwQQccapOL7bBm4yjIiPqSElpC5VYRzKZLPgE4M5hK0rt67CDZDM9A+k0XxmIhE6apONgJgxejBmLxw65VHUu/LjRaANeNZQpyhJZUToGBwdHjLqp0Ij4FgB/0wocaxw7DV8F4CcmM/6kwMMQRwYcrFad87DvXW8yTKlbkZVFSmlJB3bBlEk3CQYRvxfA3wbw0Vun7BAAPqjrmfaecPjbrGyib2sKTbS/LG5F4NhGe0d+fDiTuSMSiUx6F8Bn6V343N6TB3gSyb/aHwx22+2OX2KazfF3y7VMnw4FcUvCP8lJcgRtVph0yEu8pTnRBAiv270JwN+1AscQw5zr66YKXLgyVfBijBQc2YQ0PCIY4wPH2yQPERNTYpSPRSPid0qUvY/+1mU5QjJ8PVL96FhjjEdfCPDCzggyAKnPP7cZpWQFlsZ+yPGdMPaDiK/F6fEjbKeypXVK5/pGfyTYZZFPmi0UeOHAcCZI1+Oa6JjVG0SwHbcrnZDn7sytbQSPiLdLTBJXy+Z2nKcR8U09odDhfP0mKyskeBIggaERPb0WGfC1zSFK1gDcXsitER1t6m3wrkTEbRmC5ZTRCd+MiB+wjTlFwVSrfV7zdXV15aWy0oWKvNjWgJMOfyiAIklwYXLhwfd4G/47OAxnTMVRAKec3u0PB8SkFfyxFpSCGMBHTkpWHPsU2bEEKe8xDUrJdfhKnItzgiiEXKvXWhijR9CuzNgOwHWc1+87HQ5+aJQXki4KeOGgOOFJDkdnqeJowSGlweg00vsGHJAa1UpnTJKIAF5u1AM4R8S3APgeo7zQdFHS3uikz+VSSWXVlwBo+hoUbUR0ITfVHQEcEd+K4rbbOE4xaJPhYhg4HY3GcYG4HFB/so5vBT6q53TbdAAXtooe+SzghoaGakWSu2FwflZmfWMffxjAX7XKi8VPG3gBoKam5uoKpeQEDjBz7YD4dpwUd9rlxZMUPe2Nrvf19f2dTKdasap7jHIsiR3TDdxsfxq5xtpazad5g02al+Na6plpND0zTHk8Hp+4iLyU3vwLp0orLWXqrZQAAAAASUVORK5CYII="
// swiftlint:enable line_length
if let data = Data(base64Encoded: base64Data, options: .ignoreUnknownCharacters) {
Static.keyboardDownImage = UIImage(data: data, scale: 3)
}
// Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
Static.keyboardDownImage = Static.keyboardDownImage?.imageFlippedForRightToLeftLayoutDirection()
}
return Static.keyboardDownImage
}
}
/**
UIView category methods to add IQToolbar on UIKeyboard.
*/
@available(iOSApplicationExtension, unavailable)
@objc public extension UIView {
private struct AssociatedKeys {
static var keyboardToolbar: Int = 0
static var shouldHideToolbarPlaceholder: Int = 0
static var toolbarPlaceholder: Int = 0
}
// MARK: Toolbar // MARK: Toolbar
/** /**
IQToolbar references for better customization control. IQToolbar references for better customization control.
*/ */
var toolbar: IQToolbar { var keyboardToolbar: IQToolbar {
var toolbar: IQToolbar? = base.inputAccessoryView as? IQToolbar var toolbar = inputAccessoryView as? IQToolbar
if toolbar == nil { if toolbar == nil {
toolbar = objc_getAssociatedObject(base, &AssociatedKeys.toolbar) as? IQToolbar toolbar = objc_getAssociatedObject(self, &AssociatedKeys.keyboardToolbar) as? IQToolbar
} }
if let unwrappedToolbar: IQToolbar = toolbar { if let unwrappedToolbar = toolbar {
return unwrappedToolbar return unwrappedToolbar
} else { } else {
let width: CGFloat var width: CGFloat = 0
if #available(iOS 13.0, *) { if #available(iOS 13.0, *) {
width = base.window?.windowScene?.screen.bounds.width ?? 0 width = window?.windowScene?.screen.bounds.width ?? .zero
} else { } else {
width = UIScreen.main.bounds.width width = UIScreen.main.bounds.width
} }
@ -62,7 +154,7 @@ public extension IQKeyboardManagerWrapper where Base: UIView {
let frame = CGRect(origin: .zero, size: .init(width: width, height: 44)) let frame = CGRect(origin: .zero, size: .init(width: width, height: 44))
let newToolbar = IQToolbar(frame: frame) let newToolbar = IQToolbar(frame: frame)
objc_setAssociatedObject(base, &AssociatedKeys.toolbar, newToolbar, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) objc_setAssociatedObject(self, &AssociatedKeys.keyboardToolbar, newToolbar, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return newToolbar return newToolbar
} }
@ -71,43 +163,41 @@ public extension IQKeyboardManagerWrapper where Base: UIView {
// MARK: Toolbar title // MARK: Toolbar title
/** /**
If `hideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO. If `shouldHideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO.
*/ */
var hidePlaceholder: Bool { var shouldHideToolbarPlaceholder: Bool {
get { get {
return objc_getAssociatedObject(base, &AssociatedKeys.hidePlaceholder) as? Bool ?? false return objc_getAssociatedObject(self, &AssociatedKeys.shouldHideToolbarPlaceholder) as? Bool ?? false
} }
set(newValue) { set(newValue) {
objc_setAssociatedObject(base, &AssociatedKeys.hidePlaceholder, objc_setAssociatedObject(self, &AssociatedKeys.shouldHideToolbarPlaceholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder
toolbar.titleBarButton.title = drawingPlaceholder
} }
} }
/** /**
`toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar. `toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar.
*/ */
var placeholder: String? { var toolbarPlaceholder: String? {
get { get {
return objc_getAssociatedObject(base, &AssociatedKeys.placeholder) as? String return objc_getAssociatedObject(self, &AssociatedKeys.toolbarPlaceholder) as? String
} }
set(newValue) { set(newValue) {
objc_setAssociatedObject(base, &AssociatedKeys.placeholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) objc_setAssociatedObject(self, &AssociatedKeys.toolbarPlaceholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
toolbar.titleBarButton.title = drawingPlaceholder self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder
} }
} }
/** /**
`drawingToolbarPlaceholder` will be actual text used to draw on toolbar. `drawingToolbarPlaceholder` will be actual text used to draw on toolbar. This would either `placeholder` or `toolbarPlaceholder`.
This would either `placeholder` or `toolbarPlaceholder`.
*/ */
var drawingPlaceholder: String? { var drawingToolbarPlaceholder: String? {
if hidePlaceholder { if self.shouldHideToolbarPlaceholder {
return nil return nil
} else if placeholder?.isEmpty == false { } else if self.toolbarPlaceholder?.isEmpty == false {
return placeholder return self.toolbarPlaceholder
} else if let placeholderable: IQPlaceholderable = base as? IQPlaceholderable { } else if let placeholderable: IQPlaceholderable = self as? IQPlaceholderable {
if let placeholder = placeholderable.attributedPlaceholder?.string, if let placeholder = placeholderable.attributedPlaceholder?.string,
!placeholder.isEmpty { !placeholder.isEmpty {
@ -122,81 +212,160 @@ public extension IQKeyboardManagerWrapper where Base: UIView {
} }
} }
// MARK: Private helper
private static func flexibleBarButtonItem () -> IQBarButtonItem {
struct Static {
static let nilButton = IQBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
}
Static.nilButton.isSystemItem = true
return Static.nilButton
}
// MARK: Common // MARK: Common
// swiftlint:disable cyclomatic_complexity
// swiftlint:disable function_body_length // swiftlint:disable function_body_length
func addToolbar(target: AnyObject?, func addKeyboardToolbarWithTarget(target: AnyObject?,
previousConfiguration: IQBarButtonItemConfiguration? = nil, titleText: String?,
nextConfiguration: IQBarButtonItemConfiguration? = nil, titleAccessibilityLabel: String? = nil,
rightConfiguration: IQBarButtonItemConfiguration? = nil, rightBarButtonConfiguration: IQBarButtonItemConfiguration?,
title: String?, previousBarButtonConfiguration: IQBarButtonItemConfiguration? = nil,
titleAccessibilityLabel: String? = nil) { nextBarButtonConfiguration: IQBarButtonItemConfiguration? = nil) {
// If can't set InputAccessoryView. Then return // If can't set InputAccessoryView. Then return
if base.responds(to: #selector(setter: UITextField.inputAccessoryView)) { if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {
// Creating a toolBar for phoneNumber keyboard // Creating a toolBar for phoneNumber keyboard
let toolbar: IQToolbar = toolbar let toolbar = self.keyboardToolbar
var items: [UIBarButtonItem] = [] var items: [IQBarButtonItem] = []
if let previousConfiguration: IQBarButtonItemConfiguration = previousConfiguration { if let prevConfig = previousBarButtonConfiguration {
let prev: IQBarButtonItem = previousConfiguration.apply(on: toolbar.previousBarButton, target: target) var prev = toolbar.previousBarButton
if prevConfig.barButtonSystemItem == nil, !prev.isSystemItem {
prev.title = prevConfig.title
prev.accessibilityLabel = prevConfig.accessibilityLabel
prev.accessibilityIdentifier = prev.accessibilityLabel
prev.image = prevConfig.image
prev.target = target
prev.action = prevConfig.action
} else {
if let systemItem = prevConfig.barButtonSystemItem {
prev = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: prevConfig.action)
prev.isSystemItem = true
} else if let image = prevConfig.image {
prev = IQBarButtonItem(image: image, style: .plain, target: target, action: prevConfig.action)
} else {
prev = IQBarButtonItem(title: prevConfig.title, style: .plain, target: target, action: prevConfig.action)
}
prev.invocation = toolbar.previousBarButton.invocation
prev.accessibilityLabel = prevConfig.accessibilityLabel
prev.accessibilityIdentifier = prev.accessibilityLabel
prev.isEnabled = toolbar.previousBarButton.isEnabled
prev.tag = toolbar.previousBarButton.tag
toolbar.previousBarButton = prev toolbar.previousBarButton = prev
}
items.append(prev) items.append(prev)
} }
if previousConfiguration != nil, nextConfiguration != nil { if previousBarButtonConfiguration != nil, nextBarButtonConfiguration != nil {
items.append(toolbar.fixedSpaceBarButton) items.append(toolbar.fixedSpaceBarButton)
} }
if let nextConfiguration: IQBarButtonItemConfiguration = nextConfiguration { if let nextConfig = nextBarButtonConfiguration {
let next: IQBarButtonItem = nextConfiguration.apply(on: toolbar.nextBarButton, target: target) var next = toolbar.nextBarButton
toolbar.nextBarButton = next
items.append(next) if nextConfig.barButtonSystemItem == nil, !next.isSystemItem {
next.title = nextConfig.title
next.accessibilityLabel = nextConfig.accessibilityLabel
next.accessibilityIdentifier = next.accessibilityLabel
next.image = nextConfig.image
next.target = target
next.action = nextConfig.action
} else {
if let systemItem = nextConfig.barButtonSystemItem {
next = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: nextConfig.action)
next.isSystemItem = true
} else if let image = nextConfig.image {
next = IQBarButtonItem(image: image, style: .plain, target: target, action: nextConfig.action)
} else {
next = IQBarButtonItem(title: nextConfig.title, style: .plain, target: target, action: nextConfig.action)
} }
if !toolbar.additionalLeadingItems.isEmpty { next.invocation = toolbar.nextBarButton.invocation
items.append(contentsOf: toolbar.additionalLeadingItems) next.accessibilityLabel = nextConfig.accessibilityLabel
next.accessibilityIdentifier = next.accessibilityLabel
next.isEnabled = toolbar.nextBarButton.isEnabled
next.tag = toolbar.nextBarButton.tag
toolbar.nextBarButton = next
}
items.append(next)
} }
// Title bar button item // Title bar button item
do { do {
// Flexible space // Flexible space
items.append(IQBarButtonItem.flexibleBarButtonItem) items.append(UIView.flexibleBarButtonItem())
// Title button // Title button
toolbar.titleBarButton.title = title toolbar.titleBarButton.title = titleText
toolbar.titleBarButton.accessibilityLabel = titleAccessibilityLabel toolbar.titleBarButton.accessibilityLabel = titleAccessibilityLabel
toolbar.titleBarButton.accessibilityIdentifier = titleAccessibilityLabel toolbar.titleBarButton.accessibilityIdentifier = titleAccessibilityLabel
toolbar.titleBarButton.customView?.frame = .zero toolbar.titleBarButton.customView?.frame = CGRect.zero
items.append(toolbar.titleBarButton) items.append(toolbar.titleBarButton)
// Flexible space // Flexible space
items.append(IQBarButtonItem.flexibleBarButtonItem) items.append(UIView.flexibleBarButtonItem())
} }
if !toolbar.additionalTrailingItems.isEmpty { if let rightConfig = rightBarButtonConfiguration {
items.append(contentsOf: toolbar.additionalTrailingItems)
var done = toolbar.doneBarButton
if rightConfig.barButtonSystemItem == nil, !done.isSystemItem {
done.title = rightConfig.title
done.accessibilityLabel = rightConfig.accessibilityLabel
done.accessibilityIdentifier = done.accessibilityLabel
done.image = rightConfig.image
done.target = target
done.action = rightConfig.action
} else {
if let systemItem = rightConfig.barButtonSystemItem {
done = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: rightConfig.action)
done.isSystemItem = true
} else if let image = rightConfig.image {
done = IQBarButtonItem(image: image, style: .plain, target: target, action: rightConfig.action)
} else {
done = IQBarButtonItem(title: rightConfig.title, style: .plain, target: target, action: rightConfig.action)
} }
if let rightConfiguration: IQBarButtonItemConfiguration = rightConfiguration { done.invocation = toolbar.doneBarButton.invocation
done.accessibilityLabel = rightConfig.accessibilityLabel
let done: IQBarButtonItem = rightConfiguration.apply(on: toolbar.doneBarButton, target: target) done.accessibilityIdentifier = done.accessibilityLabel
done.isEnabled = toolbar.doneBarButton.isEnabled
done.tag = toolbar.doneBarButton.tag
toolbar.doneBarButton = done toolbar.doneBarButton = done
}
items.append(done) items.append(done)
} }
// Adding button to toolBar. // Adding button to toolBar.
toolbar.items = items toolbar.items = items
if let textInput: UITextInput = base as? UITextInput { if let textInput = self as? UITextInput {
switch textInput.keyboardAppearance { switch textInput.keyboardAppearance {
case .dark?: case .dark?:
toolbar.barStyle = .black toolbar.barStyle = .black
@ -206,120 +375,139 @@ public extension IQKeyboardManagerWrapper where Base: UIView {
} }
// Setting toolbar to keyboard. // Setting toolbar to keyboard.
let reloadInputViews: Bool = base.inputAccessoryView != toolbar let shouldReloadInputViews: Bool = self.inputAccessoryView == nil
if reloadInputViews { if let textField = self as? UITextField {
if let textField: UITextField = base as? UITextField {
textField.inputAccessoryView = toolbar textField.inputAccessoryView = toolbar
} else if let textView: UITextView = base as? UITextView { } else if let textView = self as? UITextView {
textView.inputAccessoryView = toolbar textView.inputAccessoryView = toolbar
} }
base.reloadInputViews() if shouldReloadInputViews {
self.reloadInputViews()
} }
} }
} }
// swiftlint:enable function_body_length // swiftlint:enable function_body_length
// swiftlint:enable cyclomatic_complexity
// MARK: Right // MARK: Right
func addDone(target: AnyObject?,
action: Selector,
showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
let title: String? = showPlaceholder ? drawingPlaceholder : nil func addDoneOnKeyboardWithTarget(_ target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
addDone(target: target, action: action, addDoneOnKeyboardWithTarget(target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
} }
func addDone(target: AnyObject?, func addDoneOnKeyboardWithTarget(_ target: AnyObject?, action: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
action: Selector,
title: String?, titleAccessibilityLabel: String? = nil) {
let rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: action) let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: action)
addToolbar(target: target, rightConfiguration: rightConfiguration, addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration)
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
} }
func addRightButton(target: AnyObject?, func addRightButtonOnKeyboardWithImage(_ image: UIImage, target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
configuration: IQBarButtonItemConfiguration,
showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) { addRightButtonOnKeyboardWithImage(image, target: target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
let title: String? = showPlaceholder ? drawingPlaceholder : nil
addRightButton(target: target, configuration: configuration, title: title,
titleAccessibilityLabel: titleAccessibilityLabel)
} }
func addRightButton(target: AnyObject?, func addRightButtonOnKeyboardWithImage(_ image: UIImage, target: AnyObject?, action: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
configuration: IQBarButtonItemConfiguration,
title: String?, titleAccessibilityLabel: String? = nil) { let rightConfiguration = IQBarButtonItemConfiguration(image: image, action: action)
addToolbar(target: target, rightConfiguration: configuration, title: title,
titleAccessibilityLabel: titleAccessibilityLabel) addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration)
}
func addRightButtonOnKeyboardWithText(_ text: String, target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
addRightButtonOnKeyboardWithText(text, target: target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
}
func addRightButtonOnKeyboardWithText(_ text: String, target: AnyObject?, action: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
let rightConfiguration = IQBarButtonItemConfiguration(title: text, action: action)
addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration)
} }
// MARK: Right/Left // MARK: Right/Left
func addRightLeft(target: AnyObject?,
rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration, func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?, cancelAction: Selector, doneAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
let title: String? = showPlaceholder ? drawingPlaceholder : nil addCancelDoneOnKeyboardWithTarget(target, cancelAction: cancelAction, doneAction: doneAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
addRightLeft(target: target,
rightConfiguration: rightConfiguration, leftConfiguration: leftConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
} }
func addRightLeft(target: AnyObject?, func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonTitle: String, rightButtonTitle: String, leftButtonAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration,
title: String?, titleAccessibilityLabel: String? = nil) { addRightLeftOnKeyboardWithTarget(target, leftButtonTitle: leftButtonTitle, rightButtonTitle: rightButtonTitle, leftButtonAction: leftButtonAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
addToolbar(target: target, }
previousConfiguration: leftConfiguration, rightConfiguration: rightConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel) func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonImage: UIImage, rightButtonImage: UIImage, leftButtonAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
addRightLeftOnKeyboardWithTarget(target, leftButtonImage: leftButtonImage, rightButtonImage: rightButtonImage, leftButtonAction: leftButtonAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
}
func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?, cancelAction: Selector, doneAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
let leftConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .cancel, action: cancelAction)
let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: doneAction)
addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: leftConfiguration)
}
func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonTitle: String, rightButtonTitle: String, leftButtonAction: Selector, rightButtonAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
let leftConfiguration = IQBarButtonItemConfiguration(title: leftButtonTitle, action: leftButtonAction)
let rightConfiguration = IQBarButtonItemConfiguration(title: rightButtonTitle, action: rightButtonAction)
addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: leftConfiguration)
}
func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonImage: UIImage, rightButtonImage: UIImage, leftButtonAction: Selector, rightButtonAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
let leftConfiguration = IQBarButtonItemConfiguration(image: leftButtonImage, action: leftButtonAction)
let rightConfiguration = IQBarButtonItemConfiguration(image: rightButtonImage, action: rightButtonAction)
addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: leftConfiguration)
} }
// MARK: Previous/Next/Right // MARK: Previous/Next/Right
func addPreviousNextRight(target: AnyObject?, func addPreviousNextDoneOnKeyboardWithTarget (_ target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
previousConfiguration: IQBarButtonItemConfiguration? = nil,
nextConfiguration: IQBarButtonItemConfiguration? = nil,
rightConfiguration: IQBarButtonItemConfiguration?,
showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
let title: String? = showPlaceholder ? drawingPlaceholder : nil addPreviousNextDoneOnKeyboardWithTarget(target, previousAction: previousAction, nextAction: nextAction, doneAction: doneAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
addPreviousNextRight(target: target,
previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
rightConfiguration: rightConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
} }
func addPreviousNextRight(target: AnyObject?, func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonImage: UIImage, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
previousConfiguration: IQBarButtonItemConfiguration? = nil,
nextConfiguration: IQBarButtonItemConfiguration? = nil,
rightConfiguration: IQBarButtonItemConfiguration?,
title: String?, titleAccessibilityLabel: String? = nil) {
addToolbar(target: target, addPreviousNextRightOnKeyboardWithTarget(target, rightButtonImage: rightButtonImage, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
rightConfiguration: rightConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
} }
func addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonTitle: String, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
let title: String? = showPlaceholder ? drawingPlaceholder : nil addPreviousNextRightOnKeyboardWithTarget(target, rightButtonTitle: rightButtonTitle, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
addPreviousNextDone(target: target, previousAction: previousAction, nextAction: nextAction,
doneAction: doneAction,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
} }
func addPreviousNextDone(target: AnyObject?, func addPreviousNextDoneOnKeyboardWithTarget (_ target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
previousAction: Selector, nextAction: Selector, doneAction: Selector,
title: String?, titleAccessibilityLabel: String? = nil) {
let previousConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage, let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: doneAction)
action: previousAction) let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage, action: nextAction) let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
let rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: doneAction)
addToolbar(target: target, previousConfiguration: previousConfiguration, addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration, }
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonImage: UIImage, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
let rightConfiguration = IQBarButtonItemConfiguration(image: rightButtonImage, action: rightButtonAction)
let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
}
func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonTitle: String, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
let rightConfiguration = IQBarButtonItemConfiguration(title: rightButtonTitle, action: rightButtonAction)
let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
} }
} }

View File

@ -3,20 +3,7 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>NSPrivacyCollectedDataTypes</key> <key>NSPrivacyCollectedDataTypes</key>
<array> <array/>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string></string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string></string>
</array>
</dict>
</array>
<key>NSPrivacyTracking</key> <key>NSPrivacyTracking</key>
<false/> <false/>
</dict> </dict>

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2013-2023 Iftekhar Qurashi Copyright (c) 2013-2017 Iftekhar Qurashi
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -61,26 +61,19 @@ https://www.youtube.com/playlist?list=PL_csAAO9PQ8aTL87XnueOXi3RpWE2m_8v
| | Language | Minimum iOS Target | Minimum Xcode Version | | | Language | Minimum iOS Target | Minimum Xcode Version |
|------------------------|----------|--------------------|-----------------------| |------------------------|----------|--------------------|-----------------------|
| IQKeyboardManager | Obj-C | iOS 11.0 | Xcode 13 | | IQKeyboardManager | Obj-C | iOS 8.0 | Xcode 9 |
| IQKeyboardManagerSwift | Swift | iOS 13.0 | Xcode 13 | | IQKeyboardManagerSwift | Swift | iOS 8.0 | Xcode 9 |
| Demo Project | | | Xcode 15 | | Demo Project | | | Xcode 11 |
#### Swift versions support #### Swift versions support
| Swift | Xcode | IQKeyboardManagerSwift | | Swift | Xcode | IQKeyboardManagerSwift |
|-------------------|-------|------------------------| |-------------------|-------|------------------------|
| 5.9, 5.8, 5.7, 5.6| 15 | >= 7.0.0 |
| 5.5, 5.4, 5.3, 5.2, 5.1, 5.0, 4.2| 11 | >= 6.5.7 |
| 5.1, 5.0, 4.2, 4.0, 3.2, 3.0| 11 | >= 6.5.0 | | 5.1, 5.0, 4.2, 4.0, 3.2, 3.0| 11 | >= 6.5.0 |
| 5.0,4.2, 4.0, 3.2, 3.0| 10.2 | >= 6.2.1 | | 5.0,4.2, 4.0, 3.2, 3.0| 10.2 | >= 6.2.1 |
| 4.2, 4.0, 3.2, 3.0| 10.0 | >= 6.0.4 | | 4.2, 4.0, 3.2, 3.0| 10.0 | >= 6.0.4 |
| 4.0, 3.2, 3.0 | 9.0 | 5.0.0 | | 4.0, 3.2, 3.0 | 9.0 | 5.0.0 |
## 7.0.0 version notes
- In this major release, a lot of variables and functions have been moved here and there. We have mentioned most of the major things in the MIGRATION GUIDE. So please take a look to make changes in your project when upgrading to this version.
- The 7.0.0 version adopted the latest Swift Concurrency/Actor feature and only available iOS 13.0 and above.
- Internal keyboard management handling have been updated with a different and better approach than legacy versions. However when adopting 7.0.0, please verify if it is working as expected in your apps, if there are any serious problems with 7.0.0 please open an issue with all the details and switch back to legacy version temporarily.
Installation Installation
========================== ==========================
@ -92,13 +85,13 @@ Installation
it, simply add the following line to your Podfile: ([#9](https://github.com/hackiftekhar/IQKeyboardManager/issues/9)) it, simply add the following line to your Podfile: ([#9](https://github.com/hackiftekhar/IQKeyboardManager/issues/9))
```ruby ```ruby
pod 'IQKeyboardManager' #iOS13 and later pod 'IQKeyboardManager' #iOS8 and later
``` ```
***IQKeyboardManager (Swift):*** IQKeyboardManagerSwift is available through [CocoaPods](http://cocoapods.org). To install ***IQKeyboardManager (Swift):*** IQKeyboardManagerSwift is available through [CocoaPods](http://cocoapods.org). To install
it, simply add the following line to your Podfile: ([#236](https://github.com/hackiftekhar/IQKeyboardManager/issues/236)) it, simply add the following line to your Podfile: ([#236](https://github.com/hackiftekhar/IQKeyboardManager/issues/236))
*Swift 5.9, 5.8, 5.7, 5.6, 5.5 (Xcode 15)* *Swift 5.1, 5.0, 4.2, 4.0, 3.2, 3.0 (Xcode 11)*
```ruby ```ruby
pod 'IQKeyboardManagerSwift' pod 'IQKeyboardManagerSwift'
@ -180,7 +173,21 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
[Swift Package Manager(SPM)](https://swift.org/package-manager/) is Apple's dependency manager tool. It is now supported in Xcode 11. So it can be used in all appleOS types of projects. It can be used alongside other tools like CocoaPods and Carthage as well. [Swift Package Manager(SPM)](https://swift.org/package-manager/) is Apple's dependency manager tool. It is now supported in Xcode 11. So it can be used in all appleOS types of projects. It can be used alongside other tools like CocoaPods and Carthage as well.
To install IQKeyboardManagerSwift package via Xcode To install IQKeyboardManager package into your packages, add a reference to IQKeyboardManager and a targeting release version in the dependencies section in `Package.swift` file:
```swift
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
products: [],
dependencies: [
.package(url: "https://github.com/hackiftekhar/IQKeyboardManager.git", from: "6.5.0")
]
)
```
To install IQKeyboardManager package via Xcode
* Go to File -> Swift Packages -> Add Package Dependency... * Go to File -> Swift Packages -> Add Package Dependency...
* Then search for https://github.com/hackiftekhar/IQKeyboardManager.git * Then search for https://github.com/hackiftekhar/IQKeyboardManager.git
@ -189,7 +196,6 @@ To install IQKeyboardManagerSwift package via Xcode
Migration Guide Migration Guide
========================== ==========================
- [IQKeyboardManager 6.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/wiki/IQKeyboardManager-6.0.0-Migration-Guide) - [IQKeyboardManager 6.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/wiki/IQKeyboardManager-6.0.0-Migration-Guide)
- [IQKeyboardManager 7.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/wiki/IQKeyboardManager-7.0.0-Migration-Guide)
Other Links Other Links
========================== ==========================

View File

@ -428,7 +428,7 @@ extension JXSegmentedListContainerView: UICollectionViewDataSource, UICollection
} }
public func scrollViewDidScroll(_ scrollView: UIScrollView) { public func scrollViewDidScroll(_ scrollView: UIScrollView) {
guard scrollView.isTracking || scrollView.isDragging else { guard scrollView.isTracking || scrollView.isDragging || scrollView.isDecelerating else {
return return
} }
let percent = scrollView.contentOffset.x/scrollView.bounds.size.width let percent = scrollView.contentOffset.x/scrollView.bounds.size.width

View File

@ -99,4 +99,20 @@ open class JXSegmentedBaseCell: UICollectionViewCell, JXSegmentedViewRTLCompatib
} }
} }
} }
open override var isSelected: Bool {
didSet {
setSelectedStyle(isSelected: isSelected)
}
}
open override var isHighlighted: Bool {
didSet {
setSelectedStyle(isSelected: isHighlighted)
}
}
func setSelectedStyle(isSelected: Bool) {
}
} }

View File

@ -28,6 +28,8 @@ open class JXSegmentedBaseDataSource: JXSegmentedViewDataSource {
open var selectedAnimationDuration: TimeInterval = 0.25 open var selectedAnimationDuration: TimeInterval = 0.25
/// item /// item
open var isItemWidthZoomEnabled: Bool = false open var isItemWidthZoomEnabled: Bool = false
/// item
open var isItemWidthZoomAnimable: Bool = true
/// itemscale /// itemscale
open var itemWidthSelectedZoomScale: CGFloat = 1.5 open var itemWidthSelectedZoomScale: CGFloat = 1.5
@ -131,7 +133,11 @@ open class JXSegmentedBaseDataSource: JXSegmentedViewDataSource {
willSelectedItemModel.itemWidth = self.itemWidthWithZoom(at: willSelectedItemModel.index, model: willSelectedItemModel) willSelectedItemModel.itemWidth = self.itemWidthWithZoom(at: willSelectedItemModel.index, model: willSelectedItemModel)
segmentedView.collectionView.collectionViewLayout.invalidateLayout() segmentedView.collectionView.collectionViewLayout.invalidateLayout()
} }
if isItemWidthZoomAnimable {
animator?.start() animator?.start()
}else {
animator?.stop()
}
} }
}else { }else {
currentSelectedItemModel.itemWidthCurrentZoomScale = currentSelectedItemModel.itemWidthNormalZoomScale currentSelectedItemModel.itemWidthCurrentZoomScale = currentSelectedItemModel.itemWidthNormalZoomScale

View File

@ -10,7 +10,7 @@ import UIKit
open class JXSegmentedCollectionView: UICollectionView { open class JXSegmentedCollectionView: UICollectionView {
open var indicators = [JXSegmentedIndicatorProtocol & UIView]() { open var indicators = [JXSegmentedIndicatorProtocol]() {
willSet { willSet {
for indicator in indicators { for indicator in indicators {
indicator.removeFromSuperview() indicator.removeFromSuperview()

View File

@ -171,7 +171,7 @@ open class JXSegmentedView: UIView, JXSegmentedViewRTLCompatible {
} }
} }
/// indicatorsJXSegmentedIndicatorProtocolUIView /// indicatorsJXSegmentedIndicatorProtocolUIView
open var indicators = [JXSegmentedIndicatorProtocol & UIView]() { open var indicators = [JXSegmentedIndicatorProtocol]() {
didSet { didSet {
collectionView.indicators = indicators collectionView.indicators = indicators
} }
@ -224,6 +224,7 @@ open class JXSegmentedView: UIView, JXSegmentedViewRTLCompatible {
collectionView.showsVerticalScrollIndicator = false collectionView.showsVerticalScrollIndicator = false
collectionView.showsHorizontalScrollIndicator = false collectionView.showsHorizontalScrollIndicator = false
collectionView.scrollsToTop = false collectionView.scrollsToTop = false
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "JXSegmentedViewInnerEmptyCell")
collectionView.dataSource = self collectionView.dataSource = self
collectionView.delegate = self collectionView.delegate = self
if #available(iOS 10.0, *) { if #available(iOS 10.0, *) {
@ -686,7 +687,7 @@ extension JXSegmentedView: UICollectionViewDataSource {
cell.reloadData(itemModel: itemDataSource[indexPath.item], selectedType: .unknown) cell.reloadData(itemModel: itemDataSource[indexPath.item], selectedType: .unknown)
return cell return cell
}else { }else {
return UICollectionViewCell(frame: CGRect.zero) return collectionView.dequeueReusableCell(withReuseIdentifier: "JXSegmentedViewInnerEmptyCell", for: indexPath)
} }
} }
} }
@ -713,7 +714,11 @@ extension JXSegmentedView: UICollectionViewDelegateFlowLayout {
} }
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if indexPath.item >= 0, indexPath.item < itemDataSource.count {
return CGSize(width: itemDataSource[indexPath.item].itemWidth, height: collectionView.bounds.size.height) return CGSize(width: itemDataSource[indexPath.item].itemWidth, height: collectionView.bounds.size.height)
} else {
return .zero
}
} }
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return innerItemSpacing return innerItemSpacing

View File

@ -9,7 +9,7 @@
import Foundation import Foundation
import UIKit import UIKit
public protocol JXSegmentedIndicatorProtocol { public protocol JXSegmentedIndicatorProtocol: UIView {
/// indicatorframecellJXSegmentedTitleDataSourcedisTitleMaskEnabled使 /// indicatorframecellJXSegmentedTitleDataSourcedisTitleMaskEnabled使
/// indicatorindicatorisIndicatorConvertToItemFrameEnabledtrue /// indicatorindicatorisIndicatorConvertToItemFrameEnabledtrue
/// indicatorisIndicatorConvertToItemFrameEnabledtrueisIndicatorConvertToItemFrameEnabledtrueindicator /// indicatorisIndicatorConvertToItemFrameEnabledtrueisIndicatorConvertToItemFrameEnabledtrueindicator

View File

@ -196,4 +196,12 @@ open class JXSegmentedTitleCell: JXSegmentedBaseCell {
self?.titleLabel.textColor = itemModel.titleCurrentColor self?.titleLabel.textColor = itemModel.titleCurrentColor
} }
} }
override func setSelectedStyle(isSelected: Bool) {
if isSelected {
self.titleLabel.textColor = (self.itemModel as? JXSegmentedTitleItemModel)?.titleSelectedColor
} else {
self.titleLabel.textColor = (self.itemModel as? JXSegmentedTitleItemModel)?.titleNormalColor
}
}
} }

View File

@ -8,9 +8,11 @@
import UIKit import UIKit
open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{ open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource {
/// title /// title
open var titles = [String]() open var titles = [String]()
/// indexcell
open var configuration: JXSegmentedTitleDynamicConfiguration?
/// JXSegmentedViewUITableViewcellJXSegmentedViewreloadDatatitleUITableViewcellModeltitlesJXSegmentedView /// JXSegmentedViewUITableViewcellJXSegmentedViewreloadDatatitleUITableViewcellModeltitlesJXSegmentedView
open var widthForTitleClosure: ((String)->(CGFloat))? open var widthForTitleClosure: ((String)->(CGFloat))?
/// labelnumberOfLines /// labelnumberOfLines
@ -36,7 +38,6 @@ open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{
/// title使 /// title使
open var isTitleMaskEnabled: Bool = false open var isTitleMaskEnabled: Bool = false
open override func preferredItemCount() -> Int { open override func preferredItemCount() -> Int {
return titles.count return titles.count
} }
@ -53,13 +54,17 @@ open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{
} }
myItemModel.title = titles[index] myItemModel.title = titles[index]
myItemModel.textWidth = widthForTitle(myItemModel.title ?? "") myItemModel.textWidth = widthForTitle(myItemModel.title ?? "", index)
myItemModel.titleNumberOfLines = titleNumberOfLines myItemModel.titleNumberOfLines = innerTitleNumberOfLines(at: index)
myItemModel.isSelectedAnimable = isSelectedAnimable myItemModel.isSelectedAnimable = isSelectedAnimable
myItemModel.titleNormalColor = titleNormalColor myItemModel.titleNormalColor = innerTitleNormalColor(at: index)
myItemModel.titleSelectedColor = titleSelectedColor myItemModel.titleSelectedColor = innerTitleSelectedColor(at: index)
myItemModel.titleNormalFont = titleNormalFont myItemModel.titleNormalFont = innerTitleNormalFont(at: index)
myItemModel.titleSelectedFont = titleSelectedFont != nil ? titleSelectedFont! : titleNormalFont if let selectedFont = innerTitleSelectedFont(at: index) {
myItemModel.titleSelectedFont = selectedFont
} else {
myItemModel.titleSelectedFont = innerTitleNormalFont(at: index)
}
myItemModel.isTitleZoomEnabled = isTitleZoomEnabled myItemModel.isTitleZoomEnabled = isTitleZoomEnabled
myItemModel.isTitleStrokeWidthEnabled = isTitleStrokeWidthEnabled myItemModel.isTitleStrokeWidthEnabled = isTitleStrokeWidthEnabled
myItemModel.isTitleMaskEnabled = isTitleMaskEnabled myItemModel.isTitleMaskEnabled = isTitleMaskEnabled
@ -68,21 +73,21 @@ open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{
myItemModel.titleSelectedStrokeWidth = titleSelectedStrokeWidth myItemModel.titleSelectedStrokeWidth = titleSelectedStrokeWidth
myItemModel.titleNormalStrokeWidth = 0 myItemModel.titleNormalStrokeWidth = 0
if index == selectedIndex { if index == selectedIndex {
myItemModel.titleCurrentColor = titleSelectedColor myItemModel.titleCurrentColor = innerTitleSelectedColor(at: index)
myItemModel.titleCurrentZoomScale = titleSelectedZoomScale myItemModel.titleCurrentZoomScale = titleSelectedZoomScale
myItemModel.titleCurrentStrokeWidth = titleSelectedStrokeWidth myItemModel.titleCurrentStrokeWidth = titleSelectedStrokeWidth
}else { }else {
myItemModel.titleCurrentColor = titleNormalColor myItemModel.titleCurrentColor = innerTitleNormalColor(at: index)
myItemModel.titleCurrentZoomScale = 1 myItemModel.titleCurrentZoomScale = 1
myItemModel.titleCurrentStrokeWidth = 0 myItemModel.titleCurrentStrokeWidth = 0
} }
} }
open func widthForTitle(_ title: String) -> CGFloat { open func widthForTitle(_ title: String, _ index: Int) -> CGFloat {
if widthForTitleClosure != nil { if widthForTitleClosure != nil {
return widthForTitleClosure!(title) return widthForTitleClosure!(title)
}else { }else {
let textWidth = NSString(string: title).boundingRect(with: CGSize(width: CGFloat.infinity, height: CGFloat.infinity), options: [.usesFontLeading, .usesLineFragmentOrigin], attributes: [NSAttributedString.Key.font : titleNormalFont], context: nil).size.width let textWidth = NSString(string: title).boundingRect(with: CGSize(width: CGFloat.infinity, height: CGFloat.infinity), options: [.usesFontLeading, .usesLineFragmentOrigin], attributes: [NSAttributedString.Key.font : innerTitleNormalFont(at: index)], context: nil).size.width
return CGFloat(ceilf(Float(textWidth))) return CGFloat(ceilf(Float(textWidth)))
} }
} }
@ -156,4 +161,42 @@ open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{
myWillSelectedItemModel.titleCurrentZoomScale = myWillSelectedItemModel.titleSelectedZoomScale myWillSelectedItemModel.titleCurrentZoomScale = myWillSelectedItemModel.titleSelectedZoomScale
myWillSelectedItemModel.titleCurrentStrokeWidth = myWillSelectedItemModel.titleSelectedStrokeWidth myWillSelectedItemModel.titleCurrentStrokeWidth = myWillSelectedItemModel.titleSelectedStrokeWidth
} }
// MARK: - Configuration
private func innerTitleNumberOfLines(at index: Int) -> Int {
if let configuration {
return configuration.titleNumberOfLines(at: index)
} else {
return titleNumberOfLines
}
}
private func innerTitleNormalColor(at index: Int) -> UIColor {
if let configuration {
return configuration.titleNormalColor(at: index)
} else {
return titleNormalColor
}
}
private func innerTitleSelectedColor(at index: Int) -> UIColor {
if let configuration {
return configuration.titleSelectedColor(at: index)
} else {
return titleSelectedColor
}
}
private func innerTitleNormalFont(at index: Int) -> UIFont {
if let configuration {
return configuration.titleNormalFont(at: index)
} else {
return titleNormalFont
}
}
private func innerTitleSelectedFont(at index: Int) -> UIFont? {
if let configuration {
return configuration.titleSelectedFont(at: index)
} else {
return titleSelectedFont
}
}
} }

View File

@ -31,7 +31,7 @@
} }
// //
self.mj_y = _scrollView.mj_contentH; self.mj_y = _scrollView.mj_contentH + self.ignoredScrollViewContentInsetBottom;
} else { // } else { //
if (self.hidden == NO) { if (self.hidden == NO) {
self.scrollView.mj_insetB -= self.mj_h; self.scrollView.mj_insetB -= self.mj_h;
@ -205,7 +205,7 @@
self.scrollView.mj_insetB += self.mj_h; self.scrollView.mj_insetB += self.mj_h;
// //
self.mj_y = _scrollView.mj_contentH; self.mj_y = _scrollView.mj_contentH + self.ignoredScrollViewContentInsetBottom;
} }
} }

View File

@ -1,5 +1,21 @@
PODS: PODS:
- Alamofire (5.9.0) - Ads-Global/BUAdSDK_Compatible (5.9.0.6):
- Ads-Global/BURelyAdSDK
- Ads-Global/Dep_Compatible
- Ads-Global/BURelyAdSDK (5.9.0.6)
- Ads-Global/Dep_Compatible (5.9.0.6):
- BURelyFoundation_Global/Pangle (~> 0.2.1.4)
- Alamofire (5.9.1)
- AppLovinDSPLinkedInAdapter (1.2.2.0):
- AppLovinSDK
- LinkedinAudienceNetwork (= 1.2.2)
- AppLovinMediationByteDanceAdapter (5.9.0.6.0):
- Ads-Global/BUAdSDK_Compatible (= 5.9.0.6)
- AppLovinSDK
- AppLovinMediationVungleAdapter (7.3.1.0):
- AppLovinSDK
- VungleAds (= 7.3.1)
- AppLovinSDK (12.4.1)
- BRPickerView (2.8.1): - BRPickerView (2.8.1):
- BRPickerView/AddressPickerView (= 2.8.1) - BRPickerView/AddressPickerView (= 2.8.1)
- BRPickerView/Base (= 2.8.1) - BRPickerView/Base (= 2.8.1)
@ -12,29 +28,165 @@ PODS:
- BRPickerView/Base - BRPickerView/Base
- BRPickerView/StringPickerView (2.8.1): - BRPickerView/StringPickerView (2.8.1):
- BRPickerView/Base - BRPickerView/Base
- BURelyFoundation_Global/AFNetworking (0.2.1.4)
- BURelyFoundation_Global/APM (0.2.1.4)
- BURelyFoundation_Global/Foundation (0.2.1.4):
- BURelyFoundation_Global/NETWork
- BURelyFoundation_Global/Gecko (0.2.1.4):
- BURelyFoundation_Global/Foundation
- BURelyFoundation_Global/Header (0.2.1.4)
- BURelyFoundation_Global/NETWork (0.2.1.4):
- BURelyFoundation_Global/AFNetworking
- BURelyFoundation_Global/Pangle (0.2.1.4):
- BURelyFoundation_Global/AFNetworking
- BURelyFoundation_Global/APM
- BURelyFoundation_Global/Foundation
- BURelyFoundation_Global/Gecko
- BURelyFoundation_Global/Header
- BURelyFoundation_Global/NETWork
- BURelyFoundation_Global/SDWebImage
- BURelyFoundation_Global/YYModel
- BURelyFoundation_Global/ZFPlayer
- BURelyFoundation_Global/Zip
- BURelyFoundation_Global/SDWebImage (0.2.1.4):
- BURelyFoundation_Global/Foundation
- BURelyFoundation_Global/YYModel (0.2.1.4)
- BURelyFoundation_Global/ZFPlayer (0.2.1.4):
- BURelyFoundation_Global/Foundation
- BURelyFoundation_Global/Zip
- BURelyFoundation_Global/Zip (0.2.1.4):
- BURelyFoundation_Global/Foundation
- CYLTabBarController (1.29.2): - CYLTabBarController (1.29.2):
- CYLTabBarController/Core (= 1.29.2) - CYLTabBarController/Core (= 1.29.2)
- CYLTabBarController/Core (1.29.2) - CYLTabBarController/Core (1.29.2)
- Firebase/AnalyticsWithoutAdIdSupport (10.24.0):
- Firebase/CoreOnly
- FirebaseAnalytics/WithoutAdIdSupport (~> 10.24.0)
- Firebase/Core (10.24.0):
- Firebase/CoreOnly
- FirebaseAnalytics (~> 10.24.0)
- Firebase/CoreOnly (10.24.0):
- FirebaseCore (= 10.24.0)
- FirebaseAnalytics (10.24.0):
- FirebaseAnalytics/AdIdSupport (= 10.24.0)
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- FirebaseAnalytics/AdIdSupport (10.24.0):
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleAppMeasurement (= 10.24.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- FirebaseAnalytics/WithoutAdIdSupport (10.24.0):
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleAppMeasurement/WithoutAdIdSupport (= 10.24.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- FirebaseCore (10.24.0):
- FirebaseCoreInternal (~> 10.0)
- GoogleUtilities/Environment (~> 7.12)
- GoogleUtilities/Logger (~> 7.12)
- FirebaseCoreInternal (10.24.0):
- "GoogleUtilities/NSData+zlib (~> 7.8)"
- FirebaseInstallations (10.24.0):
- FirebaseCore (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- PromisesObjC (~> 2.1)
- FLAnimatedImage (1.0.17) - FLAnimatedImage (1.0.17)
- FSPagerView (0.8.3) - FSPagerView (0.8.3)
- GoogleAppMeasurement (10.24.0):
- GoogleAppMeasurement/AdIdSupport (= 10.24.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- GoogleAppMeasurement/AdIdSupport (10.24.0):
- GoogleAppMeasurement/WithoutAdIdSupport (= 10.24.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- GoogleAppMeasurement/WithoutAdIdSupport (10.24.0):
- GoogleUtilities/AppDelegateSwizzler (~> 7.11)
- GoogleUtilities/MethodSwizzler (~> 7.11)
- GoogleUtilities/Network (~> 7.11)
- "GoogleUtilities/NSData+zlib (~> 7.11)"
- nanopb (< 2.30911.0, >= 2.30908.0)
- GoogleUtilities/AppDelegateSwizzler (7.13.0):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Privacy
- GoogleUtilities/Environment (7.13.0):
- GoogleUtilities/Privacy
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/Logger (7.13.0):
- GoogleUtilities/Environment
- GoogleUtilities/Privacy
- GoogleUtilities/MethodSwizzler (7.13.0):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GoogleUtilities/Network (7.13.0):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Privacy
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (7.13.0)":
- GoogleUtilities/Privacy
- GoogleUtilities/Privacy (7.13.0)
- GoogleUtilities/Reachability (7.13.0):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GoogleUtilities/UserDefaults (7.13.0):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- GYSide (0.0.5) - GYSide (0.0.5)
- IQKeyboardManagerSwift (7.0.1) - IQKeyboardManagerSwift (6.5.16)
- JXSegmentedView (1.3.0) - JXSegmentedView (1.3.3)
- LinkedinAudienceNetwork (1.2.2)
- lottie-ios (4.4.1) - lottie-ios (4.4.1)
- MJExtension (3.4.1) - MJExtension (3.4.2)
- MJRefresh (3.7.6) - MJRefresh (3.7.9)
- SDWebImage (5.19.0): - nanopb (2.30910.0):
- SDWebImage/Core (= 5.19.0) - nanopb/decode (= 2.30910.0)
- SDWebImage/Core (5.19.0) - nanopb/encode (= 2.30910.0)
- nanopb/decode (2.30910.0)
- nanopb/encode (2.30910.0)
- PromisesObjC (2.4.0)
- SDWebImage (5.19.1):
- SDWebImage/Core (= 5.19.1)
- SDWebImage/Core (5.19.1)
- SnapKit (5.7.1) - SnapKit (5.7.1)
- SVProgressHUD (2.3.1): - SVProgressHUD (2.3.1):
- SVProgressHUD/Core (= 2.3.1) - SVProgressHUD/Core (= 2.3.1)
- SVProgressHUD/Core (2.3.1) - SVProgressHUD/Core (2.3.1)
- VungleAds (7.3.1)
DEPENDENCIES: DEPENDENCIES:
- Alamofire - Alamofire
- AppLovinDSPLinkedInAdapter
- AppLovinMediationByteDanceAdapter
- AppLovinMediationVungleAdapter
- AppLovinSDK
- BRPickerView - BRPickerView
- CYLTabBarController - CYLTabBarController
- Firebase/AnalyticsWithoutAdIdSupport
- Firebase/Core
- FLAnimatedImage - FLAnimatedImage
- FSPagerView - FSPagerView
- GYSide - GYSide
@ -49,37 +201,71 @@ DEPENDENCIES:
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- Ads-Global
- Alamofire - Alamofire
- AppLovinDSPLinkedInAdapter
- AppLovinMediationByteDanceAdapter
- AppLovinMediationVungleAdapter
- AppLovinSDK
- BRPickerView - BRPickerView
- BURelyFoundation_Global
- CYLTabBarController - CYLTabBarController
- Firebase
- FirebaseAnalytics
- FirebaseCore
- FirebaseCoreInternal
- FirebaseInstallations
- FLAnimatedImage - FLAnimatedImage
- FSPagerView - FSPagerView
- GoogleAppMeasurement
- GoogleUtilities
- GYSide - GYSide
- IQKeyboardManagerSwift - IQKeyboardManagerSwift
- JXSegmentedView - JXSegmentedView
- LinkedinAudienceNetwork
- lottie-ios - lottie-ios
- MJExtension - MJExtension
- MJRefresh - MJRefresh
- nanopb
- PromisesObjC
- SDWebImage - SDWebImage
- SnapKit - SnapKit
- SVProgressHUD - SVProgressHUD
- VungleAds
SPEC CHECKSUMS: SPEC CHECKSUMS:
Alamofire: 02b772c9910e8eba1a079227c32fbd9e46c90a24 Ads-Global: 3ed9f8c6f11d4d6a4496e1dd74a4537f10b41b65
Alamofire: f36a35757af4587d8e4f4bfa223ad10be2422b8c
AppLovinDSPLinkedInAdapter: 093f25d472b4073f8203fa72a68347cbd589e232
AppLovinMediationByteDanceAdapter: d902ba6e2a6c0061bf2675ec74428b37620b59ca
AppLovinMediationVungleAdapter: b42444550ca03233753cfeb36a5660f94d038fb5
AppLovinSDK: c57ad0d34625c971d2db127f8ef60570b28ff51a
BRPickerView: 2531a2d4d0fea0b57a1c738de215af0f88863a2f BRPickerView: 2531a2d4d0fea0b57a1c738de215af0f88863a2f
BURelyFoundation_Global: 17ed9cd58d138feefd8c0711dd3294766adcb28e
CYLTabBarController: db44b5901a28693a8a4279e4721b3aafdd36c178 CYLTabBarController: db44b5901a28693a8a4279e4721b3aafdd36c178
Firebase: 91fefd38712feb9186ea8996af6cbdef41473442
FirebaseAnalytics: b5efc493eb0f40ec560b04a472e3e1a15d39ca13
FirebaseCore: 11dc8a16dfb7c5e3c3f45ba0e191a33ac4f50894
FirebaseCoreInternal: bcb5acffd4ea05e12a783ecf835f2210ce3dc6af
FirebaseInstallations: 8f581fca6478a50705d2bd2abd66d306e0f5736e
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
FSPagerView: 670405b2f18e2a87fa37f20b00de783e562c25a8 FSPagerView: 670405b2f18e2a87fa37f20b00de783e562c25a8
GoogleAppMeasurement: f3abf08495ef2cba7829f15318c373b8d9226491
GoogleUtilities: d053d902a8edaa9904e1bd00c37535385b8ed152
GYSide: 672895491bf7a809f0631dd8a122ab5d1d601aae GYSide: 672895491bf7a809f0631dd8a122ab5d1d601aae
IQKeyboardManagerSwift: 7f6b1b1d1497855d2beea7f2f10ffcc6978525b1 IQKeyboardManagerSwift: 12d89768845bb77b55cc092ecc2b1f9370f06b76
JXSegmentedView: fec0d335355b6e019c494fe2e030bde8a36d2df6 JXSegmentedView: 651b60fcf705258ba9395edd53876dbd2853fb68
LinkedinAudienceNetwork: de299f32547bd528916b3c9f113015f74347398c
lottie-ios: e047b1d2e6239b787cc5e9755b988869cf190494 lottie-ios: e047b1d2e6239b787cc5e9755b988869cf190494
MJExtension: 21c5f6f8c4d5d8844b7ae8fbae08fed0b501f961 MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
MJRefresh: 2fe7fb43a5167ceda20bb7e63f130c04fd1814a5 MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
SDWebImage: 981fd7e860af070920f249fd092420006014c3eb nanopb: 438bc412db1928dac798aa6fd75726007be04262
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
SDWebImage: 40b0b4053e36c660a764958bff99eed16610acbb
SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22 SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22
VungleAds: 04a17ab51fb61f41cd6d666fd0024509005740fe
PODFILE CHECKSUM: 8919f964b95c5ac6e11bc2a3a3200b4dd02b3b9c PODFILE CHECKSUM: e5237cccfc6fa11c317ad1e1cbd81ea18c1f4a05
COCOAPODS: 1.15.2 COCOAPODS: 1.15.2

File diff suppressed because it is too large Load Diff

View File

@ -4,145 +4,235 @@
<dict> <dict>
<key>SchemeUserState</key> <key>SchemeUserState</key>
<dict> <dict>
<key>Ads-Global.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>Alamofire-Alamofire.xcscheme</key> <key>Alamofire-Alamofire.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>1</integer>
</dict> </dict>
<key>Alamofire.xcscheme</key> <key>Alamofire.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> </dict>
<integer>0</integer> <key>AppLovinDSPLinkedInAdapter.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>AppLovinMediationByteDanceAdapter.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>AppLovinMediationVungleAdapter.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>AppLovinSDK.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict> </dict>
<key>BRPickerView.xcscheme</key> <key>BRPickerView.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> </dict>
<integer>2</integer> <key>BURelyFoundation_Global.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict> </dict>
<key>CYLTabBarController.xcscheme</key> <key>CYLTabBarController.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>3</integer>
</dict> </dict>
<key>FLAnimatedImage.xcscheme</key> <key>FLAnimatedImage.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>4</integer>
</dict> </dict>
<key>FSPagerView.xcscheme</key> <key>FSPagerView.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> </dict>
<integer>5</integer> <key>Firebase.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>FirebaseAnalytics.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>FirebaseCore-FirebaseCore_Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>FirebaseCore.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>FirebaseCoreInternal-FirebaseCoreInternal_Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>FirebaseCoreInternal.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>FirebaseInstallations-FirebaseInstallations_Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>FirebaseInstallations.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict> </dict>
<key>GYSide.xcscheme</key> <key>GYSide.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>6</integer>
</dict> </dict>
<key>IQKeyboardManagerSwift-IQKeyboardManagerSwift.xcscheme</key> <key>GoogleAppMeasurement.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>GoogleUtilities-GoogleUtilities_Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>GoogleUtilities.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>8</integer>
</dict> </dict>
<key>IQKeyboardManagerSwift.xcscheme</key> <key>IQKeyboardManagerSwift.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> </dict>
<integer>7</integer> <key>JXSegmentedView-JXSegmentedView.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict> </dict>
<key>JXSegmentedView.xcscheme</key> <key>JXSegmentedView.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> </dict>
<integer>9</integer> <key>LinkedinAudienceNetwork.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>MJExtension-MJExtension.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict> </dict>
<key>MJExtension.xcscheme</key> <key>MJExtension.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> </dict>
<integer>12</integer> <key>MJRefresh-MJRefresh.Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict> </dict>
<key>MJRefresh.xcscheme</key> <key>MJRefresh.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>13</integer>
</dict> </dict>
<key>Pods-wallpaper_project.xcscheme</key> <key>Pods-wallpaper_project.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> </dict>
<integer>14</integer> <key>PromisesObjC-FBLPromises_Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>PromisesObjC.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict> </dict>
<key>SDWebImage-SDWebImage.xcscheme</key> <key>SDWebImage-SDWebImage.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>16</integer>
</dict> </dict>
<key>SDWebImage.xcscheme</key> <key>SDWebImage.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>15</integer>
</dict> </dict>
<key>SVProgressHUD.xcscheme</key> <key>SVProgressHUD.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>19</integer>
</dict> </dict>
<key>SnapKit-SnapKit_Privacy.xcscheme</key> <key>SnapKit-SnapKit_Privacy.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>18</integer>
</dict> </dict>
<key>SnapKit.xcscheme</key> <key>SnapKit.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> </dict>
<integer>17</integer> <key>VungleAds-VungleAds.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>VungleAds.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict> </dict>
<key>lottie-ios-LottiePrivacyInfo.xcscheme</key> <key>lottie-ios-LottiePrivacyInfo.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>11</integer>
</dict> </dict>
<key>lottie-ios.xcscheme</key> <key>lottie-ios.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> </dict>
<integer>10</integer> <key>nanopb-nanopb_Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>nanopb.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict> </dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>

View File

@ -39,19 +39,20 @@ Note: `SD` is the prefix for **Simple Design** (which is the team name in Daily
## For Apple visionOS ## For Apple visionOS
From 5.18.0, SDWebImage can be compiled for visionOS platform. However, it's still in beta and may contains issues unlike the stable iOS UIKit support. Welcome to have a try and [report issue](https://github.com/SDWebImage/SDWebImage/issues). From 5.19+, SDWebImage supports visionOS on all Package Managers (include CocoaPods/Carthage/SPM). Upgrade the related tools if you're facing issues.
For 5.18+, SDWebImage can be compiled for visionOS platform. However, it's still in beta and may contains issues unlike the stable iOS UIKit support. Welcome to have a try and [report issue](https://github.com/SDWebImage/SDWebImage/issues).
To build on visionOS, currently we only support the standard Xcode integration. To build on visionOS, currently we only support the standard Xcode integration.
See `Installation with Swift Package Manager` and `Manual Installation Guide` below. See `Installation with Swift Package Manager` and `Manual Installation Guide` below.
Once the visionOS toolchain is stable, we will add the other package manager support later (include CocoaPods).
## Supported Image Formats ## Supported Image Formats
- Image formats supported by Apple system (JPEG, PNG, TIFF, BMP, ...), including [GIF](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#gif-coder)/[APNG](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#apng-coder) animated image - Image formats supported by Apple system (JPEG, PNG, TIFF, BMP, ...), including [GIF](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#gif-coder)/[APNG](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#apng-coder) animated image
- HEIC format from iOS 11/macOS 10.13, including animated HEIC from iOS 13/macOS 10.15 via [SDWebImageHEICCoder](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#heic-coder). For lower firmware, use coder plugin [SDWebImageHEIFCoder](https://github.com/SDWebImage/SDWebImageHEIFCoder) - HEIC format from iOS 11/macOS 10.13, including animated HEIC from iOS 13/macOS 10.15 via [SDWebImageHEICCoder](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#heic-coder). For lower firmware, use coder plugin [SDWebImageHEIFCoder](https://github.com/SDWebImage/SDWebImageHEIFCoder)
- WebP format from iOS 14/macOS 11.0 via [SDWebImageAWebPCoder](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#awebp-coder). For lower firmware, use coder plugin [SDWebImageWebPCoder](https://github.com/SDWebImage/SDWebImageWebPCoder) - WebP format from iOS 14/macOS 11.0 via [SDWebImageAWebPCoder](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#awebp-coder). For lower firmware, use coder plugin [SDWebImageWebPCoder](https://github.com/SDWebImage/SDWebImageWebPCoder)
- JPEG-XL format from iOS 17/macOS 14.0 built-in. For lower firmware, use coder plugin [SDWebImageJPEGXLCoder](https://github.com/SDWebImage/SDWebImageJPEGXLCoder)
- Support extendable coder plugins for new image formats like BPG, AVIF. And vector format like PDF, SVG. See all the list in [Image coder plugin List](https://github.com/SDWebImage/SDWebImage/wiki/Coder-Plugin-List) - Support extendable coder plugins for new image formats like BPG, AVIF. And vector format like PDF, SVG. See all the list in [Image coder plugin List](https://github.com/SDWebImage/SDWebImage/wiki/Coder-Plugin-List)
## Additional modules and Ecosystem ## Additional modules and Ecosystem
@ -67,8 +68,8 @@ We support SwiftUI by building a brand new framework called [SDWebImageSwiftUI](
The new framework introduce two View structs `WebImage` and `AnimatedImage` for SwiftUI world, `ImageIndicator` modifier for any View, `ImageManager` observable object for data source. Supports iOS 13+/macOS 10.15+/tvOS 13+/watchOS 6+ and Swift 5.1. Have a nice try and provide feedback! The new framework introduce two View structs `WebImage` and `AnimatedImage` for SwiftUI world, `ImageIndicator` modifier for any View, `ImageManager` observable object for data source. Supports iOS 13+/macOS 10.15+/tvOS 13+/watchOS 6+ and Swift 5.1. Have a nice try and provide feedback!
#### Coders for additional image formats #### Coders for additional image formats
- [SDWebImageWebPCoder](https://github.com/SDWebImage/SDWebImageWebPCoder) - coder for WebP format. iOS 8+/macOS 10.10+. Based on [libwebp](https://chromium.googlesource.com/webm/libwebp) - [SDWebImageWebPCoder](https://github.com/SDWebImage/SDWebImageWebPCoder) - coder for WebP format. iOS 9+/macOS 10.11+. Based on [libwebp](https://chromium.googlesource.com/webm/libwebp)
- [SDWebImageHEIFCoder](https://github.com/SDWebImage/SDWebImageHEIFCoder) - coder for HEIF format, iOS 8+/macOS 10.10+ support. Based on [libheif](https://github.com/strukturag/libheif) - [SDWebImageHEIFCoder](https://github.com/SDWebImage/SDWebImageHEIFCoder) - coder for HEIF format, iOS 9+/macOS 10.11+ support. Based on [libheif](https://github.com/strukturag/libheif)
- [SDWebImageBPGCoder](https://github.com/SDWebImage/SDWebImageBPGCoder) - coder for BPG format. Based on [libbpg](https://github.com/mirrorer/libbpg) - [SDWebImageBPGCoder](https://github.com/SDWebImage/SDWebImageBPGCoder) - coder for BPG format. Based on [libbpg](https://github.com/mirrorer/libbpg)
- [SDWebImageFLIFCoder](https://github.com/SDWebImage/SDWebImageFLIFCoder) - coder for FLIF format. Based on [libflif](https://github.com/FLIF-hub/FLIF) - [SDWebImageFLIFCoder](https://github.com/SDWebImage/SDWebImageFLIFCoder) - coder for FLIF format. Based on [libflif](https://github.com/FLIF-hub/FLIF)
- [SDWebImageAVIFCoder](https://github.com/SDWebImage/SDWebImageAVIFCoder) - coder for AVIF (AV1-based) format. Based on [libavif](https://github.com/AOMediaCodec/libavif) - [SDWebImageAVIFCoder](https://github.com/SDWebImage/SDWebImageAVIFCoder) - coder for AVIF (AV1-based) format. Based on [libavif](https://github.com/AOMediaCodec/libavif)
@ -76,6 +77,7 @@ The new framework introduce two View structs `WebImage` and `AnimatedImage` for
- [SDWebImageSVGCoder](https://github.com/SDWebImage/SDWebImageSVGCoder) - coder for SVG vector format. Using built-in frameworks - [SDWebImageSVGCoder](https://github.com/SDWebImage/SDWebImageSVGCoder) - coder for SVG vector format. Using built-in frameworks
- [SDWebImageSVGNativeCoder](https://github.com/SDWebImage/SDWebImageSVGNativeCoder) - coder for SVG-Native vector format. Based on [svg-native](https://github.com/adobe/svg-native-viewer) - [SDWebImageSVGNativeCoder](https://github.com/SDWebImage/SDWebImageSVGNativeCoder) - coder for SVG-Native vector format. Based on [svg-native](https://github.com/adobe/svg-native-viewer)
- [SDWebImageLottieCoder](https://github.com/SDWebImage/SDWebImageLottieCoder) - coder for Lottie animation format. Based on [rlottie](https://github.com/Samsung/rlottie) - [SDWebImageLottieCoder](https://github.com/SDWebImage/SDWebImageLottieCoder) - coder for Lottie animation format. Based on [rlottie](https://github.com/Samsung/rlottie)
- [SDWebImageJPEGXLCoder](https://github.com/SDWebImage/SDWebImageJPEGXLCoder) - coder for JPEG-XL format. iOS 9+/macOS 10.11+. Based on [libjxl](https://github.com/libjxl/libjxl)
- and more from community! - and more from community!
#### Custom Caches #### Custom Caches
@ -88,7 +90,7 @@ The new framework introduce two View structs `WebImage` and `AnimatedImage` for
#### Integration with 3rd party libraries #### Integration with 3rd party libraries
- [SDWebImageLottiePlugin](https://github.com/SDWebImage/SDWebImageLottiePlugin) - plugin to support [Lottie-iOS](https://github.com/airbnb/lottie-ios), vector animation rending with remote JSON files - [SDWebImageLottiePlugin](https://github.com/SDWebImage/SDWebImageLottiePlugin) - plugin to support [Lottie-iOS](https://github.com/airbnb/lottie-ios), vector animation rending with remote JSON files
- [SDWebImageSVGKitPlugin](https://github.com/SDWebImage/SDWebImageSVGKitPlugin) - plugin to support [SVGKit](https://github.com/SVGKit/SVGKit), SVG rendering using Core Animation, iOS 8+/macOS 10.10+ support - [SDWebImageSVGKitPlugin](https://github.com/SDWebImage/SDWebImageSVGKitPlugin) - plugin to support [SVGKit](https://github.com/SVGKit/SVGKit), SVG rendering using Core Animation, iOS 9+/macOS 10.11+ support
- [SDWebImageFLPlugin](https://github.com/SDWebImage/SDWebImageFLPlugin) - plugin to support [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) as the engine for animated GIFs - [SDWebImageFLPlugin](https://github.com/SDWebImage/SDWebImageFLPlugin) - plugin to support [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) as the engine for animated GIFs
- [SDWebImageYYPlugin](https://github.com/SDWebImage/SDWebImageYYPlugin) - plugin to integrate [YYImage](https://github.com/ibireme/YYImage) & [YYCache](https://github.com/ibireme/YYCache) for image rendering & caching - [SDWebImageYYPlugin](https://github.com/SDWebImage/SDWebImageYYPlugin) - plugin to integrate [YYImage](https://github.com/ibireme/YYImage) & [YYCache](https://github.com/ibireme/YYCache) for image rendering & caching

View File

@ -94,6 +94,9 @@ static void SDSafeExecute(SDCallbackQueue *callbackQueue, dispatch_block_t _Nonn
case SDCallbackPolicyInvoke: case SDCallbackPolicyInvoke:
block(); block();
break; break;
default:
SDSafeExecute(self, block, NO);
break;
} }
} }
@ -108,6 +111,9 @@ static void SDSafeExecute(SDCallbackQueue *callbackQueue, dispatch_block_t _Nonn
case SDCallbackPolicyInvoke: case SDCallbackPolicyInvoke:
block(); block();
break; break;
default:
SDSafeExecute(self, block, YES);
break;
} }
} }

View File

@ -129,6 +129,7 @@
@property (nonatomic, strong, readonly, nonnull) SDImageCacheConfig *config; @property (nonatomic, strong, readonly, nonnull) SDImageCacheConfig *config;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
/** /**
Move the cache directory from old location to new location, the old location will be removed after finish. Move the cache directory from old location to new location, the old location will be removed after finish.

View File

@ -165,7 +165,7 @@ static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDis
NSArray<NSString *> *resourceKeys = @[NSURLIsDirectoryKey, cacheContentDateKey, NSURLTotalFileAllocatedSizeKey]; NSArray<NSString *> *resourceKeys = @[NSURLIsDirectoryKey, cacheContentDateKey, NSURLTotalFileAllocatedSizeKey];
// This enumerator prefetches useful properties for our cache files. // This enumerator prefetches useful properties for our cache files.
NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtURL:diskCacheURL NSDirectoryEnumerator<NSURL *> *fileEnumerator = [self.fileManager enumeratorAtURL:diskCacheURL
includingPropertiesForKeys:resourceKeys includingPropertiesForKeys:resourceKeys
options:NSDirectoryEnumerationSkipsHiddenFiles options:NSDirectoryEnumerationSkipsHiddenFiles
errorHandler:NULL]; errorHandler:NULL];
@ -180,6 +180,7 @@ static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDis
// 2. Storing file attributes for the size-based cleanup pass. // 2. Storing file attributes for the size-based cleanup pass.
NSMutableArray<NSURL *> *urlsToDelete = [[NSMutableArray alloc] init]; NSMutableArray<NSURL *> *urlsToDelete = [[NSMutableArray alloc] init];
for (NSURL *fileURL in fileEnumerator) { for (NSURL *fileURL in fileEnumerator) {
@autoreleasepool {
NSError *error; NSError *error;
NSDictionary<NSString *, id> *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error]; NSDictionary<NSString *, id> *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error];
@ -200,6 +201,7 @@ static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDis
currentCacheSize += totalAllocatedSize.unsignedIntegerValue; currentCacheSize += totalAllocatedSize.unsignedIntegerValue;
cacheFiles[fileURL] = resourceValues; cacheFiles[fileURL] = resourceValues;
} }
}
for (NSURL *fileURL in urlsToDelete) { for (NSURL *fileURL in urlsToDelete) {
[self.fileManager removeItemAtURL:fileURL error:nil]; [self.fileManager removeItemAtURL:fileURL error:nil];
@ -240,19 +242,37 @@ static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDis
- (NSUInteger)totalSize { - (NSUInteger)totalSize {
NSUInteger size = 0; NSUInteger size = 0;
NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtPath:self.diskCachePath];
for (NSString *fileName in fileEnumerator) { // Use URL-based enumerator instead of Path(NSString *)-based enumerator to reduce
NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName]; // those objects(ex. NSPathStore2/_NSCFString/NSConcreteData) created during traversal.
NSDictionary<NSString *, id> *attrs = [self.fileManager attributesOfItemAtPath:filePath error:nil]; // Even worse, those objects are added into AutoreleasePool, in background threads,
size += [attrs fileSize]; // the time to release those objects is undifined(according to the usage of CPU)
// It will truely consumes a lot of VM, up to cause OOMs.
@autoreleasepool {
NSURL *pathURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES];
NSDirectoryEnumerator<NSURL *> *fileEnumerator = [self.fileManager enumeratorAtURL:pathURL
includingPropertiesForKeys:@[NSURLFileSizeKey]
options:(NSDirectoryEnumerationOptions)0
errorHandler:NULL];
for (NSURL *fileURL in fileEnumerator) {
@autoreleasepool {
NSNumber *fileSize;
[fileURL getResourceValue:&fileSize forKey:NSURLFileSizeKey error:NULL];
size += fileSize.unsignedIntegerValue;
}
}
} }
return size; return size;
} }
- (NSUInteger)totalCount { - (NSUInteger)totalCount {
NSUInteger count = 0; NSUInteger count = 0;
NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtPath:self.diskCachePath]; @autoreleasepool {
NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES];
NSDirectoryEnumerator<NSURL *> *fileEnumerator = [self.fileManager enumeratorAtURL:diskCacheURL includingPropertiesForKeys:@[] options:(NSDirectoryEnumerationOptions)0 errorHandler:nil];
count = fileEnumerator.allObjects.count; count = fileEnumerator.allObjects.count;
}
return count; return count;
} }
@ -295,13 +315,21 @@ static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDis
} }
} else { } else {
// New directory exist, merge the files // New directory exist, merge the files
NSDirectoryEnumerator *dirEnumerator = [self.fileManager enumeratorAtPath:srcPath]; NSURL *srcURL = [NSURL fileURLWithPath:srcPath isDirectory:YES];
NSString *file; NSDirectoryEnumerator<NSURL *> *srcDirEnumerator = [self.fileManager enumeratorAtURL:srcURL
while ((file = [dirEnumerator nextObject])) { includingPropertiesForKeys:@[]
[self.fileManager moveItemAtPath:[srcPath stringByAppendingPathComponent:file] toPath:[dstPath stringByAppendingPathComponent:file] error:nil]; options:(NSDirectoryEnumerationOptions)0
errorHandler:NULL];
for (NSURL *url in srcDirEnumerator) {
@autoreleasepool {
NSString *dstFilePath = [dstPath stringByAppendingPathComponent:url.lastPathComponent];
NSURL *dstFileURL = [NSURL fileURLWithPath:dstFilePath isDirectory:NO];
[self.fileManager moveItemAtURL:url toURL:dstFileURL error:nil];
} }
}
// Remove the old path // Remove the old path
[self.fileManager removeItemAtPath:srcPath error:nil]; [self.fileManager removeItemAtURL:srcURL error:nil];
} }
} }

View File

@ -129,7 +129,7 @@ typedef NS_ENUM(NSUInteger, SDImageCacheConfigExpireType) {
/** /**
* The dispatch queue attr for ioQueue. You can config the QoS and concurrent/serial to internal IO queue. The ioQueue is used by SDImageCache to access read/write for disk data. * The dispatch queue attr for ioQueue. You can config the QoS and concurrent/serial to internal IO queue. The ioQueue is used by SDImageCache to access read/write for disk data.
* Defaults we use `DISPATCH_QUEUE_SERIAL`(NULL), to use serial dispatch queue to ensure single access for disk data. It's safe but may be slow. * Defaults we use `DISPATCH_QUEUE_SERIAL`(NULL) under iOS 10, `DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL` above and equal iOS 10, using serial dispatch queue is to ensure single access for disk data. It's safe but may be slow.
* @note You can override this to use `DISPATCH_QUEUE_CONCURRENT`, use concurrent queue. * @note You can override this to use `DISPATCH_QUEUE_CONCURRENT`, use concurrent queue.
* @warning **MAKE SURE** to keep `diskCacheWritingOptions` to use `NSDataWritingAtomic`, or concurrent queue may cause corrupted disk data (because multiple threads read/write same file without atomic is not IO-safe). * @warning **MAKE SURE** to keep `diskCacheWritingOptions` to use `NSDataWritingAtomic`, or concurrent queue may cause corrupted disk data (because multiple threads read/write same file without atomic is not IO-safe).
* @note This value does not support dynamic changes. Which means further modification on this value after cache initialized has no effect. * @note This value does not support dynamic changes. Which means further modification on this value after cache initialized has no effect.

View File

@ -36,7 +36,11 @@ static const NSInteger kDefaultCacheMaxDiskAge = 60 * 60 * 24 * 7; // 1 week
_maxDiskSize = 0; _maxDiskSize = 0;
_diskCacheExpireType = SDImageCacheConfigExpireTypeModificationDate; _diskCacheExpireType = SDImageCacheConfigExpireTypeModificationDate;
_fileManager = nil; _fileManager = nil;
if (@available(iOS 10.0, tvOS 10.0, macOS 10.12, watchOS 3.0, *)) {
_ioQueueAttributes = DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL; // DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM
} else {
_ioQueueAttributes = DISPATCH_QUEUE_SERIAL; // NULL _ioQueueAttributes = DISPATCH_QUEUE_SERIAL; // NULL
}
_memoryCacheClass = [SDMemoryCache class]; _memoryCacheClass = [SDMemoryCache class];
_diskCacheClass = [SDDiskCache class]; _diskCacheClass = [SDDiskCache class];
} }

View File

@ -36,6 +36,17 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
*/ */
@protocol SDImageTransformer <NSObject> @protocol SDImageTransformer <NSObject>
@optional
/**
Defaults to YES.
We keep some metadata like Image Format (`sd_imageFormat`)/ Animated Loop Count (`sd_imageLoopCount`) via associated object on UIImage instance.
When transformer generate a new UIImage instance, in most cases you still want to keep these information. So this is what for during the image loading pipeline.
If the value is YES, we will keep and override the metadata **After you generate the UIImage**
If the value is NO, we will not touch the UIImage metadata and it's controlled by you during the generation. Read `UIImage+Medata.h` and pick the metadata you want for the new generated UIImage.
*/
@property (nonatomic, assign, readonly) BOOL preserveImageMetadata;
@required @required
/** /**
For each transformer, it must contains its cache key to used to store the image cache or query from the cache. This key will be appened after the original cache key generated by URL or from user. For each transformer, it must contains its cache key to used to store the image cache or query from the cache. This key will be appened after the original cache key generated by URL or from user.
@ -69,6 +80,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, copy, readonly, nonnull) NSArray<id<SDImageTransformer>> *transformers; @property (nonatomic, copy, readonly, nonnull) NSArray<id<SDImageTransformer>> *transformers;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithTransformers:(nonnull NSArray<id<SDImageTransformer>> *)transformers; + (nonnull instancetype)transformerWithTransformers:(nonnull NSArray<id<SDImageTransformer>> *)transformers;
@end @end
@ -109,6 +122,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, strong, readonly, nullable) UIColor *borderColor; @property (nonatomic, strong, readonly, nullable) UIColor *borderColor;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithRadius:(CGFloat)cornerRadius corners:(SDRectCorner)corners borderWidth:(CGFloat)borderWidth borderColor:(nullable UIColor *)borderColor; + (nonnull instancetype)transformerWithRadius:(CGFloat)cornerRadius corners:(SDRectCorner)corners borderWidth:(CGFloat)borderWidth borderColor:(nullable UIColor *)borderColor;
@end @end
@ -129,6 +144,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) SDImageScaleMode scaleMode; @property (nonatomic, assign, readonly) SDImageScaleMode scaleMode;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithSize:(CGSize)size scaleMode:(SDImageScaleMode)scaleMode; + (nonnull instancetype)transformerWithSize:(CGSize)size scaleMode:(SDImageScaleMode)scaleMode;
@end @end
@ -144,6 +161,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) CGRect rect; @property (nonatomic, assign, readonly) CGRect rect;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithRect:(CGRect)rect; + (nonnull instancetype)transformerWithRect:(CGRect)rect;
@end @end
@ -164,6 +183,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) BOOL vertical; @property (nonatomic, assign, readonly) BOOL vertical;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithHorizontal:(BOOL)horizontal vertical:(BOOL)vertical; + (nonnull instancetype)transformerWithHorizontal:(BOOL)horizontal vertical:(BOOL)vertical;
@end @end
@ -185,6 +206,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) BOOL fitSize; @property (nonatomic, assign, readonly) BOOL fitSize;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithAngle:(CGFloat)angle fitSize:(BOOL)fitSize; + (nonnull instancetype)transformerWithAngle:(CGFloat)angle fitSize:(BOOL)fitSize;
@end @end
@ -202,6 +225,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, strong, readonly, nonnull) UIColor *tintColor; @property (nonatomic, strong, readonly, nonnull) UIColor *tintColor;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithColor:(nonnull UIColor *)tintColor; + (nonnull instancetype)transformerWithColor:(nonnull UIColor *)tintColor;
@end @end
@ -219,6 +244,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) CGFloat blurRadius; @property (nonatomic, assign, readonly) CGFloat blurRadius;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithRadius:(CGFloat)blurRadius; + (nonnull instancetype)transformerWithRadius:(CGFloat)blurRadius;
@end @end
@ -235,6 +262,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, strong, readonly, nonnull) CIFilter *filter; @property (nonatomic, strong, readonly, nonnull) CIFilter *filter;
- (nonnull instancetype)init NS_UNAVAILABLE; - (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithFilter:(nonnull CIFilter *)filter; + (nonnull instancetype)transformerWithFilter:(nonnull CIFilter *)filter;
@end @end

View File

@ -26,6 +26,9 @@ typedef NSString * _Nullable(^SDWebImageCacheKeyFilterBlock)(NSURL * _Nonnull ur
*/ */
@interface SDWebImageCacheKeyFilter : NSObject <SDWebImageCacheKeyFilter> @interface SDWebImageCacheKeyFilter : NSObject <SDWebImageCacheKeyFilter>
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
- (nonnull instancetype)initWithBlock:(nonnull SDWebImageCacheKeyFilterBlock)block; - (nonnull instancetype)initWithBlock:(nonnull SDWebImageCacheKeyFilterBlock)block;
+ (nonnull instancetype)cacheKeyFilterWithBlock:(nonnull SDWebImageCacheKeyFilterBlock)block; + (nonnull instancetype)cacheKeyFilterWithBlock:(nonnull SDWebImageCacheKeyFilterBlock)block;

View File

@ -33,4 +33,7 @@ typedef NSData * _Nullable(^SDWebImageCacheSerializerBlock)(UIImage * _Nonnull i
- (nonnull instancetype)initWithBlock:(nonnull SDWebImageCacheSerializerBlock)block; - (nonnull instancetype)initWithBlock:(nonnull SDWebImageCacheSerializerBlock)block;
+ (nonnull instancetype)cacheSerializerWithBlock:(nonnull SDWebImageCacheSerializerBlock)block; + (nonnull instancetype)cacheSerializerWithBlock:(nonnull SDWebImageCacheSerializerBlock)block;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@end @end

View File

@ -38,6 +38,9 @@ A downloader response modifier class with block.
/// @param block A block to control decrypt logic /// @param block A block to control decrypt logic
+ (nonnull instancetype)decryptorWithBlock:(nonnull SDWebImageDownloaderDecryptorBlock)block; + (nonnull instancetype)decryptorWithBlock:(nonnull SDWebImageDownloaderDecryptorBlock)block;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@end @end
/// Convenience way to create decryptor for common data encryption. /// Convenience way to create decryptor for common data encryption.

View File

@ -37,6 +37,9 @@ typedef NSURLRequest * _Nullable (^SDWebImageDownloaderRequestModifierBlock)(NSU
/// @param block A block to control modifier logic /// @param block A block to control modifier logic
+ (nonnull instancetype)requestModifierWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block; + (nonnull instancetype)requestModifierWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@end @end
/** /**

View File

@ -37,6 +37,9 @@ typedef NSURLResponse * _Nullable (^SDWebImageDownloaderResponseModifierBlock)(N
/// @param block A block to control modifier logic /// @param block A block to control modifier logic
+ (nonnull instancetype)responseModifierWithBlock:(nonnull SDWebImageDownloaderResponseModifierBlock)block; + (nonnull instancetype)responseModifierWithBlock:(nonnull SDWebImageDownloaderResponseModifierBlock)block;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@end @end
/** /**

View File

@ -510,6 +510,16 @@ static id<SDImageLoader> _defaultImageLoader;
// Case that transformer on thumbnail, which this time need full pixel image // Case that transformer on thumbnail, which this time need full pixel image
UIImage *transformedImage = [transformer transformedImageWithImage:cacheImage forKey:key]; UIImage *transformedImage = [transformer transformedImageWithImage:cacheImage forKey:key];
if (transformedImage) { if (transformedImage) {
// We need keep some metadata from the full size image when needed
// Because most of our transformer does not care about these information
BOOL preserveImageMetadata = YES;
if ([transformer respondsToSelector:@selector(preserveImageMetadata)]) {
preserveImageMetadata = transformer.preserveImageMetadata;
}
if (preserveImageMetadata) {
SDImageCopyAssociatedObject(cacheImage, transformedImage);
}
// Mark the transformed
transformedImage.sd_isTransformed = YES; transformedImage.sd_isTransformed = YES;
[self callStoreOriginCacheProcessForOperation:operation url:url options:options context:context originalImage:originalImage cacheImage:transformedImage originalData:originalData cacheData:nil cacheType:cacheType finished:finished completed:completedBlock]; [self callStoreOriginCacheProcessForOperation:operation url:url options:options context:context originalImage:originalImage cacheImage:transformedImage originalData:originalData cacheData:nil cacheType:cacheType finished:finished completed:completedBlock];
} else { } else {

View File

@ -38,6 +38,9 @@ typedef SDWebImageOptionsResult * _Nullable(^SDWebImageOptionsProcessorBlock)(NS
*/ */
- (nonnull instancetype)initWithOptions:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context; - (nonnull instancetype)initWithOptions:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@end @end
/** /**
@ -69,4 +72,7 @@ typedef SDWebImageOptionsResult * _Nullable(^SDWebImageOptionsProcessorBlock)(NS
- (nonnull instancetype)initWithBlock:(nonnull SDWebImageOptionsProcessorBlock)block; - (nonnull instancetype)initWithBlock:(nonnull SDWebImageOptionsProcessorBlock)block;
+ (nonnull instancetype)optionsProcessorWithBlock:(nonnull SDWebImageOptionsProcessorBlock)block; + (nonnull instancetype)optionsProcessorWithBlock:(nonnull SDWebImageOptionsProcessorBlock)block;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@end @end

View File

@ -61,6 +61,18 @@ const int64_t SDWebImageProgressUnitCountUnknown = 1LL;
setImageBlock:(nullable SDSetImageBlock)setImageBlock setImageBlock:(nullable SDSetImageBlock)setImageBlock
progress:(nullable SDImageLoaderProgressBlock)progressBlock progress:(nullable SDImageLoaderProgressBlock)progressBlock
completed:(nullable SDInternalCompletionBlock)completedBlock { completed:(nullable SDInternalCompletionBlock)completedBlock {
// Very common mistake is to send the URL using NSString object instead of NSURL. For some strange reason, Xcode won't
// throw any warning for this type mismatch. Here we failsafe this error by allowing URLs to be passed as NSString.
// if url is NSString and shouldUseWeakMemoryCache is true, [cacheKeyForURL:context] will crash. just for a global protect.
if ([url isKindOfClass:NSString.class]) {
url = [NSURL URLWithString:(NSString *)url];
}
// Prevents app crashing on argument type error like sending NSNull instead of NSURL
if (![url isKindOfClass:NSURL.class]) {
url = nil;
}
if (context) { if (context) {
// copy to avoid mutable object // copy to avoid mutable object
context = [context copy]; context = [context copy];

View File

@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>5.9.0</string> <string>5.9.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>

View File

@ -13,7 +13,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>BNDL</string> <string>BNDL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>5.9.0</string> <string>5.9.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>

View File

@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>7.0.1</string> <string>6.5.16</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>

View File

@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.3.0</string> <string>1.3.3</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>

View File

@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>3.4.1</string> <string>3.4.2</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>

View File

@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>3.7.6</string> <string>3.7.9</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>

View File

@ -4,12 +4,19 @@ ${BUILT_PRODUCTS_DIR}/BRPickerView/BRPickerView.framework
${BUILT_PRODUCTS_DIR}/CYLTabBarController/CYLTabBarController.framework ${BUILT_PRODUCTS_DIR}/CYLTabBarController/CYLTabBarController.framework
${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework ${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework
${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework ${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework
${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework
${BUILT_PRODUCTS_DIR}/GYSide/GYSide.framework ${BUILT_PRODUCTS_DIR}/GYSide/GYSide.framework
${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework ${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework
${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework ${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework
${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework ${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework
${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework ${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework
${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework ${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework
${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework ${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework
${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework ${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework ${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework
${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinSDK/AppLovinSDK.framework/AppLovinSDK

View File

@ -3,12 +3,19 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BRPickerView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CYLTabBarController.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CYLTabBarController.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FSPagerView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FSPagerView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GYSide.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GYSide.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXSegmentedView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXSegmentedView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Lottie.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Lottie.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppLovinSDK.framework

View File

@ -4,12 +4,19 @@ ${BUILT_PRODUCTS_DIR}/BRPickerView/BRPickerView.framework
${BUILT_PRODUCTS_DIR}/CYLTabBarController/CYLTabBarController.framework ${BUILT_PRODUCTS_DIR}/CYLTabBarController/CYLTabBarController.framework
${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework ${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework
${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework ${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework
${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework
${BUILT_PRODUCTS_DIR}/GYSide/GYSide.framework ${BUILT_PRODUCTS_DIR}/GYSide/GYSide.framework
${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework ${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework
${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework ${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework
${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework ${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework
${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework ${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework
${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework ${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework
${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework ${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework
${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework ${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework ${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework
${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinSDK/AppLovinSDK.framework/AppLovinSDK

View File

@ -3,12 +3,19 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BRPickerView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CYLTabBarController.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CYLTabBarController.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FSPagerView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FSPagerView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GYSide.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GYSide.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXSegmentedView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXSegmentedView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Lottie.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Lottie.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppLovinSDK.framework

View File

@ -181,15 +181,22 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/CYLTabBarController/CYLTabBarController.framework" install_framework "${BUILT_PRODUCTS_DIR}/CYLTabBarController/CYLTabBarController.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework" install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework" install_framework "${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
install_framework "${BUILT_PRODUCTS_DIR}/GYSide/GYSide.framework" install_framework "${BUILT_PRODUCTS_DIR}/GYSide/GYSide.framework"
install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework" install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework"
install_framework "${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework" install_framework "${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework" install_framework "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework" install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework"
install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework"
install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework" install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework"
install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework" install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
install_framework "${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework" install_framework "${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework"
install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinSDK/AppLovinSDK.framework"
fi fi
if [[ "$CONFIGURATION" == "Release" ]]; then if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework" install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
@ -197,15 +204,22 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/CYLTabBarController/CYLTabBarController.framework" install_framework "${BUILT_PRODUCTS_DIR}/CYLTabBarController/CYLTabBarController.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework" install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework" install_framework "${BUILT_PRODUCTS_DIR}/FSPagerView/FSPagerView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework"
install_framework "${BUILT_PRODUCTS_DIR}/GYSide/GYSide.framework" install_framework "${BUILT_PRODUCTS_DIR}/GYSide/GYSide.framework"
install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework" install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework"
install_framework "${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework" install_framework "${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework" install_framework "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework" install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework"
install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework"
install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework" install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework"
install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework" install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
install_framework "${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework" install_framework "${BUILT_PRODUCTS_DIR}/lottie-ios/Lottie.framework"
install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinSDK/AppLovinSDK.framework"
fi fi
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
wait wait

View File

@ -1,11 +1,12 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/BRPickerView" "${PODS_CONFIGURATION_BUILD_DIR}/CYLTabBarController" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView" "${PODS_CONFIGURATION_BUILD_DIR}/GYSide" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/BRPickerView" "${PODS_CONFIGURATION_BUILD_DIR}/CYLTabBarController" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/GYSide" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/Ads-Global/SDK" "${PODS_ROOT}/AppLovinDSPLinkedInAdapter/AppLovinDSPLinkedInAdapter-1.2.2.0" "${PODS_ROOT}/AppLovinMediationByteDanceAdapter/AppLovinMediationByteDanceAdapter-5.9.0.6.0" "${PODS_ROOT}/AppLovinMediationVungleAdapter/AppLovinMediationVungleAdapter-7.3.1.0" "${PODS_ROOT}/AppLovinSDK/applovin-ios-sdk-12.4.1" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalAFN" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalAPM" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalFoundation" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalGecko" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalHeader" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalNETWork" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalSDWebImage" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalYYModel" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalZFPlayer" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalZip" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_ROOT}/LinkedinAudienceNetwork" "${PODS_ROOT}/VungleAds/static" "${PODS_XCFRAMEWORKS_BUILD_DIR}/Ads-Global/BUAdSDK_Compatible" "${PODS_XCFRAMEWORKS_BUILD_DIR}/Ads-Global/BURelyAdSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics/AdIdSupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics/WithoutAdIdSupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/AdIdSupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/WithoutAdIdSupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/LinkedinAudienceNetwork" "${PODS_XCFRAMEWORKS_BUILD_DIR}/VungleAds"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/BRPickerView/BRPickerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/CYLTabBarController/CYLTabBarController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView/FSPagerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GYSide/GYSide.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView/JXSegmentedView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/BRPickerView/BRPickerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/CYLTabBarController/CYLTabBarController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView/FSPagerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GYSide/GYSide.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView/JXSegmentedView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BURelyFoundation_Global" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinDSPLinkedInAdapter/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinMediationByteDanceAdapter/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinMediationVungleAdapter/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/AFNetworking/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/APM/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Foundation/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Gecko/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Header/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/NETWork/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/SDWebImage/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/YYModel/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/ZFPlayer/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Zip/Headers" $(inherited) ${PODS_ROOT}/Firebase/CoreOnly/Sources
LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinDSPLinkedInAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinMediationByteDanceAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinMediationVungleAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/AFNetworking" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/APM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Foundation" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Gecko" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Header" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/NETWork" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/SDWebImage" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/YYModel" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/ZFPlayer" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Zip" "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "Alamofire" -framework "BRPickerView" -framework "CFNetwork" -framework "CYLTabBarController" -framework "CoreGraphics" -framework "FLAnimatedImage" -framework "FSPagerView" -framework "Foundation" -framework "GYSide" -framework "IQKeyboardManagerSwift" -framework "ImageIO" -framework "JXSegmentedView" -framework "Lottie" -framework "MJExtension" -framework "MJRefresh" -framework "QuartzCore" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SnapKit" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI" OTHER_LDFLAGS = $(inherited) -ObjC -l"BURelyFoundationGlobalAFN" -l"BURelyFoundationGlobalAPM" -l"BURelyFoundationGlobalFoundation" -l"BURelyFoundationGlobalGecko" -l"BURelyFoundationGlobalHeader" -l"BURelyFoundationGlobalNETWork" -l"BURelyFoundationGlobalSDWebImage" -l"BURelyFoundationGlobalYYModel" -l"BURelyFoundationGlobalZFPlayer" -l"BURelyFoundationGlobalZip" -l"ByteDanceAdapter" -l"LinkedInAdapter" -l"VungleAdapter" -l"bz2" -l"c++" -l"c++abi" -l"iconv" -l"resolv" -l"resolv.9" -l"sqlite3" -l"swiftCoreGraphics" -l"xml2" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AdSupport" -framework "Alamofire" -framework "AppLovinSDK" -framework "AudioToolbox" -framework "BRPickerView" -framework "BURelyAdSDK" -framework "CFNetwork" -framework "CYLTabBarController" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreMedia" -framework "CoreMotion" -framework "CoreServices" -framework "CoreTelephony" -framework "CoreText" -framework "FBLPromises" -framework "FLAnimatedImage" -framework "FSPagerView" -framework "FirebaseAnalytics" -framework "FirebaseCore" -framework "FirebaseCoreInternal" -framework "FirebaseInstallations" -framework "Foundation" -framework "GYSide" -framework "GoogleAppMeasurement" -framework "GoogleAppMeasurementIdentitySupport" -framework "GoogleUtilities" -framework "IQKeyboardManagerSwift" -framework "ImageIO" -framework "JXSegmentedView" -framework "JavaScriptCore" -framework "LinkedinAudienceNetwork" -framework "Lottie" -framework "MJExtension" -framework "MJRefresh" -framework "MediaPlayer" -framework "MessageUI" -framework "MobileCoreServices" -framework "PAGAdSDK" -framework "QuartzCore" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SafariServices" -framework "Security" -framework "SnapKit" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit" -framework "VungleAdsSDK" -framework "WebKit" -framework "_LinkedinAudienceNetworkCoreInternal" -framework "_LinkedinAudienceNetworkExperimentationInternal" -framework "_LinkedinAudienceNetworkIdentityInternal" -framework "nanopb" -weak_framework "AppTrackingTransparency" -weak_framework "Combine" -weak_framework "CoreML" -weak_framework "DeviceCheck" -weak_framework "Foundation" -weak_framework "SwiftUI" -weak_framework "UIKit" -weak_framework "WebKit"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
PODS_BUILD_DIR = ${BUILD_DIR} PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -1,11 +1,12 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/BRPickerView" "${PODS_CONFIGURATION_BUILD_DIR}/CYLTabBarController" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView" "${PODS_CONFIGURATION_BUILD_DIR}/GYSide" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/BRPickerView" "${PODS_CONFIGURATION_BUILD_DIR}/CYLTabBarController" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations" "${PODS_CONFIGURATION_BUILD_DIR}/GYSide" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/Ads-Global/SDK" "${PODS_ROOT}/AppLovinDSPLinkedInAdapter/AppLovinDSPLinkedInAdapter-1.2.2.0" "${PODS_ROOT}/AppLovinMediationByteDanceAdapter/AppLovinMediationByteDanceAdapter-5.9.0.6.0" "${PODS_ROOT}/AppLovinMediationVungleAdapter/AppLovinMediationVungleAdapter-7.3.1.0" "${PODS_ROOT}/AppLovinSDK/applovin-ios-sdk-12.4.1" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalAFN" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalAPM" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalFoundation" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalGecko" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalHeader" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalNETWork" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalSDWebImage" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalYYModel" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalZFPlayer" "${PODS_ROOT}/BURelyFoundation_Global/Frameworks/SDK/BURelyFoundationGlobalZip" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks" "${PODS_ROOT}/LinkedinAudienceNetwork" "${PODS_ROOT}/VungleAds/static" "${PODS_XCFRAMEWORKS_BUILD_DIR}/Ads-Global/BUAdSDK_Compatible" "${PODS_XCFRAMEWORKS_BUILD_DIR}/Ads-Global/BURelyAdSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics/AdIdSupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/FirebaseAnalytics/WithoutAdIdSupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/AdIdSupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/GoogleAppMeasurement/WithoutAdIdSupport" "${PODS_XCFRAMEWORKS_BUILD_DIR}/LinkedinAudienceNetwork" "${PODS_XCFRAMEWORKS_BUILD_DIR}/VungleAds"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/BRPickerView/BRPickerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/CYLTabBarController/CYLTabBarController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView/FSPagerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GYSide/GYSide.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView/JXSegmentedView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/BRPickerView/BRPickerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/CYLTabBarController/CYLTabBarController.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FSPagerView/FSPagerView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GYSide/GYSide.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JXSegmentedView/JXSegmentedView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BURelyFoundation_Global" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinDSPLinkedInAdapter/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinMediationByteDanceAdapter/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinMediationVungleAdapter/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/AFNetworking/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/APM/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Foundation/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Gecko/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Header/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/NETWork/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/SDWebImage/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/YYModel/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/ZFPlayer/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Zip/Headers" $(inherited) ${PODS_ROOT}/Firebase/CoreOnly/Sources
LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinDSPLinkedInAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinMediationByteDanceAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/AppLovinMediationVungleAdapter" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/AFNetworking" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/APM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Foundation" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Gecko" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Header" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/NETWork" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/SDWebImage" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/YYModel" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/ZFPlayer" "${PODS_XCFRAMEWORKS_BUILD_DIR}/BURelyFoundation_Global/Zip" "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -framework "Alamofire" -framework "BRPickerView" -framework "CFNetwork" -framework "CYLTabBarController" -framework "CoreGraphics" -framework "FLAnimatedImage" -framework "FSPagerView" -framework "Foundation" -framework "GYSide" -framework "IQKeyboardManagerSwift" -framework "ImageIO" -framework "JXSegmentedView" -framework "Lottie" -framework "MJExtension" -framework "MJRefresh" -framework "QuartzCore" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SnapKit" -framework "UIKit" -weak_framework "Combine" -weak_framework "SwiftUI" OTHER_LDFLAGS = $(inherited) -ObjC -l"BURelyFoundationGlobalAFN" -l"BURelyFoundationGlobalAPM" -l"BURelyFoundationGlobalFoundation" -l"BURelyFoundationGlobalGecko" -l"BURelyFoundationGlobalHeader" -l"BURelyFoundationGlobalNETWork" -l"BURelyFoundationGlobalSDWebImage" -l"BURelyFoundationGlobalYYModel" -l"BURelyFoundationGlobalZFPlayer" -l"BURelyFoundationGlobalZip" -l"ByteDanceAdapter" -l"LinkedInAdapter" -l"VungleAdapter" -l"bz2" -l"c++" -l"c++abi" -l"iconv" -l"resolv" -l"resolv.9" -l"sqlite3" -l"swiftCoreGraphics" -l"xml2" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AdSupport" -framework "Alamofire" -framework "AppLovinSDK" -framework "AudioToolbox" -framework "BRPickerView" -framework "BURelyAdSDK" -framework "CFNetwork" -framework "CYLTabBarController" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreMedia" -framework "CoreMotion" -framework "CoreServices" -framework "CoreTelephony" -framework "CoreText" -framework "FBLPromises" -framework "FLAnimatedImage" -framework "FSPagerView" -framework "FirebaseAnalytics" -framework "FirebaseCore" -framework "FirebaseCoreInternal" -framework "FirebaseInstallations" -framework "Foundation" -framework "GYSide" -framework "GoogleAppMeasurement" -framework "GoogleAppMeasurementIdentitySupport" -framework "GoogleUtilities" -framework "IQKeyboardManagerSwift" -framework "ImageIO" -framework "JXSegmentedView" -framework "JavaScriptCore" -framework "LinkedinAudienceNetwork" -framework "Lottie" -framework "MJExtension" -framework "MJRefresh" -framework "MediaPlayer" -framework "MessageUI" -framework "MobileCoreServices" -framework "PAGAdSDK" -framework "QuartzCore" -framework "SDWebImage" -framework "SVProgressHUD" -framework "SafariServices" -framework "Security" -framework "SnapKit" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit" -framework "VungleAdsSDK" -framework "WebKit" -framework "_LinkedinAudienceNetworkCoreInternal" -framework "_LinkedinAudienceNetworkExperimentationInternal" -framework "_LinkedinAudienceNetworkIdentityInternal" -framework "nanopb" -weak_framework "AppTrackingTransparency" -weak_framework "Combine" -weak_framework "CoreML" -weak_framework "DeviceCheck" -weak_framework "Foundation" -weak_framework "SwiftUI" -weak_framework "UIKit" -weak_framework "WebKit"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
PODS_BUILD_DIR = ${BUILD_DIR} PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -13,7 +13,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>BNDL</string> <string>BNDL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>5.19.0</string> <string>5.19.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>

View File

@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>5.19.0</string> <string>5.19.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>

View File

@ -10,6 +10,7 @@
47E2910BA14539535986845C /* Pods_wallpaper_project.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5FABA9F86ED5CD475E3A3424 /* Pods_wallpaper_project.framework */; }; 47E2910BA14539535986845C /* Pods_wallpaper_project.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5FABA9F86ED5CD475E3A3424 /* Pods_wallpaper_project.framework */; };
75200B6D2BA7D34F00BA65FD /* WA_limitsVCViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75200B6B2BA7D34F00BA65FD /* WA_limitsVCViewController.swift */; }; 75200B6D2BA7D34F00BA65FD /* WA_limitsVCViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75200B6B2BA7D34F00BA65FD /* WA_limitsVCViewController.swift */; };
75200B6E2BA7D34F00BA65FD /* WA_limitsVCViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 75200B6C2BA7D34F00BA65FD /* WA_limitsVCViewController.xib */; }; 75200B6E2BA7D34F00BA65FD /* WA_limitsVCViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 75200B6C2BA7D34F00BA65FD /* WA_limitsVCViewController.xib */; };
757E9AF22BD26A8000EF854A /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 757E9AF12BD26A8000EF854A /* GoogleService-Info.plist */; };
759BB0602BABE3EC001C0031 /* loanding.json in Resources */ = {isa = PBXBuildFile; fileRef = 759BB05F2BABE3EC001C0031 /* loanding.json */; }; 759BB0602BABE3EC001C0031 /* loanding.json in Resources */ = {isa = PBXBuildFile; fileRef = 759BB05F2BABE3EC001C0031 /* loanding.json */; };
759BB0622BAD35D7001C0031 /* loadProgress.json in Resources */ = {isa = PBXBuildFile; fileRef = 759BB0612BAD35D6001C0031 /* loadProgress.json */; }; 759BB0622BAD35D7001C0031 /* loadProgress.json in Resources */ = {isa = PBXBuildFile; fileRef = 759BB0612BAD35D6001C0031 /* loadProgress.json */; };
75A14D932BA1A9760091D9AD /* WA_PrivacyVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A14D912BA1A9760091D9AD /* WA_PrivacyVC.swift */; }; 75A14D932BA1A9760091D9AD /* WA_PrivacyVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A14D912BA1A9760091D9AD /* WA_PrivacyVC.swift */; };
@ -135,6 +136,7 @@
6E8D6164F3693D0725EEBE1E /* Pods-wallpaper_project.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-wallpaper_project.debug.xcconfig"; path = "Target Support Files/Pods-wallpaper_project/Pods-wallpaper_project.debug.xcconfig"; sourceTree = "<group>"; }; 6E8D6164F3693D0725EEBE1E /* Pods-wallpaper_project.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-wallpaper_project.debug.xcconfig"; path = "Target Support Files/Pods-wallpaper_project/Pods-wallpaper_project.debug.xcconfig"; sourceTree = "<group>"; };
75200B6B2BA7D34F00BA65FD /* WA_limitsVCViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WA_limitsVCViewController.swift; sourceTree = "<group>"; }; 75200B6B2BA7D34F00BA65FD /* WA_limitsVCViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WA_limitsVCViewController.swift; sourceTree = "<group>"; };
75200B6C2BA7D34F00BA65FD /* WA_limitsVCViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WA_limitsVCViewController.xib; sourceTree = "<group>"; }; 75200B6C2BA7D34F00BA65FD /* WA_limitsVCViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WA_limitsVCViewController.xib; sourceTree = "<group>"; };
757E9AF12BD26A8000EF854A /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
759BB05F2BABE3EC001C0031 /* loanding.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = loanding.json; sourceTree = "<group>"; }; 759BB05F2BABE3EC001C0031 /* loanding.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = loanding.json; sourceTree = "<group>"; };
759BB0612BAD35D6001C0031 /* loadProgress.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = loadProgress.json; sourceTree = "<group>"; }; 759BB0612BAD35D6001C0031 /* loadProgress.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = loadProgress.json; sourceTree = "<group>"; };
75A14D912BA1A9760091D9AD /* WA_PrivacyVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WA_PrivacyVC.swift; sourceTree = "<group>"; }; 75A14D912BA1A9760091D9AD /* WA_PrivacyVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WA_PrivacyVC.swift; sourceTree = "<group>"; };
@ -569,6 +571,7 @@
75E288A32BA0542F0049AB56 /* json */ = { 75E288A32BA0542F0049AB56 /* json */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
757E9AF12BD26A8000EF854A /* GoogleService-Info.plist */,
75A8F1252BB54082004B0F5C /* my_wallpaper.json */, 75A8F1252BB54082004B0F5C /* my_wallpaper.json */,
75A8F10B2BB42A32004B0F5C /* rankJson.json */, 75A8F10B2BB42A32004B0F5C /* rankJson.json */,
759BB0612BAD35D6001C0031 /* loadProgress.json */, 759BB0612BAD35D6001C0031 /* loadProgress.json */,
@ -600,7 +603,8 @@
75E288192B9EB0700049AB56 /* Sources */, 75E288192B9EB0700049AB56 /* Sources */,
75E2881A2B9EB0700049AB56 /* Frameworks */, 75E2881A2B9EB0700049AB56 /* Frameworks */,
75E2881B2B9EB0700049AB56 /* Resources */, 75E2881B2B9EB0700049AB56 /* Resources */,
361BFE77C57235A052CACEBC /* [CP] Embed Pods Frameworks */, 581B851718AAE91D8467FD71 /* [CP] Embed Pods Frameworks */,
F52E1CA348C5759A084334E9 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@ -714,6 +718,7 @@
75E2887E2B9EDDC60049AB56 /* WA_WallpaperCollectionCell.xib in Resources */, 75E2887E2B9EDDC60049AB56 /* WA_WallpaperCollectionCell.xib in Resources */,
75A8F13D2BB547A9004B0F5C /* WA_NHTypeCollectCell.xib in Resources */, 75A8F13D2BB547A9004B0F5C /* WA_NHTypeCollectCell.xib in Resources */,
75E288662B9EB2CF0049AB56 /* WA_HomeVC.xib in Resources */, 75E288662B9EB2CF0049AB56 /* WA_HomeVC.xib in Resources */,
757E9AF22BD26A8000EF854A /* GoogleService-Info.plist in Resources */,
75E288872B9EEA820049AB56 /* 4k.json in Resources */, 75E288872B9EEA820049AB56 /* 4k.json in Resources */,
75A8F0F02BB3FADF004B0F5C /* WA_HistoryCell.xib in Resources */, 75A8F0F02BB3FADF004B0F5C /* WA_HistoryCell.xib in Resources */,
75E2889D2BA034140049AB56 /* WA_LiveVideoVC.xib in Resources */, 75E2889D2BA034140049AB56 /* WA_LiveVideoVC.xib in Resources */,
@ -760,7 +765,7 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
361BFE77C57235A052CACEBC /* [CP] Embed Pods Frameworks */ = { 581B851718AAE91D8467FD71 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -799,6 +804,23 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
F52E1CA348C5759A084334E9 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-wallpaper_project/Pods-wallpaper_project-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-wallpaper_project/Pods-wallpaper_project-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-wallpaper_project/Pods-wallpaper_project-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
@ -1029,6 +1051,7 @@
LOCALIZATION_PREFERS_STRING_CATALOGS = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule; SWIFT_COMPILATION_MODE = wholemodule;
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
@ -1039,13 +1062,16 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 6E8D6164F3693D0725EEBE1E /* Pods-wallpaper_project.debug.xcconfig */; baseConfigurationReference = 6E8D6164F3693D0725EEBE1E /* Pods-wallpaper_project.debug.xcconfig */;
buildSettings = { buildSettings = {
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 6; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6HWQW9JC74; DEVELOPMENT_TEAM = 6HWQW9JC74;
ENABLE_USER_SCRIPT_SANDBOXING = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_ARCHS = "";
GCC_PREFIX_HEADER = "$(SRCROOT)/wallpaper_project/Header/WallPaperPCH.pch"; GCC_PREFIX_HEADER = "$(SRCROOT)/wallpaper_project/Header/WallPaperPCH.pch";
GCC_WARN_INHIBIT_ALL_WARNINGS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = NO;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@ -1062,7 +1088,8 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0; MARKETING_VERSION = 2.0;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.wallpapaer.hd.live.app; PRODUCT_BUNDLE_IDENTIFIER = com.wallpapaer.hd.live.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -1080,13 +1107,16 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 7CD2C49312B61AD4EA272EF7 /* Pods-wallpaper_project.release.xcconfig */; baseConfigurationReference = 7CD2C49312B61AD4EA272EF7 /* Pods-wallpaper_project.release.xcconfig */;
buildSettings = { buildSettings = {
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 6; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6HWQW9JC74; DEVELOPMENT_TEAM = 6HWQW9JC74;
ENABLE_USER_SCRIPT_SANDBOXING = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_ARCHS = "";
GCC_PREFIX_HEADER = "$(SRCROOT)/wallpaper_project/Header/WallPaperPCH.pch"; GCC_PREFIX_HEADER = "$(SRCROOT)/wallpaper_project/Header/WallPaperPCH.pch";
GCC_WARN_INHIBIT_ALL_WARNINGS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = NO;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@ -1103,7 +1133,8 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0; MARKETING_VERSION = 2.0;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.wallpapaer.hd.live.app; PRODUCT_BUNDLE_IDENTIFIER = com.wallpapaer.hd.live.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";

View File

@ -7,7 +7,25 @@
<key>wallpaper_project.xcscheme_^#shared#^_</key> <key>wallpaper_project.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>20</integer> <integer>46</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>75E2881C2B9EB0700049AB56</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>75E288322B9EB0740049AB56</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>75E2883C2B9EB0740049AB56</key>
<dict>
<key>primary</key>
<true/>
</dict> </dict>
</dict> </dict>
</dict> </dict>

View File

@ -7,12 +7,21 @@
import UIKit import UIKit
import IQKeyboardManagerSwift import IQKeyboardManagerSwift
import AppLovinSDK
import FirebaseCore
import FirebaseAnalytics
@main @main
class AppDelegate: UIResponder, UIApplicationDelegate { class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow? var window: UIWindow?
var interstitialAd: MAInterstitialAd!
var retryAttempt = 0.0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
IQKeyboardManager.shared.enable = true IQKeyboardManager.shared.enable = true
let splashViewController = WA_limitsVCViewController() let splashViewController = WA_limitsVCViewController()
// //
@ -29,7 +38,110 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// isFirstLaunch true // isFirstLaunch true
UserDefaults.standard.set(true, forKey: "isFirstLaunch") UserDefaults.standard.set(true, forKey: "isFirstLaunch")
} }
let initConfig = ALSdkInitializationConfiguration(sdkKey: "O9SUDhhvnysqkmTqrvetcbJ1wp1OHnxXF9xdpu2TmR4Ppq3w35mn3d2iy2g4OHvGWPl0EJ6D7H5FpGK5izye1A") { builder in
builder.mediationProvider = ALMediationProviderMAX
}
// Initialize the SDK with the configuration
ALSdk.shared().initialize(with: initConfig) { sdkConfig in
// Start loading ads
}
self.createInterstitialAd()
if interstitialAd.isReady {
interstitialAd.show()
}else{
print("-------广告没准备好")
}
if UserDefaults.standard.object(forKey: "issave") != nil {
// return UserDefaults.standard.bool(forKey: "issave")
issave(false)
} else {
//
issave(false)
}
if UserDefaults.standard.object(forKey: "issure") != nil {
// return UserDefaults.standard.bool(forKey: "issave")
issure(false)
} else {
//
issure(false)
}
Analytics.logEvent("goin_app", parameters: nil)
return true return true
} }
func applicationDidFinishLaunching(_ application: UIApplication) {
let initConfig = ALSdkInitializationConfiguration(sdkKey: "O9SUDhhvnysqkmTqrvetcbJ1wp1OHnxXF9xdpu2TmR4Ppq3w35mn3d2iy2g4OHvGWPl0EJ6D7H5FpGK5izye1A") { builder in
builder.mediationProvider = ALMediationProviderMAX
// Perform any additional configuration/setting changes
}
}
} }
extension AppDelegate: MAAdDelegate
{
func createInterstitialAd()
{
interstitialAd = MAInterstitialAd(adUnitIdentifier: "789b377f3ac4010e")
interstitialAd.delegate = self
// Load the first ad
interstitialAd.load()
}
// MARK: MAAdDelegate Protocol
func didLoad(_ ad: MAAd)
{
// Interstitial ad is ready to be shown. 'interstitialAd.isReady' will now return 'true'
// Reset retry attempt
retryAttempt = 0
}
func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError)
{
// Interstitial ad failed to load
// We recommend retrying with exponentially higher delays up to a maximum delay (in this case 64 seconds)
retryAttempt += 1
let delaySec = pow(2.0, min(6.0, retryAttempt))
DispatchQueue.main.asyncAfter(deadline: .now() + delaySec) {
self.interstitialAd.load()
}
}
func didDisplay(_ ad: MAAd)
{
// Pause your app's background audio
}
func didClick(_ ad: MAAd) {}
func didHide(_ ad: MAAd)
{
// Resume your app's background audio
// Interstitial ad is hidden. Pre-load the next ad
interstitialAd.load()
WA_TabbarCommon.TabBarController()
}
func didFail(toDisplay ad: MAAd, withError error: MAError)
{
// Interstitial ad failed to display. We recommend loading the next ad
interstitialAd.load()
}
}

View File

@ -12,5 +12,7 @@
#import <MJExtension.h> #import <MJExtension.h>
#import <MJRefresh.h> #import <MJRefresh.h>
#import <FLAnimatedImage.h> #import <FLAnimatedImage.h>
#import <Firebase/Firebase.h>
//#import <SCRecorder.h> //#import <SCRecorder.h>
#endif /* Wallpaper_Header_h */ #endif /* Wallpaper_Header_h */

View File

@ -6,14 +6,25 @@
// //
import UIKit import UIKit
import AppLovinSDK
import FirebaseAnalytics
class WA_NewHomeVC: WA_RootVC { class WA_NewHomeVC: WA_RootVC {
@IBOutlet weak var tableView: UITableView! @IBOutlet weak var tableView: UITableView!
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
setTableView() setTableView()
// ExampleViewController
// ExampleViewController
// addChild(exampleViewController)
// view.addSubview(exampleViewController.view)
// exampleViewController.didMove(toParent: self)
Analytics.logEvent("in_home", parameters: nil)
} }
func setTableView(){ func setTableView(){
@ -30,8 +41,11 @@ class WA_NewHomeVC: WA_RootVC {
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
navigationController?.navigationBar.isHidden = true navigationController?.navigationBar.isHidden = true
} }
} }
extension WA_NewHomeVC:UITableViewDelegate,UITableViewDataSource{ extension WA_NewHomeVC:UITableViewDelegate,UITableViewDataSource{
@ -95,3 +109,5 @@ extension UIApplication {
return base return base
} }
} }

View File

@ -9,6 +9,7 @@ import UIKit
import JXSegmentedView import JXSegmentedView
import MJExtension import MJExtension
import MJRefresh import MJRefresh
import FirebaseAnalytics
class WA_4KVC: WA_RootVC { class WA_4KVC: WA_RootVC {
@ -36,7 +37,7 @@ class WA_4KVC: WA_RootVC {
var type:Int = 0 var type:Int = 0
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
Analytics.logEvent("in_4k", parameters: nil)
self.view.backgroundColor = .white self.view.backgroundColor = .white
setCollectionView() setCollectionView()

View File

@ -9,6 +9,8 @@ import UIKit
import SDWebImage import SDWebImage
import Photos import Photos
import SVProgressHUD import SVProgressHUD
import AppLovinSDK
import FirebaseAnalytics
class WA_DetailsVC: WA_RootVC { class WA_DetailsVC: WA_RootVC {
@ -32,6 +34,9 @@ class WA_DetailsVC: WA_RootVC {
var type:Int = 0 var type:Int = 0
var interstitialAd: MAInterstitialAd!
var retryAttempt = 0.0
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
if type == 1{ if type == 1{
@ -41,7 +46,7 @@ class WA_DetailsVC: WA_RootVC {
let imageURL = URL(string: modeltype.source ?? "") let imageURL = URL(string: modeltype.source ?? "")
preimageV.sd_setImage(with: imageURL, placeholderImage: UIImage(named: "Rectangle")) preimageV.sd_setImage(with: imageURL, placeholderImage: UIImage(named: "Rectangle"))
} }
Analytics.logEvent("in_Details", parameters: nil)
setBtn.layer.cornerRadius = 10 setBtn.layer.cornerRadius = 10
@ -84,14 +89,39 @@ class WA_DetailsVC: WA_RootVC {
@IBAction func setting(_ sender: Any) { @IBAction func setting(_ sender: Any) {
Analytics.logEvent("touch_savephoto", parameters: nil)
self.activityView.startAnimating() self.activityView.startAnimating()
saveImageToPhotoLibrary() saveImageToPhotoLibrary()
if interstitialAd.isReady {
interstitialAd.show()
Analytics.logEvent("details_load_success", parameters: nil)
}else{
print("-------广告没准备好")
Analytics.logEvent("details_load_fail", parameters: nil)
}
} }
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
navigationController?.navigationBar.isHidden = true navigationController?.navigationBar.isHidden = true
self.createInterstitialAd()
if UserDefaults.standard.object(forKey: "issave") != nil {
// return UserDefaults.standard.bool(forKey: "issave")
issave(true)
} else {
//
if interstitialAd.isReady {
interstitialAd.show()
}else{
print("-------广告没准备好")
}
issave(true)
}
} }
func saveImageToPhotoLibrary() { func saveImageToPhotoLibrary() {
@ -133,32 +163,11 @@ class WA_DetailsVC: WA_RootVC {
}) { success, error in }) { success, error in
if success { if success {
print("图片保存成功") print("图片保存成功")
// DispatchQueue.main.asyncAfter(deadline: .now() + 0){ // DispatchQueue.main.asyncAfter(deadline: .now() + 0){
// self.activityView.stopAnimating() // self.activityView.stopAnimating()
// } // }
DispatchQueue.global().asyncAfter(deadline: .now() + 1.5) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0){
self.activityView.stopAnimating()
// self.view.makeToast("Save Success", duration: 1.5, position: .center)
// UIAlertController
let alertController = UIAlertController(title: "Successfully saved", message: "Do you need to set up a tutorial", preferredStyle: .alert)
//
alertController.addAction(UIAlertAction(title: "cancel", style: .cancel, handler: nil))
//
alertController.addAction(UIAlertAction(title: "Need", style: .default, handler: { action in
//
// print("")
let vc = WA_TipVC()
self.present(vc, animated: true)
}))
// present
self.present(alertController, animated: true, completion: nil)
}
}
} else if let error = error { } else if let error = error {
@ -173,6 +182,7 @@ class WA_DetailsVC: WA_RootVC {
@IBAction func collectBtn(_ sender: Any) { @IBAction func collectBtn(_ sender: Any) {
Analytics.logEvent("touch_collect", parameters: nil)
if isLoggedIn(){ if isLoggedIn(){
if type == 1{ if type == 1{
let model1 = WA_3DModel() let model1 = WA_3DModel()
@ -208,6 +218,7 @@ class WA_DetailsVC: WA_RootVC {
@IBAction func previewBtn(_ sender: Any) { @IBAction func previewBtn(_ sender: Any) {
Analytics.logEvent("touch_preview", parameters: nil)
UIView.animate(withDuration: 0.5, animations: { UIView.animate(withDuration: 0.5, animations: {
self.bgView.frame.origin.y += 0 self.bgView.frame.origin.y += 0
self.bgView.alpha = 0 self.bgView.alpha = 0
@ -272,6 +283,7 @@ class WA_DetailsVC: WA_RootVC {
@IBAction func shareBtn(_ sender: Any) { @IBAction func shareBtn(_ sender: Any) {
Analytics.logEvent("touch_share", parameters: nil)
self.activityView.startAnimating() self.activityView.startAnimating()
@ -318,3 +330,81 @@ class WA_DetailsVC: WA_RootVC {
} }
} }
extension WA_DetailsVC: MAAdDelegate
{
func createInterstitialAd()
{
interstitialAd = MAInterstitialAd(adUnitIdentifier: "880a042774979c3c")
interstitialAd.delegate = self
// Load the first ad
interstitialAd.load()
}
// MARK: MAAdDelegate Protocol
func didLoad(_ ad: MAAd)
{
// Interstitial ad is ready to be shown. 'interstitialAd.isReady' will now return 'true'
// Reset retry attempt
retryAttempt = 0
}
func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError)
{
// Interstitial ad failed to load
// We recommend retrying with exponentially higher delays up to a maximum delay (in this case 64 seconds)
retryAttempt += 1
let delaySec = pow(2.0, min(6.0, retryAttempt))
DispatchQueue.main.asyncAfter(deadline: .now() + delaySec) {
self.interstitialAd.load()
}
}
func didDisplay(_ ad: MAAd)
{
// Pause your app's background audio
}
func didClick(_ ad: MAAd) {}
func didHide(_ ad: MAAd)
{
// Resume your app's background audio
// Interstitial ad is hidden. Pre-load the next ad
interstitialAd.load()
DispatchQueue.global().asyncAfter(deadline: .now() + 1.5) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0){
self.activityView.stopAnimating()
// self.view.makeToast("Save Success", duration: 1.5, position: .center)
// UIAlertController
let alertController = UIAlertController(title: "Successfully saved", message: "Do you need to set up a tutorial", preferredStyle: .alert)
//
alertController.addAction(UIAlertAction(title: "cancel", style: .cancel, handler: nil))
//
alertController.addAction(UIAlertAction(title: "Need", style: .default, handler: { action in
//
// print("")
let vc = WA_TipVC()
self.present(vc, animated: true)
}))
// present
self.present(alertController, animated: true, completion: nil)
}
}
}
func didFail(toDisplay ad: MAAd, withError error: MAError)
{
// Interstitial ad failed to display. We recommend loading the next ad
interstitialAd.load()
}
}

View File

@ -8,6 +8,8 @@
import UIKit import UIKit
import JXSegmentedView import JXSegmentedView
import MJRefresh import MJRefresh
import FirebaseAnalytics
class WA_LIVEVC: WA_RootVC { class WA_LIVEVC: WA_RootVC {
@ -33,7 +35,7 @@ class WA_LIVEVC: WA_RootVC {
self.view.backgroundColor = .white self.view.backgroundColor = .white
setCollectionView() setCollectionView()
Analytics.logEvent("in_live", parameters: nil)
setRefresh() setRefresh()
} }

View File

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>ALSdkInitializationConfiguration</key>
<string>O9SUDhhvnysqkmTqrvetcbJ1wp1OHnxXF9xdpu2TmR4Ppq3w35mn3d2iy2g4OHvGWPl0EJ6D7H5FpGK5izye1A</string>
<key>NSAppTransportSecurity</key> <key>NSAppTransportSecurity</key>
<dict> <dict>
<key>NSAllowsArbitraryLoads</key> <key>NSAllowsArbitraryLoads</key>

View File

@ -6,6 +6,7 @@
// //
import UIKit import UIKit
import FirebaseAnalytics
class WA_RootVC: UIViewController { class WA_RootVC: UIViewController {

View File

@ -9,6 +9,8 @@ import UIKit
import SVProgressHUD import SVProgressHUD
import Photos import Photos
import Alamofire import Alamofire
import AppLovinSDK
import FirebaseAnalytics
class WA_limitsVCViewController: WA_RootVC { class WA_limitsVCViewController: WA_RootVC {
@IBOutlet weak var retryBtn: UIButton! @IBOutlet weak var retryBtn: UIButton!
@ -16,23 +18,33 @@ class WA_limitsVCViewController: WA_RootVC {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
// 广
activityView.center = CGPoint(x: self.view.center.x, y: self.view.center.y - kSafeArea_Top - 44)
// // activityView.center = CGPoint(x: self.view.center.x, y: self.view.center.y - kSafeArea_Top - 44)
activityView.hidesWhenStopped = true // //
activityView.color = .black // activityView.hidesWhenStopped = true
activityView.style = UIActivityIndicatorView.Style.whiteLarge // activityView.color = .black
self.view.addSubview(activityView) // activityView.style = UIActivityIndicatorView.Style.whiteLarge
self.activityView.startAnimating() // self.view.addSubview(activityView)
// self.activityView.startAnimating()
requestPhotoLibraryPermission() requestPhotoLibraryPermission()
setNetwork()
checkNetworkPermission() checkNetworkPermission()
// 广
// createInterstitialAd()
DispatchQueue.global().asyncAfter(deadline: .now() + 8) {
self.setNetwork()
}
} }
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
self.retryBtn.isHidden = true self.retryBtn.isHidden = true
} }
func requestPhotoLibraryPermission() { func requestPhotoLibraryPermission() {
// //
@ -65,6 +77,8 @@ class WA_limitsVCViewController: WA_RootVC {
} }
} }
func setNetwork(){ func setNetwork(){
// URL // URL
if let url = URL(string: "https://www.baidu.com/") { if let url = URL(string: "https://www.baidu.com/") {
@ -76,7 +90,7 @@ class WA_limitsVCViewController: WA_RootVC {
if let error = error { if let error = error {
print("网络请求出错:\(error)") print("网络请求出错:\(error)")
DispatchQueue.main.asyncAfter(deadline: .now()){ DispatchQueue.main.asyncAfter(deadline: .now()){
self.activityView.stopAnimating() // self.activityView.stopAnimating()
SVProgressHUD.showInfo(withStatus: "Network connection failed, please try again") SVProgressHUD.showInfo(withStatus: "Network connection failed, please try again")
self.retryBtn.isHidden = false self.retryBtn.isHidden = false
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
@ -85,10 +99,22 @@ class WA_limitsVCViewController: WA_RootVC {
} }
} }
} else if let data = data { } else if let data = data {
DispatchQueue.main.asyncAfter(deadline: .now()){ if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
self.navigateToMainScreen() // appDelegate.showInterstitialAd()
// 广广
if appDelegate.interstitialAd.isReady {
appDelegate.interstitialAd.show()
Analytics.logEvent("open_load_success", parameters: nil)
}else{
print("-------广告没准备好")
Analytics.logEvent("open_load_fail", parameters: nil)
self.retryBtn.isHidden = false
} }
} }
}
} }
// //
@ -142,17 +168,17 @@ class WA_limitsVCViewController: WA_RootVC {
NetworkReachabilityManager.default?.stopListening() NetworkReachabilityManager.default?.stopListening()
} }
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
@IBAction func btnRetry(_ sender: Any) { @IBAction func btnRetry(_ sender: Any) {
self.activityView.startAnimating()
setNetwork() setNetwork()
} }
private func navigateToMainScreen() {
WA_TabbarCommon.TabBarController()
}
} }

View File

@ -20,6 +20,9 @@
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/> <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch" translatesAutoresizingMaskIntoConstraints="NO" id="zAy-zX-8PM">
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
</imageView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="l04-6w-5cC"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="l04-6w-5cC">
<rect key="frame" x="156.66666666666666" y="386" width="80" height="40"/> <rect key="frame" x="156.66666666666666" y="386" width="80" height="40"/>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@ -40,6 +43,10 @@
<viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/> <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints> <constraints>
<constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="zAy-zX-8PM" secondAttribute="trailing" id="4vr-US-v6t"/>
<constraint firstItem="zAy-zX-8PM" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="Wu4-GZ-YcJ"/>
<constraint firstAttribute="bottom" secondItem="zAy-zX-8PM" secondAttribute="bottom" id="X0M-gw-2Hy"/>
<constraint firstItem="zAy-zX-8PM" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="ka0-Np-haP"/>
<constraint firstItem="l04-6w-5cC" firstAttribute="centerY" secondItem="i5M-Pr-FkT" secondAttribute="centerY" constant="-20" id="lWG-ER-6ZY"/> <constraint firstItem="l04-6w-5cC" firstAttribute="centerY" secondItem="i5M-Pr-FkT" secondAttribute="centerY" constant="-20" id="lWG-ER-6ZY"/>
<constraint firstItem="l04-6w-5cC" firstAttribute="centerX" secondItem="i5M-Pr-FkT" secondAttribute="centerX" id="yG5-dN-49T"/> <constraint firstItem="l04-6w-5cC" firstAttribute="centerX" secondItem="i5M-Pr-FkT" secondAttribute="centerX" id="yG5-dN-49T"/>
</constraints> </constraints>
@ -47,6 +54,7 @@
</view> </view>
</objects> </objects>
<resources> <resources>
<image name="launch" width="1125" height="2436"/>
<systemColor name="systemBackgroundColor"> <systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor> </systemColor>

View File

@ -7,6 +7,9 @@
import UIKit import UIKit
import SVProgressHUD import SVProgressHUD
import AppLovinSDK
import FirebaseAnalytics
import FirebaseCore
class WA_AddVC: WA_RootVC,UITextViewDelegate { class WA_AddVC: WA_RootVC,UITextViewDelegate {
@IBOutlet weak var contentImageV: UIImageView! @IBOutlet weak var contentImageV: UIImageView!
@ -19,8 +22,12 @@ class WA_AddVC: WA_RootVC,UITextViewDelegate {
let activityView = UIActivityIndicatorView() let activityView = UIActivityIndicatorView()
var interstitialAd: MAInterstitialAd!
var retryAttempt = 0.0
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
Analytics.logEvent("in_release", parameters: nil)
contenttextV.layer.cornerRadius = 5 contenttextV.layer.cornerRadius = 5
contenttextV.layer.borderColor = UIColor.black.cgColor contenttextV.layer.borderColor = UIColor.black.cgColor
contenttextV.layer.borderWidth = 1 contenttextV.layer.borderWidth = 1
@ -50,6 +57,25 @@ class WA_AddVC: WA_RootVC,UITextViewDelegate {
placeholderLabel.isHidden = !textView.text.isEmpty placeholderLabel.isHidden = !textView.text.isEmpty
} }
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.createInterstitialAd()
if UserDefaults.standard.object(forKey: "issure") != nil {
// return UserDefaults.standard.bool(forKey: "issave")
issure(true)
} else {
//
if interstitialAd.isReady {
interstitialAd.show()
}else{
print("-------广告没准备好")
}
issave(true)
}
}
@IBAction func backBtn(_ sender: Any) { @IBAction func backBtn(_ sender: Any) {
self.dismiss(animated: true) self.dismiss(animated: true)
} }
@ -68,6 +94,7 @@ class WA_AddVC: WA_RootVC,UITextViewDelegate {
@IBAction func sureBtn(_ sender: Any) { @IBAction func sureBtn(_ sender: Any) {
if self.contenttextV.text.count <= 0 { if self.contenttextV.text.count <= 0 {
SVProgressHUD.showInfo(withStatus: "Please enter your recommendation reason") SVProgressHUD.showInfo(withStatus: "Please enter your recommendation reason")
DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) { DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) {
@ -86,12 +113,15 @@ class WA_AddVC: WA_RootVC,UITextViewDelegate {
self.activityView.stopAnimating() self.activityView.stopAnimating()
self.dismiss(animated: true) self.dismiss(animated: true)
} }
SVProgressHUD.showInfo(withStatus: "Successfully published, waiting for review")
DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
SVProgressHUD.dismiss()
self.createInterstitialAd()
if self.interstitialAd.isReady {
self.interstitialAd.show()
Analytics.logEvent("release_load_success", parameters: nil)
}else{
print("-------广告没准备好")
Analytics.logEvent("release_load_fail", parameters: nil)
} }
} }
} }
@ -134,3 +164,63 @@ extension WA_AddVC: UIImagePickerControllerDelegate & UINavigationControllerDele
picker.dismiss(animated: true, completion: nil) picker.dismiss(animated: true, completion: nil)
} }
} }
extension WA_AddVC: MAAdDelegate
{
func createInterstitialAd()
{
interstitialAd = MAInterstitialAd(adUnitIdentifier: "8e1bc1f22c8d6c9d")
interstitialAd.delegate = self
// Load the first ad
interstitialAd.load()
}
// MARK: MAAdDelegate Protocol
func didLoad(_ ad: MAAd)
{
// Interstitial ad is ready to be shown. 'interstitialAd.isReady' will now return 'true'
// Reset retry attempt
retryAttempt = 0
}
func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError)
{
// Interstitial ad failed to load
// We recommend retrying with exponentially higher delays up to a maximum delay (in this case 64 seconds)
retryAttempt += 1
let delaySec = pow(2.0, min(6.0, retryAttempt))
DispatchQueue.main.asyncAfter(deadline: .now() + delaySec) {
self.interstitialAd.load()
}
}
func didDisplay(_ ad: MAAd)
{
// Pause your app's background audio
}
func didClick(_ ad: MAAd) {}
func didHide(_ ad: MAAd)
{
// Resume your app's background audio
// Interstitial ad is hidden. Pre-load the next ad
interstitialAd.load()
SVProgressHUD.showInfo(withStatus: "Successfully published, waiting for review")
DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
SVProgressHUD.dismiss()
}
}
func didFail(toDisplay ad: MAAd, withError error: MAError)
{
// Interstitial ad failed to display. We recommend loading the next ad
interstitialAd.load()
}
}

View File

@ -6,6 +6,8 @@
// //
import UIKit import UIKit
import FirebaseAnalytics
import FirebaseCore
class WA_RankingVC: WA_RootVC { class WA_RankingVC: WA_RootVC {
@IBOutlet weak var tableView: UITableView! @IBOutlet weak var tableView: UITableView!
@ -41,6 +43,7 @@ class WA_RankingVC: WA_RootVC {
@IBAction func addBtn(_ sender: Any) { @IBAction func addBtn(_ sender: Any) {
Analytics.logEvent("goin_release", parameters: nil)
if isLoggedIn(){ if isLoggedIn(){
let vc = WA_AddVC() let vc = WA_AddVC()
vc.modalPresentationStyle = .fullScreen vc.modalPresentationStyle = .fullScreen

View File

@ -243,3 +243,10 @@ func isLoggedIn() -> Bool {
return false return false
} }
} }
func issave(_ value: Bool) {
UserDefaults.standard.set(value, forKey: "issave")
}
func issure(_ value: Bool) {
UserDefaults.standard.set(value, forKey: "issure")
}