接入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

@ -4,31 +4,38 @@
target 'wallpaper_project' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for wallpaper_project
pod 'SnapKit'
#pod 'AFNetworking'
pod 'SDWebImage'
pod 'IQKeyboardManagerSwift'
pod 'BRPickerView'
pod 'Alamofire'
pod 'FSPagerView'
pod 'SVProgressHUD'
pod 'CYLTabBarController'
pod 'GYSide'
pod 'JXSegmentedView'
pod 'MJExtension'
pod 'MJRefresh'
pod 'FLAnimatedImage'
pod 'lottie-ios'
post_install do |installer|
pod 'SnapKit'
#pod 'AFNetworking'
pod 'SDWebImage'
pod 'IQKeyboardManagerSwift'
pod 'BRPickerView'
pod 'Alamofire'
pod 'FSPagerView'
pod 'SVProgressHUD'
pod 'CYLTabBarController'
pod 'GYSide'
pod 'JXSegmentedView'
pod 'MJExtension'
pod 'MJRefresh'
pod 'FLAnimatedImage'
pod 'lottie-ios'
pod 'AppLovinSDK'
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|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
end
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
end
end
end
end
end
end

View File

@ -1,5 +1,21 @@
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/AddressPickerView (= 2.8.1)
- BRPickerView/Base (= 2.8.1)
@ -12,29 +28,165 @@ PODS:
- BRPickerView/Base
- BRPickerView/StringPickerView (2.8.1):
- 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/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)
- 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)
- IQKeyboardManagerSwift (7.0.1)
- JXSegmentedView (1.3.0)
- IQKeyboardManagerSwift (6.5.16)
- JXSegmentedView (1.3.3)
- LinkedinAudienceNetwork (1.2.2)
- lottie-ios (4.4.1)
- MJExtension (3.4.1)
- MJRefresh (3.7.6)
- SDWebImage (5.19.0):
- SDWebImage/Core (= 5.19.0)
- SDWebImage/Core (5.19.0)
- MJExtension (3.4.2)
- MJRefresh (3.7.9)
- nanopb (2.30910.0):
- nanopb/decode (= 2.30910.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)
- SVProgressHUD (2.3.1):
- SVProgressHUD/Core (= 2.3.1)
- SVProgressHUD/Core (2.3.1)
- VungleAds (7.3.1)
DEPENDENCIES:
- Alamofire
- AppLovinDSPLinkedInAdapter
- AppLovinMediationByteDanceAdapter
- AppLovinMediationVungleAdapter
- AppLovinSDK
- BRPickerView
- CYLTabBarController
- Firebase/AnalyticsWithoutAdIdSupport
- Firebase/Core
- FLAnimatedImage
- FSPagerView
- GYSide
@ -49,37 +201,71 @@ DEPENDENCIES:
SPEC REPOS:
trunk:
- Ads-Global
- Alamofire
- AppLovinDSPLinkedInAdapter
- AppLovinMediationByteDanceAdapter
- AppLovinMediationVungleAdapter
- AppLovinSDK
- BRPickerView
- BURelyFoundation_Global
- CYLTabBarController
- Firebase
- FirebaseAnalytics
- FirebaseCore
- FirebaseCoreInternal
- FirebaseInstallations
- FLAnimatedImage
- FSPagerView
- GoogleAppMeasurement
- GoogleUtilities
- GYSide
- IQKeyboardManagerSwift
- JXSegmentedView
- LinkedinAudienceNetwork
- lottie-ios
- MJExtension
- MJRefresh
- nanopb
- PromisesObjC
- SDWebImage
- SnapKit
- SVProgressHUD
- VungleAds
SPEC CHECKSUMS:
Alamofire: 02b772c9910e8eba1a079227c32fbd9e46c90a24
Ads-Global: 3ed9f8c6f11d4d6a4496e1dd74a4537f10b41b65
Alamofire: f36a35757af4587d8e4f4bfa223ad10be2422b8c
AppLovinDSPLinkedInAdapter: 093f25d472b4073f8203fa72a68347cbd589e232
AppLovinMediationByteDanceAdapter: d902ba6e2a6c0061bf2675ec74428b37620b59ca
AppLovinMediationVungleAdapter: b42444550ca03233753cfeb36a5660f94d038fb5
AppLovinSDK: c57ad0d34625c971d2db127f8ef60570b28ff51a
BRPickerView: 2531a2d4d0fea0b57a1c738de215af0f88863a2f
BURelyFoundation_Global: 17ed9cd58d138feefd8c0711dd3294766adcb28e
CYLTabBarController: db44b5901a28693a8a4279e4721b3aafdd36c178
Firebase: 91fefd38712feb9186ea8996af6cbdef41473442
FirebaseAnalytics: b5efc493eb0f40ec560b04a472e3e1a15d39ca13
FirebaseCore: 11dc8a16dfb7c5e3c3f45ba0e191a33ac4f50894
FirebaseCoreInternal: bcb5acffd4ea05e12a783ecf835f2210ce3dc6af
FirebaseInstallations: 8f581fca6478a50705d2bd2abd66d306e0f5736e
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
FSPagerView: 670405b2f18e2a87fa37f20b00de783e562c25a8
GoogleAppMeasurement: f3abf08495ef2cba7829f15318c373b8d9226491
GoogleUtilities: d053d902a8edaa9904e1bd00c37535385b8ed152
GYSide: 672895491bf7a809f0631dd8a122ab5d1d601aae
IQKeyboardManagerSwift: 7f6b1b1d1497855d2beea7f2f10ffcc6978525b1
JXSegmentedView: fec0d335355b6e019c494fe2e030bde8a36d2df6
IQKeyboardManagerSwift: 12d89768845bb77b55cc092ecc2b1f9370f06b76
JXSegmentedView: 651b60fcf705258ba9395edd53876dbd2853fb68
LinkedinAudienceNetwork: de299f32547bd528916b3c9f113015f74347398c
lottie-ios: e047b1d2e6239b787cc5e9755b988869cf190494
MJExtension: 21c5f6f8c4d5d8844b7ae8fbae08fed0b501f961
MJRefresh: 2fe7fb43a5167ceda20bb7e63f130c04fd1814a5
SDWebImage: 981fd7e860af070920f249fd092420006014c3eb
MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
nanopb: 438bc412db1928dac798aa6fd75726007be04262
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
SDWebImage: 40b0b4053e36c660a764958bff99eed16610acbb
SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22
VungleAds: 04a17ab51fb61f41cd6d666fd0024509005740fe
PODFILE CHECKSUM: 8919f964b95c5ac6e11bc2a3a3200b4dd02b3b9c
PODFILE CHECKSUM: e5237cccfc6fa11c317ad1e1cbd81ea18c1f4a05
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
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.
public enum AFInfo {
/// 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
/// An order-preserving and case-insensitive representation of HTTP headers.
public struct HTTPHeaders {
public struct HTTPHeaders: Equatable, Hashable, Sendable {
private var headers: [HTTPHeader] = []
/// Creates an empty instance.
@ -185,7 +185,7 @@ extension HTTPHeaders: CustomStringConvertible {
// MARK: - HTTPHeader
/// 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.
public let name: String

View File

@ -26,7 +26,7 @@
/// `HTTPMethod.get != HTTPMethod(rawValue: "get")`.
///
/// 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.
public static let connect = HTTPMethod(rawValue: "CONNECT")
/// `DELETE` method.

View File

@ -1,7 +1,7 @@
//
// IQKeyboardManagerConstants.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-20 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
@ -23,11 +23,11 @@
import Foundation
// MARK: IQAutoToolbarManageBehavior
// MARK: IQAutoToolbarManageBehaviour
/**
`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`
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.
*/
@available(iOSApplicationExtension, unavailable)
@objc public enum IQAutoToolbarManageBehavior: Int {
@objc public enum IQAutoToolbarManageBehaviour: Int {
case bySubviews
case byTag
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.
`IQPreviousNextDisplayModeAlwaysShow`
Always show nextPrevious buttons,
if there are more than 1 textField then both buttons will be visible but will be shown as disabled.
Always show nextPrevious buttons, if there are more than 1 textField then both buttons will be visible but will be shown as disabled.
*/
@available(iOSApplicationExtension, unavailable)
@objc public enum IQPreviousNextDisplayMode: Int {

View File

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

View File

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

View File

@ -1,7 +1,7 @@
//
// IQBarButtonItem.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-20 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// 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
// THE SOFTWARE.
// import Foundation - UIKit contains Foundation
import UIKit
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc open class IQBarButtonItem: UIBarButtonItem {
internal static let flexibleBarButtonItem: IQBarButtonItem = IQBarButtonItem(barButtonSystemItem: .flexibleSpace,
target: nil, action: nil)
@objc public override init() {
super.init()
initialize()
@ -59,10 +56,10 @@ import UIKit
@objc override open var tintColor: UIColor? {
didSet {
var textAttributes: [NSAttributedString.Key: Any] = [:]
var textAttributes = [NSAttributedString.Key: Any]()
textAttributes[.foregroundColor] = tintColor
if let attributes: [NSAttributedString.Key: Any] = titleTextAttributes(for: .normal) {
if let attributes = titleTextAttributes(for: .normal) {
for (key, value) in attributes {
textAttributes[key] = value
}
@ -73,22 +70,18 @@ import UIKit
}
/**
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
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
*/
internal var isSystemItem: Bool = false
@objc internal var isSystemItem = false
/**
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.
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.
@param target Target object.
@param action Target 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)
} else {
invocation = nil
@ -96,8 +89,7 @@ import UIKit
}
/**
Customized Invocation to be called when button is pressed.
invocation is internally created using setTarget:action: method.
Customized Invocation to be called when button is pressed. invocation is internally created using setTarget:action: method.
*/
@objc open var invocation: IQInvocation? {
didSet {

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
//
// IQUIView+IQKeyboardToolbar.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-20 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
@ -23,46 +23,138 @@
import UIKit
/**
IQBarButtonItemConfiguration for creating toolbar with bar button items
*/
@available(iOSApplicationExtension, unavailable)
@MainActor
private struct AssociatedKeys {
static var toolbar: Int = 0
static var hidePlaceholder: Int = 0
static var placeholder: Int = 0
@objc public final class IQBarButtonItemConfiguration: NSObject {
@objc public init(barButtonSystemItem: UIBarButtonItem.SystemItem, action: Selector) {
self.barButtonSystemItem = barButtonSystemItem
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)
@MainActor
public extension IQKeyboardManagerWrapper where Base: UIView {
@objc public extension UIImage {
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
/**
IQToolbar references for better customization control.
*/
var toolbar: IQToolbar {
var toolbar: IQToolbar? = base.inputAccessoryView as? IQToolbar
var keyboardToolbar: IQToolbar {
var toolbar = inputAccessoryView as? IQToolbar
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
} else {
let width: CGFloat
var width: CGFloat = 0
if #available(iOS 13.0, *) {
width = base.window?.windowScene?.screen.bounds.width ?? 0
width = window?.windowScene?.screen.bounds.width ?? .zero
} else {
width = UIScreen.main.bounds.width
}
let frame = CGRect(origin: .zero, size: .init(width: width, height: 44))
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
}
@ -71,43 +163,41 @@ public extension IQKeyboardManagerWrapper where Base: UIView {
// MARK: Toolbar title
/**
If `hideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO.
*/
var hidePlaceholder: Bool {
If `shouldHideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO.
*/
var shouldHideToolbarPlaceholder: Bool {
get {
return objc_getAssociatedObject(base, &AssociatedKeys.hidePlaceholder) as? Bool ?? false
return objc_getAssociatedObject(self, &AssociatedKeys.shouldHideToolbarPlaceholder) as? Bool ?? false
}
set(newValue) {
objc_setAssociatedObject(base, &AssociatedKeys.hidePlaceholder,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
toolbar.titleBarButton.title = drawingPlaceholder
objc_setAssociatedObject(self, &AssociatedKeys.shouldHideToolbarPlaceholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder
}
}
/**
`toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar.
*/
var placeholder: String? {
var toolbarPlaceholder: String? {
get {
return objc_getAssociatedObject(base, &AssociatedKeys.placeholder) as? String
return objc_getAssociatedObject(self, &AssociatedKeys.toolbarPlaceholder) as? String
}
set(newValue) {
objc_setAssociatedObject(base, &AssociatedKeys.placeholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
toolbar.titleBarButton.title = drawingPlaceholder
objc_setAssociatedObject(self, &AssociatedKeys.toolbarPlaceholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder
}
}
/**
`drawingToolbarPlaceholder` will be actual text used to draw on toolbar.
This would either `placeholder` or `toolbarPlaceholder`.
`drawingToolbarPlaceholder` will be actual text used to draw on toolbar. This would either `placeholder` or `toolbarPlaceholder`.
*/
var drawingPlaceholder: String? {
var drawingToolbarPlaceholder: String? {
if hidePlaceholder {
if self.shouldHideToolbarPlaceholder {
return nil
} else if placeholder?.isEmpty == false {
return placeholder
} else if let placeholderable: IQPlaceholderable = base as? IQPlaceholderable {
} else if self.toolbarPlaceholder?.isEmpty == false {
return self.toolbarPlaceholder
} else if let placeholderable: IQPlaceholderable = self as? IQPlaceholderable {
if let placeholder = placeholderable.attributedPlaceholder?.string,
!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
// swiftlint:disable cyclomatic_complexity
// swiftlint:disable function_body_length
func addToolbar(target: AnyObject?,
previousConfiguration: IQBarButtonItemConfiguration? = nil,
nextConfiguration: IQBarButtonItemConfiguration? = nil,
rightConfiguration: IQBarButtonItemConfiguration? = nil,
title: String?,
titleAccessibilityLabel: String? = nil) {
func addKeyboardToolbarWithTarget(target: AnyObject?,
titleText: String?,
titleAccessibilityLabel: String? = nil,
rightBarButtonConfiguration: IQBarButtonItemConfiguration?,
previousBarButtonConfiguration: IQBarButtonItemConfiguration? = nil,
nextBarButtonConfiguration: IQBarButtonItemConfiguration? = nil) {
// 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
let toolbar: IQToolbar = toolbar
let toolbar = self.keyboardToolbar
var items: [UIBarButtonItem] = []
var items: [IQBarButtonItem] = []
if let previousConfiguration: IQBarButtonItemConfiguration = previousConfiguration {
if let prevConfig = previousBarButtonConfiguration {
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
}
let prev: IQBarButtonItem = previousConfiguration.apply(on: toolbar.previousBarButton, target: target)
toolbar.previousBarButton = prev
items.append(prev)
}
if previousConfiguration != nil, nextConfiguration != nil {
if previousBarButtonConfiguration != nil, nextBarButtonConfiguration != nil {
items.append(toolbar.fixedSpaceBarButton)
}
if let nextConfiguration: IQBarButtonItemConfiguration = nextConfiguration {
if let nextConfig = nextBarButtonConfiguration {
var next = toolbar.nextBarButton
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)
}
next.invocation = toolbar.nextBarButton.invocation
next.accessibilityLabel = nextConfig.accessibilityLabel
next.accessibilityIdentifier = next.accessibilityLabel
next.isEnabled = toolbar.nextBarButton.isEnabled
next.tag = toolbar.nextBarButton.tag
toolbar.nextBarButton = next
}
let next: IQBarButtonItem = nextConfiguration.apply(on: toolbar.nextBarButton, target: target)
toolbar.nextBarButton = next
items.append(next)
}
if !toolbar.additionalLeadingItems.isEmpty {
items.append(contentsOf: toolbar.additionalLeadingItems)
}
// Title bar button item
do {
// Flexible space
items.append(IQBarButtonItem.flexibleBarButtonItem)
items.append(UIView.flexibleBarButtonItem())
// Title button
toolbar.titleBarButton.title = title
toolbar.titleBarButton.title = titleText
toolbar.titleBarButton.accessibilityLabel = titleAccessibilityLabel
toolbar.titleBarButton.accessibilityIdentifier = titleAccessibilityLabel
toolbar.titleBarButton.customView?.frame = .zero
toolbar.titleBarButton.customView?.frame = CGRect.zero
items.append(toolbar.titleBarButton)
// Flexible space
items.append(IQBarButtonItem.flexibleBarButtonItem)
items.append(UIView.flexibleBarButtonItem())
}
if !toolbar.additionalTrailingItems.isEmpty {
items.append(contentsOf: toolbar.additionalTrailingItems)
}
if let rightConfig = rightBarButtonConfiguration {
if let rightConfiguration: IQBarButtonItemConfiguration = rightConfiguration {
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)
}
done.invocation = toolbar.doneBarButton.invocation
done.accessibilityLabel = rightConfig.accessibilityLabel
done.accessibilityIdentifier = done.accessibilityLabel
done.isEnabled = toolbar.doneBarButton.isEnabled
done.tag = toolbar.doneBarButton.tag
toolbar.doneBarButton = done
}
let done: IQBarButtonItem = rightConfiguration.apply(on: toolbar.doneBarButton, target: target)
toolbar.doneBarButton = done
items.append(done)
}
// Adding button to toolBar.
toolbar.items = items
if let textInput: UITextInput = base as? UITextInput {
if let textInput = self as? UITextInput {
switch textInput.keyboardAppearance {
case .dark?:
toolbar.barStyle = .black
@ -206,120 +375,139 @@ public extension IQKeyboardManagerWrapper where Base: UIView {
}
// Setting toolbar to keyboard.
let reloadInputViews: Bool = base.inputAccessoryView != toolbar
if reloadInputViews {
if let textField: UITextField = base as? UITextField {
textField.inputAccessoryView = toolbar
} else if let textView: UITextView = base as? UITextView {
textView.inputAccessoryView = toolbar
}
base.reloadInputViews()
let shouldReloadInputViews: Bool = self.inputAccessoryView == nil
if let textField = self as? UITextField {
textField.inputAccessoryView = toolbar
} else if let textView = self as? UITextView {
textView.inputAccessoryView = toolbar
}
if shouldReloadInputViews {
self.reloadInputViews()
}
}
}
// swiftlint:enable function_body_length
// swiftlint:enable cyclomatic_complexity
// 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,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
addDoneOnKeyboardWithTarget(target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
}
func addDone(target: AnyObject?,
action: Selector,
title: String?, titleAccessibilityLabel: String? = nil) {
func addDoneOnKeyboardWithTarget(_ target: AnyObject?, action: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
let rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: action)
let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: action)
addToolbar(target: target, rightConfiguration: rightConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration)
}
func addRightButton(target: AnyObject?,
configuration: IQBarButtonItemConfiguration,
showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
let title: String? = showPlaceholder ? drawingPlaceholder : nil
addRightButton(target: target, configuration: configuration, title: title,
titleAccessibilityLabel: titleAccessibilityLabel)
func addRightButtonOnKeyboardWithImage(_ image: UIImage, target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
addRightButtonOnKeyboardWithImage(image, target: target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
}
func addRightButton(target: AnyObject?,
configuration: IQBarButtonItemConfiguration,
title: String?, titleAccessibilityLabel: String? = nil) {
addToolbar(target: target, rightConfiguration: configuration, title: title,
titleAccessibilityLabel: titleAccessibilityLabel)
func addRightButtonOnKeyboardWithImage(_ image: UIImage, target: AnyObject?, action: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
let rightConfiguration = IQBarButtonItemConfiguration(image: image, action: action)
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
func addRightLeft(target: AnyObject?,
rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration,
showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
let title: String? = showPlaceholder ? drawingPlaceholder : nil
addRightLeft(target: target,
rightConfiguration: rightConfiguration, leftConfiguration: leftConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?, cancelAction: Selector, doneAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
addCancelDoneOnKeyboardWithTarget(target, cancelAction: cancelAction, doneAction: doneAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
}
func addRightLeft(target: AnyObject?,
rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration,
title: String?, titleAccessibilityLabel: String? = nil) {
addToolbar(target: target,
previousConfiguration: leftConfiguration, rightConfiguration: rightConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonTitle: String, rightButtonTitle: String, leftButtonAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
addRightLeftOnKeyboardWithTarget(target, leftButtonTitle: leftButtonTitle, rightButtonTitle: rightButtonTitle, leftButtonAction: leftButtonAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), 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
func addPreviousNextRight(target: AnyObject?,
previousConfiguration: IQBarButtonItemConfiguration? = nil,
nextConfiguration: IQBarButtonItemConfiguration? = nil,
rightConfiguration: IQBarButtonItemConfiguration?,
showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
func addPreviousNextDoneOnKeyboardWithTarget (_ target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
let title: String? = showPlaceholder ? drawingPlaceholder : nil
addPreviousNextRight(target: target,
previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
rightConfiguration: rightConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
addPreviousNextDoneOnKeyboardWithTarget(target, previousAction: previousAction, nextAction: nextAction, doneAction: doneAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
}
func addPreviousNextRight(target: AnyObject?,
previousConfiguration: IQBarButtonItemConfiguration? = nil,
nextConfiguration: IQBarButtonItemConfiguration? = nil,
rightConfiguration: IQBarButtonItemConfiguration?,
title: String?, titleAccessibilityLabel: String? = nil) {
func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonImage: UIImage, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
addToolbar(target: target,
previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
rightConfiguration: rightConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
addPreviousNextRightOnKeyboardWithTarget(target, rightButtonImage: rightButtonImage, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
}
func addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector,
showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
let title: String? = showPlaceholder ? drawingPlaceholder : nil
addPreviousNextDone(target: target, previousAction: previousAction, nextAction: nextAction,
doneAction: doneAction,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonTitle: String, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
addPreviousNextRightOnKeyboardWithTarget(target, rightButtonTitle: rightButtonTitle, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
}
func addPreviousNextDone(target: AnyObject?,
previousAction: Selector, nextAction: Selector, doneAction: Selector,
title: String?, titleAccessibilityLabel: String? = nil) {
func addPreviousNextDoneOnKeyboardWithTarget (_ target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
let previousConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage,
action: previousAction)
let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage, action: nextAction)
let rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: doneAction)
let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: doneAction)
let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
addToolbar(target: target, previousConfiguration: previousConfiguration,
nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
title: title, titleAccessibilityLabel: titleAccessibilityLabel)
addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
}
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">
<dict>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string></string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string></string>
</array>
</dict>
</array>
<array/>
<key>NSPrivacyTracking</key>
<false/>
</dict>

View File

@ -1,6 +1,6 @@
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
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 |
|------------------------|----------|--------------------|-----------------------|
| IQKeyboardManager | Obj-C | iOS 11.0 | Xcode 13 |
| IQKeyboardManagerSwift | Swift | iOS 13.0 | Xcode 13 |
| Demo Project | | | Xcode 15 |
| IQKeyboardManager | Obj-C | iOS 8.0 | Xcode 9 |
| IQKeyboardManagerSwift | Swift | iOS 8.0 | Xcode 9 |
| Demo Project | | | Xcode 11 |
#### Swift versions support
| 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.0,4.2, 4.0, 3.2, 3.0| 10.2 | >= 6.2.1 |
| 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 |
| 4.2, 4.0, 3.2, 3.0| 10.0 | >= 6.0.4 |
| 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
==========================
@ -92,13 +85,13 @@ Installation
it, simply add the following line to your Podfile: ([#9](https://github.com/hackiftekhar/IQKeyboardManager/issues/9))
```ruby
pod 'IQKeyboardManager' #iOS13 and later
pod 'IQKeyboardManager' #iOS8 and later
```
***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))
*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
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.
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...
* Then search for https://github.com/hackiftekhar/IQKeyboardManager.git
@ -189,7 +196,6 @@ To install IQKeyboardManagerSwift package via Xcode
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
==========================

View File

@ -428,7 +428,7 @@ extension JXSegmentedListContainerView: UICollectionViewDataSource, UICollection
}
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
guard scrollView.isTracking || scrollView.isDragging else {
guard scrollView.isTracking || scrollView.isDragging || scrollView.isDecelerating else {
return
}
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
/// item
open var isItemWidthZoomEnabled: Bool = false
/// item
open var isItemWidthZoomAnimable: Bool = true
/// itemscale
open var itemWidthSelectedZoomScale: CGFloat = 1.5
@ -131,7 +133,11 @@ open class JXSegmentedBaseDataSource: JXSegmentedViewDataSource {
willSelectedItemModel.itemWidth = self.itemWidthWithZoom(at: willSelectedItemModel.index, model: willSelectedItemModel)
segmentedView.collectionView.collectionViewLayout.invalidateLayout()
}
animator?.start()
if isItemWidthZoomAnimable {
animator?.start()
}else {
animator?.stop()
}
}
}else {
currentSelectedItemModel.itemWidthCurrentZoomScale = currentSelectedItemModel.itemWidthNormalZoomScale

View File

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

View File

@ -171,7 +171,7 @@ open class JXSegmentedView: UIView, JXSegmentedViewRTLCompatible {
}
}
/// indicatorsJXSegmentedIndicatorProtocolUIView
open var indicators = [JXSegmentedIndicatorProtocol & UIView]() {
open var indicators = [JXSegmentedIndicatorProtocol]() {
didSet {
collectionView.indicators = indicators
}
@ -224,6 +224,7 @@ open class JXSegmentedView: UIView, JXSegmentedViewRTLCompatible {
collectionView.showsVerticalScrollIndicator = false
collectionView.showsHorizontalScrollIndicator = false
collectionView.scrollsToTop = false
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "JXSegmentedViewInnerEmptyCell")
collectionView.dataSource = self
collectionView.delegate = self
if #available(iOS 10.0, *) {
@ -686,7 +687,7 @@ extension JXSegmentedView: UICollectionViewDataSource {
cell.reloadData(itemModel: itemDataSource[indexPath.item], selectedType: .unknown)
return cell
}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 {
return CGSize(width: itemDataSource[indexPath.item].itemWidth, height: collectionView.bounds.size.height)
if indexPath.item >= 0, indexPath.item < itemDataSource.count {
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 {
return innerItemSpacing

View File

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

View File

@ -196,4 +196,12 @@ open class JXSegmentedTitleCell: JXSegmentedBaseCell {
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
open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{
open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource {
/// title
open var titles = [String]()
/// indexcell
open var configuration: JXSegmentedTitleDynamicConfiguration?
/// JXSegmentedViewUITableViewcellJXSegmentedViewreloadDatatitleUITableViewcellModeltitlesJXSegmentedView
open var widthForTitleClosure: ((String)->(CGFloat))?
/// labelnumberOfLines
@ -36,7 +38,6 @@ open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{
/// title使
open var isTitleMaskEnabled: Bool = false
open override func preferredItemCount() -> Int {
return titles.count
}
@ -53,13 +54,17 @@ open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{
}
myItemModel.title = titles[index]
myItemModel.textWidth = widthForTitle(myItemModel.title ?? "")
myItemModel.titleNumberOfLines = titleNumberOfLines
myItemModel.textWidth = widthForTitle(myItemModel.title ?? "", index)
myItemModel.titleNumberOfLines = innerTitleNumberOfLines(at: index)
myItemModel.isSelectedAnimable = isSelectedAnimable
myItemModel.titleNormalColor = titleNormalColor
myItemModel.titleSelectedColor = titleSelectedColor
myItemModel.titleNormalFont = titleNormalFont
myItemModel.titleSelectedFont = titleSelectedFont != nil ? titleSelectedFont! : titleNormalFont
myItemModel.titleNormalColor = innerTitleNormalColor(at: index)
myItemModel.titleSelectedColor = innerTitleSelectedColor(at: index)
myItemModel.titleNormalFont = innerTitleNormalFont(at: index)
if let selectedFont = innerTitleSelectedFont(at: index) {
myItemModel.titleSelectedFont = selectedFont
} else {
myItemModel.titleSelectedFont = innerTitleNormalFont(at: index)
}
myItemModel.isTitleZoomEnabled = isTitleZoomEnabled
myItemModel.isTitleStrokeWidthEnabled = isTitleStrokeWidthEnabled
myItemModel.isTitleMaskEnabled = isTitleMaskEnabled
@ -68,21 +73,21 @@ open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{
myItemModel.titleSelectedStrokeWidth = titleSelectedStrokeWidth
myItemModel.titleNormalStrokeWidth = 0
if index == selectedIndex {
myItemModel.titleCurrentColor = titleSelectedColor
myItemModel.titleCurrentColor = innerTitleSelectedColor(at: index)
myItemModel.titleCurrentZoomScale = titleSelectedZoomScale
myItemModel.titleCurrentStrokeWidth = titleSelectedStrokeWidth
}else {
myItemModel.titleCurrentColor = titleNormalColor
myItemModel.titleCurrentColor = innerTitleNormalColor(at: index)
myItemModel.titleCurrentZoomScale = 1
myItemModel.titleCurrentStrokeWidth = 0
}
}
open func widthForTitle(_ title: String) -> CGFloat {
open func widthForTitle(_ title: String, _ index: Int) -> CGFloat {
if widthForTitleClosure != nil {
return widthForTitleClosure!(title)
}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)))
}
}
@ -156,4 +161,42 @@ open class JXSegmentedTitleDataSource: JXSegmentedBaseDataSource{
myWillSelectedItemModel.titleCurrentZoomScale = myWillSelectedItemModel.titleSelectedZoomScale
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 { //
if (self.hidden == NO) {
self.scrollView.mj_insetB -= self.mj_h;
@ -205,7 +205,7 @@
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:
- 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/AddressPickerView (= 2.8.1)
- BRPickerView/Base (= 2.8.1)
@ -12,29 +28,165 @@ PODS:
- BRPickerView/Base
- BRPickerView/StringPickerView (2.8.1):
- 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/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)
- 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)
- IQKeyboardManagerSwift (7.0.1)
- JXSegmentedView (1.3.0)
- IQKeyboardManagerSwift (6.5.16)
- JXSegmentedView (1.3.3)
- LinkedinAudienceNetwork (1.2.2)
- lottie-ios (4.4.1)
- MJExtension (3.4.1)
- MJRefresh (3.7.6)
- SDWebImage (5.19.0):
- SDWebImage/Core (= 5.19.0)
- SDWebImage/Core (5.19.0)
- MJExtension (3.4.2)
- MJRefresh (3.7.9)
- nanopb (2.30910.0):
- nanopb/decode (= 2.30910.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)
- SVProgressHUD (2.3.1):
- SVProgressHUD/Core (= 2.3.1)
- SVProgressHUD/Core (2.3.1)
- VungleAds (7.3.1)
DEPENDENCIES:
- Alamofire
- AppLovinDSPLinkedInAdapter
- AppLovinMediationByteDanceAdapter
- AppLovinMediationVungleAdapter
- AppLovinSDK
- BRPickerView
- CYLTabBarController
- Firebase/AnalyticsWithoutAdIdSupport
- Firebase/Core
- FLAnimatedImage
- FSPagerView
- GYSide
@ -49,37 +201,71 @@ DEPENDENCIES:
SPEC REPOS:
trunk:
- Ads-Global
- Alamofire
- AppLovinDSPLinkedInAdapter
- AppLovinMediationByteDanceAdapter
- AppLovinMediationVungleAdapter
- AppLovinSDK
- BRPickerView
- BURelyFoundation_Global
- CYLTabBarController
- Firebase
- FirebaseAnalytics
- FirebaseCore
- FirebaseCoreInternal
- FirebaseInstallations
- FLAnimatedImage
- FSPagerView
- GoogleAppMeasurement
- GoogleUtilities
- GYSide
- IQKeyboardManagerSwift
- JXSegmentedView
- LinkedinAudienceNetwork
- lottie-ios
- MJExtension
- MJRefresh
- nanopb
- PromisesObjC
- SDWebImage
- SnapKit
- SVProgressHUD
- VungleAds
SPEC CHECKSUMS:
Alamofire: 02b772c9910e8eba1a079227c32fbd9e46c90a24
Ads-Global: 3ed9f8c6f11d4d6a4496e1dd74a4537f10b41b65
Alamofire: f36a35757af4587d8e4f4bfa223ad10be2422b8c
AppLovinDSPLinkedInAdapter: 093f25d472b4073f8203fa72a68347cbd589e232
AppLovinMediationByteDanceAdapter: d902ba6e2a6c0061bf2675ec74428b37620b59ca
AppLovinMediationVungleAdapter: b42444550ca03233753cfeb36a5660f94d038fb5
AppLovinSDK: c57ad0d34625c971d2db127f8ef60570b28ff51a
BRPickerView: 2531a2d4d0fea0b57a1c738de215af0f88863a2f
BURelyFoundation_Global: 17ed9cd58d138feefd8c0711dd3294766adcb28e
CYLTabBarController: db44b5901a28693a8a4279e4721b3aafdd36c178
Firebase: 91fefd38712feb9186ea8996af6cbdef41473442
FirebaseAnalytics: b5efc493eb0f40ec560b04a472e3e1a15d39ca13
FirebaseCore: 11dc8a16dfb7c5e3c3f45ba0e191a33ac4f50894
FirebaseCoreInternal: bcb5acffd4ea05e12a783ecf835f2210ce3dc6af
FirebaseInstallations: 8f581fca6478a50705d2bd2abd66d306e0f5736e
FLAnimatedImage: bbf914596368867157cc71b38a8ec834b3eeb32b
FSPagerView: 670405b2f18e2a87fa37f20b00de783e562c25a8
GoogleAppMeasurement: f3abf08495ef2cba7829f15318c373b8d9226491
GoogleUtilities: d053d902a8edaa9904e1bd00c37535385b8ed152
GYSide: 672895491bf7a809f0631dd8a122ab5d1d601aae
IQKeyboardManagerSwift: 7f6b1b1d1497855d2beea7f2f10ffcc6978525b1
JXSegmentedView: fec0d335355b6e019c494fe2e030bde8a36d2df6
IQKeyboardManagerSwift: 12d89768845bb77b55cc092ecc2b1f9370f06b76
JXSegmentedView: 651b60fcf705258ba9395edd53876dbd2853fb68
LinkedinAudienceNetwork: de299f32547bd528916b3c9f113015f74347398c
lottie-ios: e047b1d2e6239b787cc5e9755b988869cf190494
MJExtension: 21c5f6f8c4d5d8844b7ae8fbae08fed0b501f961
MJRefresh: 2fe7fb43a5167ceda20bb7e63f130c04fd1814a5
SDWebImage: 981fd7e860af070920f249fd092420006014c3eb
MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8
MJRefresh: ff9e531227924c84ce459338414550a05d2aea78
nanopb: 438bc412db1928dac798aa6fd75726007be04262
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
SDWebImage: 40b0b4053e36c660a764958bff99eed16610acbb
SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22
VungleAds: 04a17ab51fb61f41cd6d666fd0024509005740fe
PODFILE CHECKSUM: 8919f964b95c5ac6e11bc2a3a3200b4dd02b3b9c
PODFILE CHECKSUM: e5237cccfc6fa11c317ad1e1cbd81ea18c1f4a05
COCOAPODS: 1.15.2

File diff suppressed because it is too large Load Diff

View File

@ -4,145 +4,235 @@
<dict>
<key>SchemeUserState</key>
<dict>
<key>Ads-Global.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>Alamofire-Alamofire.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>Alamofire.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>0</integer>
</dict>
<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>
<key>BRPickerView.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>BURelyFoundation_Global.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>CYLTabBarController.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>FLAnimatedImage.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>4</integer>
</dict>
<key>FSPagerView.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>5</integer>
</dict>
<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>
<key>GYSide.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>6</integer>
</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>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>8</integer>
</dict>
<key>IQKeyboardManagerSwift.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>7</integer>
</dict>
<key>JXSegmentedView-JXSegmentedView.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>JXSegmentedView.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>9</integer>
</dict>
<key>LinkedinAudienceNetwork.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>MJExtension-MJExtension.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>MJExtension.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>12</integer>
</dict>
<key>MJRefresh-MJRefresh.Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>MJRefresh.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>13</integer>
</dict>
<key>Pods-wallpaper_project.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>14</integer>
</dict>
<key>PromisesObjC-FBLPromises_Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>PromisesObjC.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>SDWebImage-SDWebImage.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>16</integer>
</dict>
<key>SDWebImage.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>15</integer>
</dict>
<key>SVProgressHUD.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>19</integer>
</dict>
<key>SnapKit-SnapKit_Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>18</integer>
</dict>
<key>SnapKit.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>17</integer>
</dict>
<key>VungleAds-VungleAds.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>VungleAds.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>lottie-ios-LottiePrivacyInfo.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>11</integer>
</dict>
<key>lottie-ios.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>10</integer>
</dict>
<key>nanopb-nanopb_Privacy.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
<key>nanopb.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
</dict>
</dict>
<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
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.
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
- 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)
- 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)
## 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!
#### 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)
- [SDWebImageHEIFCoder](https://github.com/SDWebImage/SDWebImageHEIFCoder) - coder for HEIF format, iOS 8+/macOS 10.10+ support. Based on [libheif](https://github.com/strukturag/libheif)
- [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 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)
- [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)
@ -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
- [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)
- [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!
#### Custom Caches
@ -88,7 +90,7 @@ The new framework introduce two View structs `WebImage` and `AnimatedImage` for
#### 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
- [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
- [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:
block();
break;
default:
SDSafeExecute(self, block, NO);
break;
}
}
@ -108,6 +111,9 @@ static void SDSafeExecute(SDCallbackQueue *callbackQueue, dispatch_block_t _Nonn
case SDCallbackPolicyInvoke:
block();
break;
default:
SDSafeExecute(self, block, YES);
break;
}
}

View File

@ -129,6 +129,7 @@
@property (nonatomic, strong, readonly, nonnull) SDImageCacheConfig *config;
- (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.

View File

@ -165,7 +165,7 @@ static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDis
NSArray<NSString *> *resourceKeys = @[NSURLIsDirectoryKey, cacheContentDateKey, NSURLTotalFileAllocatedSizeKey];
// This enumerator prefetches useful properties for our cache files.
NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtURL:diskCacheURL
NSDirectoryEnumerator<NSURL *> *fileEnumerator = [self.fileManager enumeratorAtURL:diskCacheURL
includingPropertiesForKeys:resourceKeys
options:NSDirectoryEnumerationSkipsHiddenFiles
errorHandler:NULL];
@ -180,25 +180,27 @@ static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDis
// 2. Storing file attributes for the size-based cleanup pass.
NSMutableArray<NSURL *> *urlsToDelete = [[NSMutableArray alloc] init];
for (NSURL *fileURL in fileEnumerator) {
NSError *error;
NSDictionary<NSString *, id> *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error];
// Skip directories and errors.
if (error || !resourceValues || [resourceValues[NSURLIsDirectoryKey] boolValue]) {
continue;
@autoreleasepool {
NSError *error;
NSDictionary<NSString *, id> *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error];
// Skip directories and errors.
if (error || !resourceValues || [resourceValues[NSURLIsDirectoryKey] boolValue]) {
continue;
}
// Remove files that are older than the expiration date;
NSDate *modifiedDate = resourceValues[cacheContentDateKey];
if (expirationDate && [[modifiedDate laterDate:expirationDate] isEqualToDate:expirationDate]) {
[urlsToDelete addObject:fileURL];
continue;
}
// Store a reference to this file and account for its total size.
NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey];
currentCacheSize += totalAllocatedSize.unsignedIntegerValue;
cacheFiles[fileURL] = resourceValues;
}
// Remove files that are older than the expiration date;
NSDate *modifiedDate = resourceValues[cacheContentDateKey];
if (expirationDate && [[modifiedDate laterDate:expirationDate] isEqualToDate:expirationDate]) {
[urlsToDelete addObject:fileURL];
continue;
}
// Store a reference to this file and account for its total size.
NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey];
currentCacheSize += totalAllocatedSize.unsignedIntegerValue;
cacheFiles[fileURL] = resourceValues;
}
for (NSURL *fileURL in urlsToDelete) {
@ -240,19 +242,37 @@ static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDis
- (NSUInteger)totalSize {
NSUInteger size = 0;
NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtPath:self.diskCachePath];
for (NSString *fileName in fileEnumerator) {
NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName];
NSDictionary<NSString *, id> *attrs = [self.fileManager attributesOfItemAtPath:filePath error:nil];
size += [attrs fileSize];
// Use URL-based enumerator instead of Path(NSString *)-based enumerator to reduce
// those objects(ex. NSPathStore2/_NSCFString/NSConcreteData) created during traversal.
// Even worse, those objects are added into AutoreleasePool, in background threads,
// 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;
}
- (NSUInteger)totalCount {
NSUInteger count = 0;
NSDirectoryEnumerator *fileEnumerator = [self.fileManager enumeratorAtPath:self.diskCachePath];
count = fileEnumerator.allObjects.count;
@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;
}
return count;
}
@ -295,13 +315,21 @@ static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDis
}
} else {
// New directory exist, merge the files
NSDirectoryEnumerator *dirEnumerator = [self.fileManager enumeratorAtPath:srcPath];
NSString *file;
while ((file = [dirEnumerator nextObject])) {
[self.fileManager moveItemAtPath:[srcPath stringByAppendingPathComponent:file] toPath:[dstPath stringByAppendingPathComponent:file] error:nil];
NSURL *srcURL = [NSURL fileURLWithPath:srcPath isDirectory:YES];
NSDirectoryEnumerator<NSURL *> *srcDirEnumerator = [self.fileManager enumeratorAtURL:srcURL
includingPropertiesForKeys:@[]
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
[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.
* 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.
* @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.

View File

@ -36,7 +36,11 @@ static const NSInteger kDefaultCacheMaxDiskAge = 60 * 60 * 24 * 7; // 1 week
_maxDiskSize = 0;
_diskCacheExpireType = SDImageCacheConfigExpireTypeModificationDate;
_fileManager = nil;
_ioQueueAttributes = DISPATCH_QUEUE_SERIAL; // NULL
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
}
_memoryCacheClass = [SDMemoryCache class];
_diskCacheClass = [SDDiskCache class];
}

View File

@ -36,6 +36,17 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
*/
@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
/**
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;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithTransformers:(nonnull NSArray<id<SDImageTransformer>> *)transformers;
@end
@ -109,6 +122,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, strong, readonly, nullable) UIColor *borderColor;
- (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;
@end
@ -129,6 +144,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) SDImageScaleMode scaleMode;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithSize:(CGSize)size scaleMode:(SDImageScaleMode)scaleMode;
@end
@ -144,6 +161,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) CGRect rect;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithRect:(CGRect)rect;
@end
@ -164,6 +183,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) BOOL vertical;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithHorizontal:(BOOL)horizontal vertical:(BOOL)vertical;
@end
@ -185,6 +206,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) BOOL fitSize;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithAngle:(CGFloat)angle fitSize:(BOOL)fitSize;
@end
@ -202,6 +225,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, strong, readonly, nonnull) UIColor *tintColor;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithColor:(nonnull UIColor *)tintColor;
@end
@ -219,6 +244,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, assign, readonly) CGFloat blurRadius;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithRadius:(CGFloat)blurRadius;
@end
@ -235,6 +262,8 @@ FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullab
@property (nonatomic, strong, readonly, nonnull) CIFilter *filter;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
+ (nonnull instancetype)transformerWithFilter:(nonnull CIFilter *)filter;
@end

View File

@ -26,6 +26,9 @@ typedef NSString * _Nullable(^SDWebImageCacheKeyFilterBlock)(NSURL * _Nonnull ur
*/
@interface SDWebImageCacheKeyFilter : NSObject <SDWebImageCacheKeyFilter>
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
- (nonnull instancetype)initWithBlock:(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)cacheSerializerWithBlock:(nonnull SDWebImageCacheSerializerBlock)block;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@end

View File

@ -38,6 +38,9 @@ A downloader response modifier class with block.
/// @param block A block to control decrypt logic
+ (nonnull instancetype)decryptorWithBlock:(nonnull SDWebImageDownloaderDecryptorBlock)block;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@end
/// 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
+ (nonnull instancetype)requestModifierWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
- (nonnull instancetype)init NS_UNAVAILABLE;
+ (nonnull instancetype)new NS_UNAVAILABLE;
@end
/**

View File

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

View File

@ -510,6 +510,16 @@ static id<SDImageLoader> _defaultImageLoader;
// Case that transformer on thumbnail, which this time need full pixel image
UIImage *transformedImage = [transformer transformedImageWithImage:cacheImage forKey:key];
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;
[self callStoreOriginCacheProcessForOperation:operation url:url options:options context:context originalImage:originalImage cacheImage:transformedImage originalData:originalData cacheData:nil cacheType:cacheType finished:finished completed:completedBlock];
} else {

View File

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

View File

@ -61,6 +61,18 @@ const int64_t SDWebImageProgressUnitCountUnknown = 1LL;
setImageBlock:(nullable SDSetImageBlock)setImageBlock
progress:(nullable SDImageLoaderProgressBlock)progressBlock
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) {
// copy to avoid mutable object
context = [context copy];

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,12 +4,19 @@ ${BUILT_PRODUCTS_DIR}/BRPickerView/BRPickerView.framework
${BUILT_PRODUCTS_DIR}/CYLTabBarController/CYLTabBarController.framework
${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.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}/GoogleUtilities/GoogleUtilities.framework
${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework
${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework
${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework
${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework
${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework
${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.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}/FLAnimatedImage.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}/GoogleUtilities.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXSegmentedView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.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}/SVProgressHUD.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}/FLAnimatedImage/FLAnimatedImage.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}/GoogleUtilities/GoogleUtilities.framework
${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework
${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework
${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework
${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework
${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework
${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.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}/FLAnimatedImage.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}/GoogleUtilities.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JXSegmentedView.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.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}/SVProgressHUD.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}/FLAnimatedImage/FLAnimatedImage.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}/GoogleUtilities/GoogleUtilities.framework"
install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework"
install_framework "${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.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}/SVProgressHUD/SVProgressHUD.framework"
install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.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
if [[ "$CONFIGURATION" == "Release" ]]; then
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}/FLAnimatedImage/FLAnimatedImage.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}/GoogleUtilities/GoogleUtilities.framework"
install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework"
install_framework "${BUILT_PRODUCTS_DIR}/JXSegmentedView/JXSegmentedView.framework"
install_framework "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.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}/SVProgressHUD/SVProgressHUD.framework"
install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.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
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
wait

View File

@ -1,11 +1,12 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
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"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=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"
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 $(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}/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'
LIBRARY_SEARCH_PATHS = $(inherited) "${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"
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) -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
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -1,11 +1,12 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
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"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=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"
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 $(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}/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'
LIBRARY_SEARCH_PATHS = $(inherited) "${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"
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) -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
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

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

View File

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

View File

@ -10,6 +10,7 @@
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 */; };
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 */; };
759BB0622BAD35D7001C0031 /* loadProgress.json in Resources */ = {isa = PBXBuildFile; fileRef = 759BB0612BAD35D6001C0031 /* loadProgress.json */; };
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>"; };
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>"; };
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>"; };
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>"; };
@ -569,6 +571,7 @@
75E288A32BA0542F0049AB56 /* json */ = {
isa = PBXGroup;
children = (
757E9AF12BD26A8000EF854A /* GoogleService-Info.plist */,
75A8F1252BB54082004B0F5C /* my_wallpaper.json */,
75A8F10B2BB42A32004B0F5C /* rankJson.json */,
759BB0612BAD35D6001C0031 /* loadProgress.json */,
@ -600,7 +603,8 @@
75E288192B9EB0700049AB56 /* Sources */,
75E2881A2B9EB0700049AB56 /* Frameworks */,
75E2881B2B9EB0700049AB56 /* Resources */,
361BFE77C57235A052CACEBC /* [CP] Embed Pods Frameworks */,
581B851718AAE91D8467FD71 /* [CP] Embed Pods Frameworks */,
F52E1CA348C5759A084334E9 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@ -714,6 +718,7 @@
75E2887E2B9EDDC60049AB56 /* WA_WallpaperCollectionCell.xib in Resources */,
75A8F13D2BB547A9004B0F5C /* WA_NHTypeCollectCell.xib in Resources */,
75E288662B9EB2CF0049AB56 /* WA_HomeVC.xib in Resources */,
757E9AF22BD26A8000EF854A /* GoogleService-Info.plist in Resources */,
75E288872B9EEA820049AB56 /* 4k.json in Resources */,
75A8F0F02BB3FADF004B0F5C /* WA_HistoryCell.xib in Resources */,
75E2889D2BA034140049AB56 /* WA_LiveVideoVC.xib in Resources */,
@ -760,7 +765,7 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
361BFE77C57235A052CACEBC /* [CP] Embed Pods Frameworks */ = {
581B851718AAE91D8467FD71 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
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";
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 */
/* Begin PBXSourcesBuildPhase section */
@ -1029,6 +1051,7 @@
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
VALIDATE_PRODUCT = YES;
@ -1039,13 +1062,16 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 6E8D6164F3693D0725EEBE1E /* Pods-wallpaper_project.debug.xcconfig */;
buildSettings = {
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 6;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6HWQW9JC74;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_ARCHS = "";
GCC_PREFIX_HEADER = "$(SRCROOT)/wallpaper_project/Header/WallPaperPCH.pch";
GCC_WARN_INHIBIT_ALL_WARNINGS = NO;
GENERATE_INFOPLIST_FILE = YES;
@ -1062,7 +1088,8 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
MARKETING_VERSION = 2.0;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.wallpapaer.hd.live.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -1080,13 +1107,16 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7CD2C49312B61AD4EA272EF7 /* Pods-wallpaper_project.release.xcconfig */;
buildSettings = {
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 6;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6HWQW9JC74;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_ARCHS = "";
GCC_PREFIX_HEADER = "$(SRCROOT)/wallpaper_project/Header/WallPaperPCH.pch";
GCC_WARN_INHIBIT_ALL_WARNINGS = NO;
GENERATE_INFOPLIST_FILE = YES;
@ -1103,7 +1133,8 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
MARKETING_VERSION = 2.0;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.wallpapaer.hd.live.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";

View File

@ -7,7 +7,25 @@
<key>wallpaper_project.xcscheme_^#shared#^_</key>
<dict>
<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>

View File

@ -7,12 +7,21 @@
import UIKit
import IQKeyboardManagerSwift
import AppLovinSDK
import FirebaseCore
import FirebaseAnalytics
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var interstitialAd: MAInterstitialAd!
var retryAttempt = 0.0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
IQKeyboardManager.shared.enable = true
let splashViewController = WA_limitsVCViewController()
//
@ -29,7 +38,110 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// isFirstLaunch true
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
}
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 <MJRefresh.h>
#import <FLAnimatedImage.h>
#import <Firebase/Firebase.h>
//#import <SCRecorder.h>
#endif /* Wallpaper_Header_h */

View File

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

View File

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

View File

@ -9,6 +9,8 @@ import UIKit
import SDWebImage
import Photos
import SVProgressHUD
import AppLovinSDK
import FirebaseAnalytics
class WA_DetailsVC: WA_RootVC {
@ -32,6 +34,9 @@ class WA_DetailsVC: WA_RootVC {
var type:Int = 0
var interstitialAd: MAInterstitialAd!
var retryAttempt = 0.0
override func viewDidLoad() {
super.viewDidLoad()
if type == 1{
@ -41,7 +46,7 @@ class WA_DetailsVC: WA_RootVC {
let imageURL = URL(string: modeltype.source ?? "")
preimageV.sd_setImage(with: imageURL, placeholderImage: UIImage(named: "Rectangle"))
}
Analytics.logEvent("in_Details", parameters: nil)
setBtn.layer.cornerRadius = 10
@ -84,14 +89,39 @@ class WA_DetailsVC: WA_RootVC {
@IBAction func setting(_ sender: Any) {
Analytics.logEvent("touch_savephoto", parameters: nil)
self.activityView.startAnimating()
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) {
super.viewWillAppear(animated)
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() {
@ -133,33 +163,12 @@ class WA_DetailsVC: WA_RootVC {
}) { success, error in
if success {
print("图片保存成功")
// DispatchQueue.main.asyncAfter(deadline: .now() + 0){
// 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)
}
}
// DispatchQueue.main.asyncAfter(deadline: .now() + 0){
// self.activityView.stopAnimating()
// }
} else if let error = error {
print("图片保存失败:\(error.localizedDescription)")
@ -173,6 +182,7 @@ class WA_DetailsVC: WA_RootVC {
@IBAction func collectBtn(_ sender: Any) {
Analytics.logEvent("touch_collect", parameters: nil)
if isLoggedIn(){
if type == 1{
let model1 = WA_3DModel()
@ -208,6 +218,7 @@ class WA_DetailsVC: WA_RootVC {
@IBAction func previewBtn(_ sender: Any) {
Analytics.logEvent("touch_preview", parameters: nil)
UIView.animate(withDuration: 0.5, animations: {
self.bgView.frame.origin.y += 0
self.bgView.alpha = 0
@ -272,6 +283,7 @@ class WA_DetailsVC: WA_RootVC {
@IBAction func shareBtn(_ sender: Any) {
Analytics.logEvent("touch_share", parameters: nil)
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 JXSegmentedView
import MJRefresh
import FirebaseAnalytics
class WA_LIVEVC: WA_RootVC {
@ -33,7 +35,7 @@ class WA_LIVEVC: WA_RootVC {
self.view.backgroundColor = .white
setCollectionView()
Analytics.logEvent("in_live", parameters: nil)
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">
<plist version="1.0">
<dict>
<key>ALSdkInitializationConfiguration</key>
<string>O9SUDhhvnysqkmTqrvetcbJ1wp1OHnxXF9xdpu2TmR4Ppq3w35mn3d2iy2g4OHvGWPl0EJ6D7H5FpGK5izye1A</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>

View File

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

View File

@ -9,29 +9,41 @@ import UIKit
import SVProgressHUD
import Photos
import Alamofire
import AppLovinSDK
import FirebaseAnalytics
class WA_limitsVCViewController: WA_RootVC {
@IBOutlet weak var retryBtn: UIButton!
let activityView = UIActivityIndicatorView()
override func viewDidLoad() {
super.viewDidLoad()
// 广
activityView.center = CGPoint(x: self.view.center.x, y: self.view.center.y - kSafeArea_Top - 44)
//
activityView.hidesWhenStopped = true
activityView.color = .black
activityView.style = UIActivityIndicatorView.Style.whiteLarge
self.view.addSubview(activityView)
self.activityView.startAnimating()
// activityView.center = CGPoint(x: self.view.center.x, y: self.view.center.y - kSafeArea_Top - 44)
// //
// activityView.hidesWhenStopped = true
// activityView.color = .black
// activityView.style = UIActivityIndicatorView.Style.whiteLarge
// self.view.addSubview(activityView)
// self.activityView.startAnimating()
requestPhotoLibraryPermission()
setNetwork()
checkNetworkPermission()
// 广
// createInterstitialAd()
DispatchQueue.global().asyncAfter(deadline: .now() + 8) {
self.setNetwork()
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.retryBtn.isHidden = true
}
func requestPhotoLibraryPermission() {
@ -65,6 +77,8 @@ class WA_limitsVCViewController: WA_RootVC {
}
}
func setNetwork(){
// URL
if let url = URL(string: "https://www.baidu.com/") {
@ -76,18 +90,30 @@ class WA_limitsVCViewController: WA_RootVC {
if let error = error {
print("网络请求出错:\(error)")
DispatchQueue.main.asyncAfter(deadline: .now()){
self.activityView.stopAnimating()
// self.activityView.stopAnimating()
SVProgressHUD.showInfo(withStatus: "Network connection failed, please try again")
self.retryBtn.isHidden = false
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
SVProgressHUD.dismiss()
SVProgressHUD.dismiss()
}
}
} else if let data = data {
DispatchQueue.main.asyncAfter(deadline: .now()){
self.navigateToMainScreen()
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
// 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()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
@IBAction func btnRetry(_ sender: Any) {
self.activityView.startAnimating()
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"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<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">
<rect key="frame" x="156.66666666666666" y="386" width="80" height="40"/>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@ -40,6 +43,10 @@
<viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<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="centerX" secondItem="i5M-Pr-FkT" secondAttribute="centerX" id="yG5-dN-49T"/>
</constraints>
@ -47,6 +54,7 @@
</view>
</objects>
<resources>
<image name="launch" width="1125" height="2436"/>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>

View File

@ -7,6 +7,9 @@
import UIKit
import SVProgressHUD
import AppLovinSDK
import FirebaseAnalytics
import FirebaseCore
class WA_AddVC: WA_RootVC,UITextViewDelegate {
@IBOutlet weak var contentImageV: UIImageView!
@ -19,8 +22,12 @@ class WA_AddVC: WA_RootVC,UITextViewDelegate {
let activityView = UIActivityIndicatorView()
var interstitialAd: MAInterstitialAd!
var retryAttempt = 0.0
override func viewDidLoad() {
super.viewDidLoad()
Analytics.logEvent("in_release", parameters: nil)
contenttextV.layer.cornerRadius = 5
contenttextV.layer.borderColor = UIColor.black.cgColor
contenttextV.layer.borderWidth = 1
@ -50,6 +57,25 @@ class WA_AddVC: WA_RootVC,UITextViewDelegate {
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) {
self.dismiss(animated: true)
}
@ -68,6 +94,7 @@ class WA_AddVC: WA_RootVC,UITextViewDelegate {
@IBAction func sureBtn(_ sender: Any) {
if self.contenttextV.text.count <= 0 {
SVProgressHUD.showInfo(withStatus: "Please enter your recommendation reason")
DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) {
@ -86,12 +113,15 @@ class WA_AddVC: WA_RootVC,UITextViewDelegate {
self.activityView.stopAnimating()
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)
}
}
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 FirebaseAnalytics
import FirebaseCore
class WA_RankingVC: WA_RootVC {
@IBOutlet weak var tableView: UITableView!
@ -41,6 +43,7 @@ class WA_RankingVC: WA_RootVC {
@IBAction func addBtn(_ sender: Any) {
Analytics.logEvent("goin_release", parameters: nil)
if isLoggedIn(){
let vc = WA_AddVC()
vc.modalPresentationStyle = .fullScreen

View File

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