From a923b56d3b034885591e52888235ae73807627f6 Mon Sep 17 00:00:00 2001 From: Bonsung Koo Date: Fri, 31 Jan 2025 22:01:53 +1300 Subject: [PATCH 1/4] Ads have been added. #51 (#52) --- .gitignore | 2 + .package.resolved | 29 ++++- .../ExternalPackages.swift | 28 +++-- .../Presentation.swift | 1 + .../ProjectDescriptionHelpers/Shared.swift | 25 +++++ Surcharges/Applications/Project.swift | 31 ++++-- .../Sources/Commons/AppDelegate.swift | 3 + .../Sources/Commons/SurchargeAppView.swift | 5 +- .../Sources/Dev/SurchargesApp.swift | 3 +- .../Sources/Prod/SurchargesApp.swift | 3 +- .../PresentationLayer/UIs/Main/Project.swift | 7 +- .../UIs/Main/Sources/MainView.swift | 20 +++- .../Main/Sources/Welcome/WelcomeView.swift | 5 +- .../UIs/MobileAds/Project.swift | 25 +++++ .../UIs/MobileAds/Sources/AdViewWrapper.swift | 57 ++++++++++ .../UIs/MobileAds/Sources/FixedAdsView.swift | 105 ++++++++++++++++++ .../UIs/MobileAds/Sources/ListAdsView.swift | 38 +++++++ .../Localise/en.lproj/Localizable.strings | 3 + .../Localise/ko.lproj/Localizable.strings | 7 +- .../Resources/LottieFiles/Ads/ads.lottie | Bin 0 -> 13877 bytes .../Shared/Google/FirebaseSDKs/Project.swift | 26 +++++ .../Ads/AdsServiceProtocol/Project.swift | 14 +++ .../Sources/AdsServiceProtocol.swift | 16 +++ .../Ads/DevelopmentAdsService/Project.swift | 14 +++ .../DevelopmentAdsService/Sources/.gitkeep | 0 .../Ads/ProductionAdsService/Project.swift | 14 +++ .../Ads/ProductionAdsService/Sources/.gitkeep | 0 .../Project/Packages.swift | 10 ++ .../Project/Surcharges.swift | 21 +++- ci_scripts/make_files/dev/make_adsService.sh | 25 +++++ ci_scripts/make_files/dev/make_endpoint.sh | 30 ++--- ci_scripts/make_files/dev/make_firebase.sh | 70 ++++++------ ci_scripts/make_files/prod/make_adsService.sh | 25 +++++ ci_scripts/make_files/prod/make_endpoint.sh | 30 ++--- ci_scripts/make_files/prod/make_firebase.sh | 70 ++++++------ 35 files changed, 629 insertions(+), 133 deletions(-) create mode 100644 Surcharges/PresentationLayer/UIs/MobileAds/Project.swift create mode 100644 Surcharges/PresentationLayer/UIs/MobileAds/Sources/AdViewWrapper.swift create mode 100644 Surcharges/PresentationLayer/UIs/MobileAds/Sources/FixedAdsView.swift create mode 100644 Surcharges/PresentationLayer/UIs/MobileAds/Sources/ListAdsView.swift create mode 100644 Surcharges/PresentationLayer/UIs/Resources/Resources/LottieFiles/Ads/ads.lottie create mode 100644 Surcharges/Shared/Google/FirebaseSDKs/Project.swift create mode 100644 Surcharges/Shared/Services/Ads/AdsServiceProtocol/Project.swift create mode 100644 Surcharges/Shared/Services/Ads/AdsServiceProtocol/Sources/AdsServiceProtocol.swift create mode 100644 Surcharges/Shared/Services/Ads/DevelopmentAdsService/Project.swift create mode 100644 Surcharges/Shared/Services/Ads/DevelopmentAdsService/Sources/.gitkeep create mode 100644 Surcharges/Shared/Services/Ads/ProductionAdsService/Project.swift create mode 100644 Surcharges/Shared/Services/Ads/ProductionAdsService/Sources/.gitkeep create mode 100644 ci_scripts/make_files/dev/make_adsService.sh create mode 100644 ci_scripts/make_files/prod/make_adsService.sh diff --git a/.gitignore b/.gitignore index 1c78e77..9f0bec0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ GoogleService-Info.plist ### Sensitive Data ### DevelopmentEndpoint.swift ProductionEndpoint.swift +DevelopmentAdsService.swift +ProductionAdsService.swift ### Projects ### *.xcodeproj diff --git a/.package.resolved b/.package.resolved index f0a15ba..ea87a9a 100644 --- a/.package.resolved +++ b/.package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "34724f4ec037b9f40a821de88ecf11d541e22e538ad65946bfc2556846216f32", + "originHash" : "979c4fb83e47a264cb81aaa5fc13729f0ec12b28107f097b15efbd708794e5f4", "pins" : [ { "identity" : "abseil-cpp-binary", @@ -109,6 +109,15 @@ "version" : "1.22.5" } }, + { + "identity" : "lottie-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/airbnb/lottie-ios", + "state" : { + "revision" : "047aa81b77adcbf583a966dfef620d17650cc656", + "version" : "4.5.1" + } + }, { "identity" : "nanopb", "kind" : "remoteSourceControl", @@ -145,6 +154,24 @@ "version" : "1.5.0" } }, + { + "identity" : "swift-package-manager-google-mobile-ads", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-mobile-ads", + "state" : { + "revision" : "7778cc1ab037c10dbbe026959e51e616bd961be9", + "version" : "11.13.0" + } + }, + { + "identity" : "swift-package-manager-google-user-messaging-platform", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git", + "state" : { + "revision" : "708a282840c2171ee63bd93b87afa49fe507d70e", + "version" : "2.7.0" + } + }, { "identity" : "swift-protobuf", "kind" : "remoteSourceControl", diff --git a/ModularPlugin/ProjectDescriptionHelpers/ExternalPackages.swift b/ModularPlugin/ProjectDescriptionHelpers/ExternalPackages.swift index d7027b6..e290386 100644 --- a/ModularPlugin/ProjectDescriptionHelpers/ExternalPackages.swift +++ b/ModularPlugin/ProjectDescriptionHelpers/ExternalPackages.swift @@ -18,22 +18,34 @@ public struct ExternalPackages { return .package(product: "ConfettiSwiftUI", type: .runtime) } + public static var Lottie: TargetDependency { + return .package(product: "Lottie", type: .runtime) + } + public static var ToastUI: TargetDependency { return .package(product: "ToastUI", type: .runtime) } } - public struct Firebase { - public static var Core: TargetDependency { - return .package(product: "FirebaseCore", type: .runtime) - } + public struct Google { - public static var Analytics: TargetDependency { - return .package(product: "FirebaseAnalytics", type: .runtime) + public struct Firebase { + public static var Core: TargetDependency { + return .package(product: "FirebaseCore", type: .runtime) + } + + public static var Analytics: TargetDependency { + return .package(product: "FirebaseAnalytics", type: .runtime) + } + + public static var Crashlytics: TargetDependency { + return .package(product: "FirebaseCrashlytics", type: .runtime) + } } - public static var Crashlytics: TargetDependency { - return .package(product: "FirebaseCrashlytics", type: .runtime) + public static var MobileAds: TargetDependency { + return .package(product: "GoogleMobileAds", type: .runtime) } + } } diff --git a/ModularPlugin/ProjectDescriptionHelpers/Presentation.swift b/ModularPlugin/ProjectDescriptionHelpers/Presentation.swift index db1cbb1..6830a63 100644 --- a/ModularPlugin/ProjectDescriptionHelpers/Presentation.swift +++ b/ModularPlugin/ProjectDescriptionHelpers/Presentation.swift @@ -26,6 +26,7 @@ extension PresentationLayer { case UIExtensions case Resources case Toast + case MobileAds case Main case PlaceDetail case ReportSurcharge diff --git a/ModularPlugin/ProjectDescriptionHelpers/Shared.swift b/ModularPlugin/ProjectDescriptionHelpers/Shared.swift index 6f8ac20..eaf4ac4 100644 --- a/ModularPlugin/ProjectDescriptionHelpers/Shared.swift +++ b/ModularPlugin/ProjectDescriptionHelpers/Shared.swift @@ -26,6 +26,9 @@ extension Shared { case AppStatusServiceProtocol case ViewUpdateService case ViewUpdateServiceProtocol + case ProductionAdsService + case DevelopmentAdsService + case AdsServiceProtocol } } @@ -42,6 +45,8 @@ public extension Shared.Services { return "\(parent.path)/Shared/Services/AppStatus/\(name)" case .ViewUpdateService, .ViewUpdateServiceProtocol: return "\(parent.path)/Shared/Services/ViewUpdate/\(name)" + case .ProductionAdsService, .DevelopmentAdsService, .AdsServiceProtocol: + return "\(parent.path)/Shared/Services/Ads/\(name)" } } @@ -49,3 +54,23 @@ public extension Shared.Services { return Surcharges.Surcharges } } + +extension Shared { + public enum Google: Project { + case FirebaseSDKs + } +} + +public extension Shared.Google { + var name: String { + return String(describing: self) + } + + var path: String { + return "\(parent.path)/Shared/Google/\(name)" + } + + var parent: Workspace { + return Surcharges.Surcharges + } +} diff --git a/Surcharges/Applications/Project.swift b/Surcharges/Applications/Project.swift index 2c3c1d9..b3559c5 100644 --- a/Surcharges/Applications/Project.swift +++ b/Surcharges/Applications/Project.swift @@ -18,13 +18,16 @@ func getDependencies(_ config: Configuration) -> [TargetDependency] { PresentationLayer.UIs.ReportSurcharge, PresentationLayer.UIs.SurchargeStatusHelp, PresentationLayer.UIs.Toast, + Shared.Google.FirebaseSDKs, ] switch config { case .dev: projects.append(DataSource.DevelopmentEndpoint) + projects.append(Shared.Services.DevelopmentAdsService) case .prod: projects.append(DataSource.ProductionEndpoint) + projects.append(Shared.Services.ProductionAdsService) } return projects.map { @@ -41,9 +44,7 @@ let developmentDependencies: [TargetDependency] = getDependencies(.dev) // MARK: External Dependencies let externalDependencies: [TargetDependency] = [ - ExternalPackages.Firebase.Core, - ExternalPackages.Firebase.Analytics, - ExternalPackages.Firebase.Crashlytics, + ] // MARK: Target - Infomation @@ -54,7 +55,6 @@ let baseSetting = SettingsDictionary() .swiftVersion("6.0") .bitcodeEnabled(false) .marketingVersion(appVersion) - .otherLinkerFlags(["-ObjC"]) .automaticCodeSigning(devTeam: developmentTeam) let debugSetting = SettingsDictionary() @@ -62,8 +62,9 @@ let debugSetting = SettingsDictionary() let releaseSetting = SettingsDictionary() // MARK: Plist -let infoPlist: InfoPlist = .extendingDefault( - with: [ +func getInfoPlist(_ config: Configuration, appVersion: String) -> InfoPlist { + + var infoPlist: [String: Plist.Value] = [ "UILaunchScreen": [ "UIColorName": "", "UIImageName": "", @@ -73,9 +74,19 @@ let infoPlist: InfoPlist = .extendingDefault( "NSLocationWhenInUseUsageDescription": .string("Surcharges uses your location to provide nearest places to you."), "NSCameraUsageDescription": .string("Surcharges uses your camera to take your receipt."), "ITSAppUsesNonExemptEncryption": .boolean(false), - "UISupportedInterfaceOrientations": .array([.string("UIInterfaceOrientationPortrait")]) + "UISupportedInterfaceOrientations": .array([.string("UIInterfaceOrientationPortrait")]), ] -) + + switch config { + case .dev: + infoPlist.updateValue(.string("ca-app-pub-2719055739020811~8730306210"), forKey: "GADApplicationIdentifier") + case .prod: + infoPlist.updateValue(.string("ca-app-pub-2719055739020811~5366340920"), forKey: "GADApplicationIdentifier") + } + + return .extendingDefault(with: infoPlist) + +} // MARK: Target - Prod let surcharges = Target.target( @@ -84,7 +95,7 @@ let surcharges = Target.target( product: .app, bundleId: "nz.surcharges", deploymentTargets: .iOS("17.0"), - infoPlist: infoPlist, + infoPlist: getInfoPlist(.prod, appVersion: appVersion), sources: ["Sources/Commons/**", "Sources/Prod/**"], resources: .resources( [ @@ -112,7 +123,7 @@ let surchargesDev = Target.target( product: .app, bundleId: "nz.surcharges.development", deploymentTargets: .iOS("17.0"), - infoPlist: infoPlist, + infoPlist: getInfoPlist(.dev, appVersion: appVersion), sources: ["Sources/Commons/**", "Sources/Dev/**"], resources: .resources( [ diff --git a/Surcharges/Applications/Sources/Commons/AppDelegate.swift b/Surcharges/Applications/Sources/Commons/AppDelegate.swift index 887ee98..5506b18 100644 --- a/Surcharges/Applications/Sources/Commons/AppDelegate.swift +++ b/Surcharges/Applications/Sources/Commons/AppDelegate.swift @@ -7,7 +7,9 @@ // import UIKit + import FirebaseCore +import GoogleMobileAds final class AppDelegate: NSObject, UIApplicationDelegate { func application( @@ -15,6 +17,7 @@ final class AppDelegate: NSObject, UIApplicationDelegate { launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil ) -> Bool { FirebaseApp.configure() + GADMobileAds.sharedInstance().start(completionHandler: nil) return true } } diff --git a/Surcharges/Applications/Sources/Commons/SurchargeAppView.swift b/Surcharges/Applications/Sources/Commons/SurchargeAppView.swift index a64d591..11aff71 100644 --- a/Surcharges/Applications/Sources/Commons/SurchargeAppView.swift +++ b/Surcharges/Applications/Sources/Commons/SurchargeAppView.swift @@ -29,11 +29,12 @@ import Factories import AppStatusService import LocationService import ViewUpdateService +import AdsServiceProtocol // Endpoint import EndpointProtocol -public struct SurchargeAppView: View { +public struct SurchargeAppView: View { @StateObject private var _mainRouter = MainRouter() @StateObject private var _placeDetailRouter = PlaceDetailRouter() @@ -55,7 +56,7 @@ public struct SurchargeAppView: View { NavigationStack { - MainView( + MainView.ViewModel, MainRouter, AdsService>( viewModel: _mainFactory.resolve(appStatusService: _appStatusService), router: _mainRouter ) diff --git a/Surcharges/Applications/Sources/Dev/SurchargesApp.swift b/Surcharges/Applications/Sources/Dev/SurchargesApp.swift index 8ba69ff..4cc2f57 100644 --- a/Surcharges/Applications/Sources/Dev/SurchargesApp.swift +++ b/Surcharges/Applications/Sources/Dev/SurchargesApp.swift @@ -9,6 +9,7 @@ import SwiftUI import DevelopmentEndpoint +import DevelopmentAdsService @main struct SurchargesApp: App { @@ -20,7 +21,7 @@ struct SurchargesApp: App { var body: some Scene { WindowGroup { - SurchargeAppView() + SurchargeAppView() } } diff --git a/Surcharges/Applications/Sources/Prod/SurchargesApp.swift b/Surcharges/Applications/Sources/Prod/SurchargesApp.swift index 2b7d71a..89f7076 100644 --- a/Surcharges/Applications/Sources/Prod/SurchargesApp.swift +++ b/Surcharges/Applications/Sources/Prod/SurchargesApp.swift @@ -9,6 +9,7 @@ import SwiftUI import ProductionEndpoint +import ProductionAdsService @main struct SurchargesApp: App { @@ -20,7 +21,7 @@ struct SurchargesApp: App { var body: some Scene { WindowGroup { - SurchargeAppView() + SurchargeAppView() } } diff --git a/Surcharges/PresentationLayer/UIs/Main/Project.swift b/Surcharges/PresentationLayer/UIs/Main/Project.swift index dfd5936..e6d51cf 100644 --- a/Surcharges/PresentationLayer/UIs/Main/Project.swift +++ b/Surcharges/PresentationLayer/UIs/Main/Project.swift @@ -10,17 +10,20 @@ let target = surcharges.target( PresentationLayer.ViewModelProtocols, PresentationLayer.UIs.CommonUI, PresentationLayer.Routers.RouterProtocols, + PresentationLayer.UIs.MobileAds, + Shared.Services.AdsServiceProtocol, ], - externalPackages: + externalPackages: [ - ] + ] ) let demo = surcharges.demo( projects: [ Builder.Factories, DataSource.DevelopmentEndpoint, + Shared.Services.DevelopmentAdsService, PresentationLayer.Routers.MainRouter, PresentationLayer.UIs.Main, PresentationLayer.UIs.SurchargeStatusHelp, diff --git a/Surcharges/PresentationLayer/UIs/Main/Sources/MainView.swift b/Surcharges/PresentationLayer/UIs/Main/Sources/MainView.swift index 42638cd..05df6ad 100644 --- a/Surcharges/PresentationLayer/UIs/Main/Sources/MainView.swift +++ b/Surcharges/PresentationLayer/UIs/Main/Sources/MainView.swift @@ -11,14 +11,17 @@ import TipKit import Resources import CommonUI +import MobileAds import ViewModelProtocols import RouterProtocols +import AdsServiceProtocol -public struct MainView: View { +public struct MainView: View { @StateObject private var _viewModel: VM @StateObject private var _router: Router + @StateObject private var _adsService: AdsService = AdsService() private let _surchargeStatusTip = SurchargeStatusTip() private let _useLocationTip = UseLocationTip() @@ -71,6 +74,10 @@ public struct MainView: V if _viewModel.noResults { + if _adsService.isShowingAds { + ListAdsView(unitId: _adsService.listBannerUnitId) + } + NoResultView(searchedText: _viewModel.searchedText) .padding(.top, 40) .padding([.leading, .trailing], 20) @@ -79,6 +86,10 @@ public struct MainView: V if !_viewModel.mainModel.places.isEmpty { + if _adsService.isShowingAds { + ListAdsView(unitId: _adsService.listBannerUnitId) + } + Section { PlacesView( mainModel: $_viewModel.mainModel, @@ -93,8 +104,7 @@ public struct MainView: V ) } header: { - Text(R.string.localizable.searchFor(_viewModel.searchedText)) - .font(.title3) + Text("๐Ÿ”Ž\(R.string.localizable.searchFor(_viewModel.searchedText))") .blurBackground() } @@ -104,6 +114,10 @@ public struct MainView: V .padding(.top, 40) .padding([.leading, .trailing], 20) + FixedAdsView(isAdShowing: $_adsService.isShowingAds, unitId: _adsService.fixedBannerUnitId) + .padding(.top, 20) + .padding([.leading, .trailing], 20) + } } } diff --git a/Surcharges/PresentationLayer/UIs/Main/Sources/Welcome/WelcomeView.swift b/Surcharges/PresentationLayer/UIs/Main/Sources/Welcome/WelcomeView.swift index d2ffa43..151680a 100644 --- a/Surcharges/PresentationLayer/UIs/Main/Sources/Welcome/WelcomeView.swift +++ b/Surcharges/PresentationLayer/UIs/Main/Sources/Welcome/WelcomeView.swift @@ -11,8 +11,9 @@ import SwiftUI import Resources struct WelcomeView: View { - var body: some View { - Text(R.string.localizable.welcomeToSurchargeApp()) + VStack { + Text("\(R.string.localizable.welcomeToSurchargeApp())๐Ÿ™Œ") + } } } diff --git a/Surcharges/PresentationLayer/UIs/MobileAds/Project.swift b/Surcharges/PresentationLayer/UIs/MobileAds/Project.swift new file mode 100644 index 0000000..222069b --- /dev/null +++ b/Surcharges/PresentationLayer/UIs/MobileAds/Project.swift @@ -0,0 +1,25 @@ +import ProjectDescription +import ProjectDescriptionHelpers +import ModularPlugin + +let surcharges = Surcharges(project: PresentationLayer.UIs.MobileAds) + +let target = surcharges.target( + projects: + [ + PresentationLayer.UIs.UIExtensions, + PresentationLayer.UIs.Resources, + ], + externalPackages: + [ + ExternalPackages.PresentationLayer.Lottie, + ExternalPackages.Google.MobileAds, + .sdk(name: "JavaScriptCore", type: .framework), + ], + baseSettings: SettingsDictionary() + .swiftVersion("6.0") + .bitcodeEnabled(false) + .otherLinkerFlags(["-ObjC"]) +) + +let project = surcharges.project(targets: [target]) diff --git a/Surcharges/PresentationLayer/UIs/MobileAds/Sources/AdViewWrapper.swift b/Surcharges/PresentationLayer/UIs/MobileAds/Sources/AdViewWrapper.swift new file mode 100644 index 0000000..2ac2d63 --- /dev/null +++ b/Surcharges/PresentationLayer/UIs/MobileAds/Sources/AdViewWrapper.swift @@ -0,0 +1,57 @@ +// +// AdViewWrapper.swift +// MobileAds +// +// Created by Bonsung Koo on 31/01/2025. +// Copyright ยฉ 2025 Surcharges. All rights reserved. +// + +import UIKit +import SwiftUI + +import GoogleMobileAds + +struct AdViewWrapper: UIViewRepresentable { + private let _adSize: GADAdSize + private let _unitId: String + + init(_ adSize: GADAdSize, unitId: String) { + _adSize = adSize + _unitId = unitId + } + + func makeUIView(context: Context) -> UIView { + let view = UIView() + view.addSubview(context.coordinator.bannerView) + return view + } + + func updateUIView(_ uiView: UIView, context: Context) { + context.coordinator.bannerView.adSize = _adSize + } + + func makeCoordinator() -> BannerCoordinator { + return BannerCoordinator(self, unitId: _unitId) + } + + @MainActor + class BannerCoordinator: NSObject, GADBannerViewDelegate { + + private let _unitId: String + + private(set) lazy var bannerView: GADBannerView = { + let banner = GADBannerView(adSize: _parent._adSize) + banner.adUnitID = _unitId + banner.load(GADRequest()) + banner.delegate = self + return banner + }() + + private let _parent: AdViewWrapper + + init(_ parent: AdViewWrapper, unitId: String) { + _parent = parent + _unitId = unitId + } + } +} diff --git a/Surcharges/PresentationLayer/UIs/MobileAds/Sources/FixedAdsView.swift b/Surcharges/PresentationLayer/UIs/MobileAds/Sources/FixedAdsView.swift new file mode 100644 index 0000000..2241795 --- /dev/null +++ b/Surcharges/PresentationLayer/UIs/MobileAds/Sources/FixedAdsView.swift @@ -0,0 +1,105 @@ +// +// FixedAdsView.swift +// MobileAds +// +// Created by Bonsung Koo on 31/01/2025. +// Copyright ยฉ 2025 Surcharges. All rights reserved. +// + +import SwiftUI + +import Resources +import UIExtensions + +import Lottie +import GoogleMobileAds + +public struct FixedAdsView: View { + + enum AdShowingMoment { + case hide + case thanks + case show + } + + @State private var _adSize: GADAdSize = .init() + @State private var _adShowingMoment: AdShowingMoment = .hide + @Binding private var _isAdShowing: Bool + + private let _unitId: String + + public init(isAdShowing: Binding, unitId: String) { + __isAdShowing = isAdShowing + _unitId = unitId + + if _isAdShowing { + __adShowingMoment = .init(initialValue: .show) + } + } + + public var body: some View { + + VStack { + + switch _adShowingMoment { + + case .hide: + + VStack(spacing: 10) { + + LottieView { + return .dotLottieFile( + try await .named(R.file.adsLottie.filename, bundle: R.file.adsLottie.bundle) + ) + } + .playbackMode(.playing(.fromProgress(0, toProgress: 1, loopMode: .loop))) + .frame(maxWidth: 200, maxHeight: 200) + + Text(R.string.localizable.exposingAdsSuggestion()) + .font(.headline) + .multilineTextAlignment(.center) + + Button { + + _isAdShowing = true + + withAnimation { + _adShowingMoment = .thanks + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + withAnimation { + _adShowingMoment = .show + } + } + + } label: { + Text(R.string.localizable.exposingAdsAcceptButtonTitle()) + } + .padding(.top, 20) + + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .padding() + + case .thanks: + + VStack { + Text("\(R.string.localizable.exposingAdsThanks())๐ŸŽ‰") + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + + case .show: + + AdViewWrapper(_adSize, unitId: _unitId) + + } + } + .background(R.color.gray100.color) + .frame(minHeight: _adSize.size.width, maxHeight: _adSize.size.width) + .cornerRadius(20) + .readSize { size in + _adSize = GADAdSizeFromCGSize(.init(width: size.width, height: size.width)) + } + } +} diff --git a/Surcharges/PresentationLayer/UIs/MobileAds/Sources/ListAdsView.swift b/Surcharges/PresentationLayer/UIs/MobileAds/Sources/ListAdsView.swift new file mode 100644 index 0000000..59e03ae --- /dev/null +++ b/Surcharges/PresentationLayer/UIs/MobileAds/Sources/ListAdsView.swift @@ -0,0 +1,38 @@ +// +// ListAdsView.swift +// MobileAds +// +// Created by Bonsung Koo on 31/01/2025. +// Copyright ยฉ 2025 Surcharges. All rights reserved. +// + +import SwiftUI + +import Resources +import UIExtensions + +import Lottie +import GoogleMobileAds + +public struct ListAdsView: View { + + @State private var _adSize: GADAdSize = .init() + + private let _unitId: String + + public init(unitId: String) { + _unitId = unitId + } + + public var body: some View { + VStack { + AdViewWrapper(_adSize, unitId: _unitId) + .frame(height: _adSize.size.height) + } + .background(R.color.gray100.color) + .cornerRadius(20) + .readSize { size in + _adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(size.width) + } + } +} diff --git a/Surcharges/PresentationLayer/UIs/Resources/Resources/Localise/en.lproj/Localizable.strings b/Surcharges/PresentationLayer/UIs/Resources/Resources/Localise/en.lproj/Localizable.strings index 2b3afc1..559a40b 100644 --- a/Surcharges/PresentationLayer/UIs/Resources/Resources/Localise/en.lproj/Localizable.strings +++ b/Surcharges/PresentationLayer/UIs/Resources/Resources/Localise/en.lproj/Localizable.strings @@ -65,3 +65,6 @@ "toastNoInternet"="Please check the Internet connection."; "toastNewVersion"="New version available. Please update."; "toastUnknown"="Oops๐Ÿซข Something went wrong. Please try again."; +"exposingAdsSuggestion"="If you are enjoy this app, and make it sustainable, is it okay to show you ads? It will show here and in the place list."; +"exposingAdsAcceptButtonTitle"="Yes. Show me ads!"; +"exposingAdsThanks"="Thank you for supporting us!"; diff --git a/Surcharges/PresentationLayer/UIs/Resources/Resources/Localise/ko.lproj/Localizable.strings b/Surcharges/PresentationLayer/UIs/Resources/Resources/Localise/ko.lproj/Localizable.strings index 96e18b7..42ef01d 100644 --- a/Surcharges/PresentationLayer/UIs/Resources/Resources/Localise/ko.lproj/Localizable.strings +++ b/Surcharges/PresentationLayer/UIs/Resources/Resources/Localise/ko.lproj/Localizable.strings @@ -12,7 +12,7 @@ "tipSurchargeStatusMessage"="ํ‘œ์‹œ๋˜๋Š” ๊ฒฐ์ œ์ˆ˜์ˆ˜๋ฃŒ ์ƒํƒœ๋ฅผ ์•Œ์•„๋ณด์„ธ์š”."; "tipUseLocationTitle"="ํ˜„์žฌ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”."; "tipUseLocationMessage"="ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฃผ๋ณ€ ์ƒ์ ์„ ๊ฒ€์ƒ‰ํ•ด๋ณด์„ธ์š”."; -"welcomeToSurchargeApp"="Surcharge์— ์ž˜ ์˜ค์…จ์Šต๋‹ˆ๋‹ค!"; +"welcomeToSurchargeApp"="ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!"; "searchFor"="\"%@\"์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ"; "alertUseLocationDeniedTitle"="์œ„์น˜ ์ •๋ณด ๊ถŒํ•œ์ด ๊ฑฐ๋ถ€ ๋จ."; "alertUseLocationDeniedMessage"="์œ„์น˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ์ฃผ์„ธ์š”."; @@ -20,7 +20,7 @@ "close"="๋‹ซ๊ธฐ"; "searchBoxPlaceholder"="์–ด๋””๋กœ ๊ฐ€์‹œ๋‚˜์š”?"; "searchButtonTitle"="๊ฒ€์ƒ‰"; -"reportForUnknownButtonTitle"="๋‹น์‹ ์˜ ์ •๋ณด๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค."; +"reportForUnknownButtonTitle"="๊ณต์œ ํ•˜๊ณ  ์‹ถ์€ ์ •๋ณด๊ฐ€ ์žˆ๋‚˜์š”?"; "reportForConfirmedButtonTitle"="์‹ค์ œ ์ •๋ณด์™€ ๋‹ค๋ฅธ๊ฐ€์š”?"; "surchargeStatusUnknownMessage"="์•„์ง ๋ณด๊ณ ๋œ ๊ฒฐ์ œ์ˆ˜์ˆ˜๋ฃŒ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."; "surchargeStatusUnknown"="์•Œ๋ ค์ง€์ง€ ์•Š์Œ"; @@ -65,3 +65,6 @@ "toastNoInternet"="์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”."; "toastNewVersion"="์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์„ธ์š”."; "toastUnknown"="์ด๋Ÿฐ๐Ÿซข ๋ญ”๊ฐ€ ์ด์ƒํ•˜๊ตฐ์š”. ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”."; +"exposingAdsSuggestion"="์ง€์† ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด ๊ด‘๊ณ ๋ฅผ ํ—ˆ์šฉ ํ•ด์ฃผ์‹œ๊ฒ ์–ด์š”? ์ด๊ณณ๊ณผ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ชฉ๋ก์— ๊ด‘๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค."; +"exposingAdsAcceptButtonTitle"="๋ณด์—ฌ์ฃผ์„ธ์š”!"; +"exposingAdsThanks"="๋„์™€์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!"; diff --git a/Surcharges/PresentationLayer/UIs/Resources/Resources/LottieFiles/Ads/ads.lottie b/Surcharges/PresentationLayer/UIs/Resources/Resources/LottieFiles/Ads/ads.lottie new file mode 100644 index 0000000000000000000000000000000000000000..fe49ea9a5bd596da9f2b20c5e63de4e23d0fc9ec GIT binary patch literal 13877 zcmbVzV~{4#_Ga6*?P=T7(>AAV+qP}nwr$&X_q1)l-Mw>v_r~ttf5d*-s>nDepL|Y6 zR%Jz=Je6_er9i>ZfPjFYfKrftYNU$NnFRi=4gW3he~Y!gjk$@jqZ7S_qpeNyG!p^{ zF;eh;r!*Z@|FCmqw;v@V1`@<@ot_>mQ)YLk()wn%s@I#Uo8d({Mw-ANf{j`oS4H$U z9?g+tlHIrFpLtVqIYsE$!ypPj-+BhV*zv_+5x0!?EDYX%&dr#11yNDsSD_$;wgVN+wBroVryn7OVc+dH~C zI&!=mn2h@Le#~~-UPp``Gqrd2emp(`zOFNOZ@#iEecu59!2TH_zn9nh`}NJ&E4?o* zp(Vlo7ydWk@*A-C&Ffq1`|aZUa**0-J8}4RJy`3ydpm3TCGqsp`^q8ldQf^DtIK~k zLCEj>{-j-T1L#X_d;hvvEj{^5^!oVNhV=gMBzTo&`*{6oEoJa2^n4y<0Awn@+Pdzd z?FafU7~b4}fBx;_JDGuFz0>#W;$alAm)H9USGOE*_It|o@7Sxp=dk#NHOo*50k&V_ z=HRpIe0-PA^WfJ$nY`@oU#TBF5pcc_ZQc_%CCc3$mA&mB(pQfhM;FYg^j|s|d?{aC ze7<)l4KCWfkl!S#4;?>(xF1p^DEHytA6>P5zwTE{J-ywiMv2C|t=xuKEkDDWXaEen zzt=;{u;siy&pvBUiw{ZAdp=$mPER3eh<{16x{ug+eM)fr7B20oB$0;L^~o&5*yT5h zRoB=_1#m3S0_tlvKT^I)GM`wSb+$`mjg?+vfP$p|u~cgznW$urUcDc`tlQUjRxRH1Q0_BJSVv{Ork}vV;#sZ6^+!=bys0 zEyX?AcTmO`!4bK`q_gFU>xK(uBFYUmg5%9oU-!G8-xXKxZjIKJo}Rnc7)`GXk01@H zT`I|D1P@x(hr1eVcQ-|`<}#BVp=3=O&Cca-JSr8-xUd>x&AoXqO(e5yOnbcVW`5W4SCmZTHz`T`~>2Z~VP&OH{!pXIp61iYh# znJv}l*i_I;040$NtWLQbttho23NwCFsDxNl5?E#1uT9j&d+|#r(1aUK2a?@ytu)rx z(5UIN-j71OBp^F?S9z*beA5Z?F#owDRru$zHYjGnKIIJzA#$tq=KB zr*IVD$27U{u)@UfBTZ=O&T6$;O?+$m>+blX-*7x|l`XY{E}y9>A>|Bmb4)S~7iWy# zRV=+%q5_5!+&4Lz)`jU2{i=(TSBA%iIoI@O#ETH#@PqRCpD5CE$iDh)Z0leb#{$_? z4-1()S>2V-QCU+K@(L}R(eeS)&OczwXuu<{Mxw@pL%^h#WOOT*KZPbQD|B&Qg$xJj zZ1*j`mH^t!&8F?Sm`PeYnG1bAoEZ0C+t4xL>MLFAB6*} zz|WltIi%D}9Ssz$P2fx)mzET0OsTxT{H@E`n^BNS^_2}W>P+H5%1S&$q9<59veFZp z2mRyYb2*r?pa$dn>Gf~ksZHq%@u#F~n%G#x)211DD%Zs=s(JzTniT7RpwE`kbmXR@ zI`vs)Q5=mI*7hO2H|D9FOD?xSTISYgLYbl^eA644)(`yjpvd7N+k53=#MVyJGhUamr$q@HIe*?d{!4{RWG>k=% z%^M1p3yN(g&}f*_t)j~STf)=BKZmj{GoN>)sc+YM+upX{w#{ycp8i+cI%k=DRy(~4 zu{Np`IWGroZ-7yT8{f~f!I$6Svr#K2>XmMrBu_0cY9DaK$80~)owqCAa6Mrb2SGc- zZ~dNCxA~U|p{y%hI9gZ4WG*;#6QX($ek`KKOB{Xsx_?iu68`jkb1K!2*M{k|!U4e2 znH)TNt1*I^hwx2?VYxmXn|tO}dmFDU-31)3S_4_*nyWT@<6o1jq5?_rZx%&WWnQhE z5Ab`k0>oc*IM5oS-WdB8$u61M5JPvTifDgY+4$;xG(2d$5GXMPB6+4WQ+}{uqgsvp z>FHd+wG7O@j|W*8x(B(}r&C~^Vq>i}WA!gnr-zS{p@hG-(Jh2l-|cZVxETD(>vYJEYJ!FX8b}h9T&H?W&i|M`HY1N|IvZ;7wk{SfeO}Rx02h zY7jS*7Swp4L)rL2{QN~5va|7q35!fs8v0QGPM8)IfYOac_(oPKCnfA{nvBRL1^y8E#;3=CgLVyB#lDU;O@^ zJo1^F8Bx@cnNf}yX@JeIqa_M!)2GQj{E{8ETSI}#XRC5`e6V(JT1}S3J~4sh00MYa zFzN++$Titx!n~6{k5|)XSi+f68Yx@@f^k?Oy6PZl@-%I%%(_+dq7}bP6?fnCRaQ?& z&7aC$KGrD&aqPtGL>xWHu6SsV?Q=|G^nPPfW%04MG+)i1-TpINqvB}CYi<$dU|0Lu z6iim87caNLUz9RYG|CPd$uK1ocfd%Z>YI=_ve0;+EUz@}kO?qi8iStm$hWJOKaJcP z!OVA(K2P(4?LX}Cn(X2~p^*N}`6NYp_W#kjO|hct3`(G`wM}v==TUw5934UJ_yf6? z`4JC_xLIP<)wWDe-XEmL?rf&Di4E}quRYN4LVv~^=a{lo74v!d2{T(uaMRP?Gw0j$ zT|InWg^rfLp1x?{OkdB=#d(+GNNz&LX1XDj{m0`EC%!0CAl!H<6J{O12 z{2)>A%dyLS!b5ytD7$(x#j#l1NOwL4YvHq$46s~dl0f_wVi*OnmBa8Dn?ez@WR~#4}WgyzM59a{ce3jD^~M?f!K=9g=~IdHrkDd zH?neHF`(W5StEZ=aU!h2k7lzmu=VZ0FEZL13u?cKbQ0blm*qSO8d_b3AJ=FvI_MO$ zdxh@GapiP_YrF8!vTo9tgAa#+SB)@z(T#-YG(VjL`Hlv1#e&6oPLnNi2S zG;6BhE)NM#%SK%NcX@$?LVQYrdDVTfpt9wKIjh~0>t)|!zNy)&i?#~ufhJR zG|GSnQv%zLX9rN2OuZAuK=cJ%on5&4zP`R)EF$Uy|LW}qgtwgyuW&_DFTZCEvzi}d zf$K^=v>L{jqBC~lmAGu7gDwS+#uHIuGe5`-2P^lscjGi|W1_fHJ8h){`Bu^H-3-V4_#{ZRywC~LHsUo_fM}mNve~<#TK2?%biKk$wtkr*H zUG6{97*8*)Sc_sg^*#DDa$_S6;ZY9aWcTzTnK&W$W?w0|O@PYBnL@}B3=@gmo|7C{ zHGJcuplvm~Z(E0wsv#DL_a*rlJ5l!=_C4J-x0U}EQH@YMF3ZQh+L5K{WSel-w&qdq zshzbQ>l`;Xmv*Z&bfh|X-x??I!(-u;uW4a3pOYPSjRC>-4d-GrC6pxc%EIgPfx_4x z_!L^nfAs|hH25cTnG{sO5f$BxIF~LX#M2B2_m%rA(Z`x;O6jeg2MQJdLa1^A>iMH`RLEB zBBpGIs6Ww;sH5u>_E^SQno6^mZwhvI(!D$Nc3F-9j}Lq9PJl=3{rMHwcZi%E`Uxm{ zT9_Cy%V6t$OPBNa+iI!q^ZPl0m;z&U?KK6=ne5$Ow+qVr1`%*fMbLU`$i<@lp9Zoj z7Nmusccldnn74S;V3uNU)1CH-#Vw zgezizN&oT@a%s3A{5zsQ32Ag>YFrBE`pBqS<+8*h6m^^LcksR8mfcR}z>!xr)S2Qc ziV$q9EX?$W+-cEl?PV{})f!Uji0dN0FbIPq{3x#hCvgN$=rjLSCIVQFq1~VeS zbS6?Pi3=_YS~U0NlqPE^uHorG-fK9oAoW>%OsVV@^blIRNz9Ql?W6`dis_?zSGX$2 ze2yc^$?k9rx=CCu%(4Bqk<4PM#|jC(BI%?*9@gsn3#R6i-7k3!6pq&>cwMIIsT`e* z33z_0|3k;0q@BRiP9L4|#4wJjo-!O2|Hr)kp0@L%Su1yhj8Z+q?=1?8S>Pa9gh zsQ8OdYq>SPj2z_CbMsfc!D`|~9E8qzjNtu9aZ|VV@y{Bc{dvM zuXp#0=oWs2BfnGwzi9b>-w*&ZFe4P=!^3HO>@V_!e_ph0rSI)k3g3F%4x4t+2{zl* zc=EB}bG?cej~~}A&jX^RokCAI)dWh@4~R}F)2r^EpBpk85`tuNhZE?W0XUHiXag9g z7g@zfC^X-cQv=;uT^jGdVq-B>EoTgip@Q~QVXLm6WNP6o3>FEL)lXpdHeHefR)!PO zRxx}C>P}ai7?u9czhYtyFCWqQYU=oHTgN$DzM!OG7m0?E3Z-e$iu=fVDOqTfV7bg> zTuz#Hfbr*%WeYF4DB`7=E>$KK+dZcY07V zMT6yyB?XP9nE_f;1^E>bukFh3gv%|=%IC~EE zx?v00AgWv4dz#8Mvzz)RfREXqfMG&vz6gRKdIP`tYRGD zC7CW=+J{vSR0Hh{fnwpE$q(wB#$+vi7kdWp#E7}N)d-C6R zk|HIS%gk6wMw#!_XitX9#;;8y2bWp@Ekt6LxxHq&c8GBF)1ALOK^`m_Y})+Si2d;B z$4MF#OV_=Xzh$0)42jMYA#{W?v@vOIoRV9%m*M3NECsLTb4pmsM10YfQW%S<<{0Ey z--zgDX-|rt&wV@dqFU;&&q+|pTZ;!K1}aw=2G$sd+hMTz0CS3*hIA5%A;IwW(#&E( zi4p{Q-rU~vN^xK3+N*bSg`A1L{b;EGO>YokKlE^%D`*2c{FX~-LOCke^gu+qGXXOq zHi~AJY#28tj-AyfZ}IE0D0*2^2Fkl}v%}^7Le_hTQ5(I8 zQOAkgAxZ`;yX3^;S<0KVTTya?xcjrid(Z4NNOY?4>}vEMmHeeah)wrX_|hWqv5c~C|&S3KhE zUmo-f^~1fwgg(`L5&1t(cLdZ3!y7wwvVh@$i7K)uYSMT<^^P%CM0ez<;dIiCZ1``3 zgZiT}ubTdRs(pJGvUmLh-dSHs;O-Qz_u%9GCg&+`aSCB>rcHwEC&=Lg#gRS#F&9Tp z$M`FbSo}=8gdum&h=QM^&7U;-r@jI_$oZ+i4yabP8vP~j@W08(WB-SY`F|G~>h# zSH|Y}%j5go5owc058f2)CSZX5CuPgqm!4+hbnRJZO+UjfgX1*At}A<+y69VXk@-R6 z=0*A@hR<8DuFrm|?&}fef2phdkPLu()4Rz{8egEf=!eNhhpppORY=(phT80YidJ5r zZML&Rp6e(6L@%*1ou>)j1TGyQ!^T--E-xHq+4V};xXZ;6(5}xfbJw({Y!qk-rVh>W@Y|U#a$}-4or|dN0Mv6Q;Pb=}&DaSVUNM`Qmz6 z+fM6bfR#uGp(&`X6TOQCljkZIQ1dpFHhy64G<{mtFN6*YDr*oD{sjt9XTD0WWnn>Y zB$CocWEi878A!(L*OJ0^C&JY4VHFH?z68nIlJ@((NF`0iq_G_?ecKjz)+{A)VcpJI zYBMBbl0B9skdv{|bar1LjEbczZH9O}W2$~F_*snrLra8${j>8J9o-f7dSem-+mlz= zu9tr32ZC4!HhsLZCa>@!*jN_^1Kl6{KFPD^CTlJpeWf)jZjf01eASB|-GU&z8p=&f{ zI+lM9+|NKoGVRda1t=eUGSA(82D7GS^6HhLYF87eCX5hn&~z&*vBHzF2k}_aBX2}G zq?t0roay-X0ho#qLnDsCyJ9f~Ija35voqrXDft1TO- zi7JJ#8sCm6LC!^)z1I~Z9b=6YF@hLehcGnTT7=$`M|abBxkJhRblu9Gn?D#gUAqxh z?4Op-sTcj)vBe*|WMTiBt=9Z0CGXp$t<%}hYxh=!qQs}RH==}uKt^gY78Y@t1^-^k z6N->(06)AKvVTs?opPofvd0^`S3bxPWAGS#I|<)Sil|a0j(J=Chvabq1PpR8a7E+)z#hQ&O$`Jjqlln@n zIpEil@8m9H-j@Ic-6_(mLTV!95YQAkZ$u-`tjcz((-QEC;T(IVPs{QKmuFaqXtm_9 z;qVNb!!3Fq!l3sfw7*1AhNdAN+QH9$BcSR2-`vkI;#6g*p%@56*q6fuT*4!pZ^9S1 zTqjLi=o)C}WTE_6HrAT9oN!{9_g$KfPWRyYFaz88b_+e5d3eCm2`P+Zm?=ia4VGF& z11WvMWJIGYhwIc#>EdMc4{B8)N#uHyx5&O~)xWbZvoMmt-0y6R+raCByS@+ev9yqf z4}YZ15|iRT$(!zf3*KESC8Y6#r;w8=v`O`iIn4VK70D;`%ZcxDr(37%l$hhQ8~0>f zmvZ){a;_lx7;&w`IaL8K9*Tk~F5wsn-@NCm)J%B{sMui?t~)5v{3@jNRwYRa{$U06 z*O-um zwM<#(C#k^k5Lv0aAO&8=p%#pM0uR;Opbb%@i04i(2NgCm zoJM^&>l$O4NW{oicr7r)Q&$MR0BTYAp1wVXii;?gA)nLMpSv)I`7UwY3fIXGR^s7G z#fDPZQesK@RIx=6*=~b!;2J~Rf(GZRuoYKN${m8dCd*iR8jZekx)Wk1GzOB14Z;g1 z_J+@WbYoIaw@}wh3U<-umJuH?xNy=OPLKE$CiKFe?~osB^>@B(Q0Ad&a=32uvXUMY zF4%4lIBul~9cJ9~9Bm97rx>@V%Kl>gBIe+j>u78OkfZ&iHkUxL72v!Zumr$hK#27x z2tJH-ou0uG8Q)~Mwr`moxb3`*TTG>afm_=lZDT-7ZIRM8I{>dXcGJQQUY<)A@)wdo zKPrD+Ac|wtaR$8j$9|xWLl|IrEb9|bG!zUjOcG63JkS1I!3bXR!d(K`k)pHNXcX+WnAH#?`9S8IzE}m1K;D<5l!D<_{LlU=vVC8oRk)I7FYYY$w!i zp#9OI(NI0$VAo=#XJg zSt?&Ac5=J}eXpYQYHf*Ne$M0E(hJQ#Gy`##rr1sb1=+~Gfc7$Jaeu2XG){4Wbz`8b z6W!7`rr_Gq2a$T6 zT++5x1cjk=c}EQ4g2RskQ-Ov=)%&=2Lm}5mVh06VuJjG|&ED?!V`3_Pl0DFfQlamHmm0T+V$Wvigy5Jr|{`c3<&y<5vW@|YoBKUdljiS(T_Sw=y0aB zMAM3a5$(WhD8H*MGM1I%U@sbbeHK@%tV$~!kG|v?%CNt|-7$0+OIEKiUp(HeuJsXA z*O1s`SG{IsHju2N;9xeKE}bXj2@6D@kZdT#Dm%BRhZX%5yF}eA-EFM<9??|3X>dWh zke1N;@pjFIk>vOCZOTD1NyiZKgMUkNaDQb|v4jl2ef67o0q@u%;GB;Y?Tm*{pb*RP z15SBb8Le{0&lojW)-@xuH%MOwo*-B&A+p$W!u)iI@RvO-@NIv5yX3yQZk zN5CmO+9IT_9L{^c<}T47k8_sNc<{D{_72}6u*^?Kd@2#`85FpPJKm_J7X-p%4+%hq z_qg`(c))HxMjoq(9dwaK8f-Y9nup93mumfUW^yhSwvwHD!>}(089A-2?Ic74P885=H{(5c z)s&BMby;I8nwrm^o9}YY7+Hb@TFAZ4s2MlC8f3L0%nrmH%6XEqy2UxOemTT734XE_ z>KFiDA4-X|m6-RVPcu#vYIvwtyhlA^4vrDWJ_Z5~M{>})|Chloiy3&YuIJh>kz1^m zFFm}Owf)}#TJX}|_qWWexPyw1$f!n8zc5#*wMOdbpQk1U$ZT1Dq$Hq4&%phW)#GBM z;uj%!r5NG5B^JNpauVQt?^qW6@ObclK;p{72F?YrS|!#nBhBYy>{0GX z>c#s_uK-B=7Sq7iq)a0~o@m*;mV+e2%B2((@*_|#jmJcrAVS(N&_rMiF5iD`3p985 z$baBZIdv&!=kcHB_i-9yr$z`6%%@P%&+%6Qd443clX_65-NIi9^%;;Lxg3J4cVy2& z9P}!b1(@sl8C8~l z;C*_Bxd8eCL+sq$G^N{A|G<$1dluM7fw){`3TJ%~0LEo-MhN=59^-_U(%6zfP%{eiIFHpp|&^!SA6#1WY?d)Gt|LF_E zCB`J>b*Oua{j0EeI5Hv+32YdgL8AT=hR2o$7sApTAX@e&y=zjyI;bnNbxTF&oJDp! zKaE5!+~DYE;JC+NyjJ$N|1kW`W*9waTUF)KXFCkid*#gXI0csnGa^22W>EU07hg=; z4+n_iGE{534U!SX4;LUW9B>>a51InDrw0W}2ux@2ZH1NH@jK@?L4X3lbJI=|{Z^pW9m& z1`Z_T@0_te)h$G!U;GF>DH(>tSzQGuMuxPiyzT$Vaw=pgk1XJ21|2L zVC5rz>W4AAd(gHn&_K= z6cXl_ET){G0!9~X8U=Z@Nb%UqC%g4j`6spf?0OL917+%UrBc-XL^sL43Az*&QqCp3uX44J~GD=$O6!zcw|i7!35Z|K8Dbfo&3qF<^ZtWaGGk zhepc)sSZjR4DHr8M1W?zNMADF9<$xb;yc}K0eeEc9F1%RBz4gg8L<#8nv{`(FhBi4 zC?nI&OYoM5j`x+s32=SO(z7M6a)&^K}ybf z*Og5$cpSqS7uQ}I51jQ9oEvr=Y)@jHlNK@xwNaBLfDt(M&|5Gs&r`Pz zi07@Gz)Rv(;K$6ofV^Zx<9yh+VbFTn~~FHtP4p z=%Fl~!5g#IqyiRFjv`YQfvdzZa%2|W_9TQlFewoy;(#)sbdPzoB8e_ko=zS;QWN*s zq+dT`kYVp(kFwCMMidDL-q9D+y(esL+wDMTL79j&#gFrQkKj-hjW8=BDJQGWN95Dw zE@)=qNR|yone~iEJP@icTo{S4VUL6nEqJd%9>rJro=u6UkjLxn5;zZu2qbQzmdY1) z+!oF5j2xJS8WWh(Gmq9qcz1Uy1DfOvS%2^X(RJ_UkkMZuIUY~NeNQDtFE=@SGG+Y-Rr#NKx~NF zyvo`pyE*`YHC)g&PhvfQ;>x*8zcErP`C#xC>5ilSP^cFxGmdbFxgMK5ArAN$@nMlMNi2z1Q1vjx6i?qG*~fJng)*^^zU3Gp2{?`_zjbW|ls7T+ zCd}n2CaTO{d-Ii74{I(4)kibOhD{pR7m2`qt?Yc}Nm>1OqIj+#QSuy^`>7L?Mnx|Y z!^;{ms|4Ad_y+ai$C4BnQE{IQ5N);l-k5@jBG}P5e3+E|xPny%o&^!f0{T4LcyJj8 ziV+rZWwr{mkqD_#e89qrMwEaHoY8F9t@ySwY)K=<4?ig@;i)Crs~OXv%`w=q_R%OP zozv{75Kt404&z@6UZZnAj+Pt^=4OXnv?(|>w{ukc~wMVFrg*B1n|zzgQO!YU69#

bv~`$3E-LO$yp_)8n0c?$VU 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 Target { + + var _baseSettings: SettingsDictionary { + if let baseSettings = baseSettings { + return baseSettings + } else { + return SettingsDictionary() + .swiftVersion("6.0") + .bitcodeEnabled(false) + } + } + return .target( name: _project.name, destinations: [.iPhone], @@ -38,7 +51,7 @@ public final class Surcharges: @unchecked Sendable { "NSHumanReadableCopyright": .string("ยฉ2025 Bonsung Koo. All rights reserved.") ] ), - sources: ["Sources/**"], + sources: hasSources ? ["Sources/**"] : nil, resources: hasResources ? .resources(["Resources/**"], privacyManifest: .default) : nil, scripts: scripts, dependencies: projects @@ -49,9 +62,7 @@ public final class Surcharges: @unchecked Sendable { ) } + externalPackages, settings: Settings.settings( - base: SettingsDictionary() - .swiftVersion("6.0") - .bitcodeEnabled(false), + base: _baseSettings, debug: SettingsDictionary(), release: SettingsDictionary(), defaultSettings: .recommended diff --git a/ci_scripts/make_files/dev/make_adsService.sh b/ci_scripts/make_files/dev/make_adsService.sh new file mode 100644 index 0000000..ee42807 --- /dev/null +++ b/ci_scripts/make_files/dev/make_adsService.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# make_adsService.sh +# +# +# Created by Bonsung Koo on 31/01/2025. +# + +FILE_PATH=$CI_PRIMARY_REPOSITORY_PATH/Surcharges/Shared/Services/Ads/DevelopmentAdsService/Sources/DevelopmentAdsService.swift + +echo "import Foundation" >> $FILE_PATH +echo "import AdsServiceProtocol" >> $FILE_PATH +echo "public final class DevelopmentAdsService: AdsServiceProtocol {" >> $FILE_PATH +echo "public init() { }" >> $FILE_PATH +echo "public var isShowingAds: Bool {" >> $FILE_PATH +echo "get {" >> $FILE_PATH +echo "return UserDefaults.standard.bool(forKey: "isShowingAds")" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "set {" >> $FILE_PATH +echo "UserDefaults.standard.set(newValue, forKey: "isShowingAds")" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "public var fixedBannerUnitId = \"$AD_FIXED_BANNER_UNIT_ID\"" >> $FILE_PATH +echo "public var listBannerUnitId = \"$AD_LIST_BANNER_UNIT_ID\"" >> $FILE_PATH +echo "}" >> $FILE_PAT \ No newline at end of file diff --git a/ci_scripts/make_files/dev/make_endpoint.sh b/ci_scripts/make_files/dev/make_endpoint.sh index 8519394..8f1b8c9 100644 --- a/ci_scripts/make_files/dev/make_endpoint.sh +++ b/ci_scripts/make_files/dev/make_endpoint.sh @@ -6,17 +6,19 @@ # Created by Bonsung Koo on 28/01/2025. # -echo "import Foundation" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "import EndpointProtocol" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "public struct DevelopmentEndpoint: EndpointProtocol {" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "public init() { }" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "public var baseURL: String {" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "return \"$BASE_URL\"" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "}" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "public var authorisationScheme: String {" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "return \"$AUTHORISATION_SCHEME\"" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "}" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "public var authorisationToken: String {" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "return \"$AUTHORISATION_TOKEN\"" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "}" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift -echo "}" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift \ No newline at end of file +FILE_PATH=$CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/DevelopmentEndpoint/Sources/DevelopmentEndpoint.swift + +echo "import Foundation" >> $FILE_PATH +echo "import EndpointProtocol" >> $FILE_PATH +echo "public struct DevelopmentEndpoint: EndpointProtocol {" >> $FILE_PATH +echo "public init() { }" >> $FILE_PATH +echo "public var baseURL: String {" >> $FILE_PATH +echo "return \"$BASE_URL\"" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "public var authorisationScheme: String {" >> $FILE_PATH +echo "return \"$AUTHORISATION_SCHEME\"" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "public var authorisationToken: String {" >> $FILE_PATH +echo "return \"$AUTHORISATION_TOKEN\"" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "}" >> $FILE_PATH \ No newline at end of file diff --git a/ci_scripts/make_files/dev/make_firebase.sh b/ci_scripts/make_files/dev/make_firebase.sh index dd18316..276bfd7 100644 --- a/ci_scripts/make_files/dev/make_firebase.sh +++ b/ci_scripts/make_files/dev/make_firebase.sh @@ -6,37 +6,39 @@ # Created by Bonsung Koo on 28/01/2025. # -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "CLIENT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "$FIREBASE_CLIENT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "REVERSED_CLIENT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "$FIREBASE_REVERSED_CLIENT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "API_KEY" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "$FIREBASE_API_KEY" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "GCM_SENDER_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "$FIREBASE_GCM_SENDER_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "PLIST_VERSION" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "1" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "BUNDLE_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "nz.surcharges.development" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "PROJECT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "surcharges-dev" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "STORAGE_BUCKET" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "$FIREBASE_STORAGE_BUCKET" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "IS_ADS_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "IS_ANALYTICS_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "IS_APPINVITE_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "IS_GCM_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "IS_SIGNIN_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "GOOGLE_APP_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "$FIREBASE_GOOGLE_APP_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist \ No newline at end of file +FILE_PATH=$CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Dev/GoogleService-Info.plist + +echo "" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "CLIENT_ID" >> $FILE_PATH +echo "$FIREBASE_CLIENT_ID" >> $FILE_PATH +echo "REVERSED_CLIENT_ID" >> $FILE_PATH +echo "$FIREBASE_REVERSED_CLIENT_ID" >> $FILE_PATH +echo "API_KEY" >> $FILE_PATH +echo "$FIREBASE_API_KEY" >> $FILE_PATH +echo "GCM_SENDER_ID" >> $FILE_PATH +echo "$FIREBASE_GCM_SENDER_ID" >> $FILE_PATH +echo "PLIST_VERSION" >> $FILE_PATH +echo "1" >> $FILE_PATH +echo "BUNDLE_ID" >> $FILE_PATH +echo "nz.surcharges.development" >> $FILE_PATH +echo "PROJECT_ID" >> $FILE_PATH +echo "surcharges-dev" >> $FILE_PATH +echo "STORAGE_BUCKET" >> $FILE_PATH +echo "$FIREBASE_STORAGE_BUCKET" >> $FILE_PATH +echo "IS_ADS_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "IS_ANALYTICS_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "IS_APPINVITE_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "IS_GCM_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "IS_SIGNIN_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "GOOGLE_APP_ID" >> $FILE_PATH +echo "$FIREBASE_GOOGLE_APP_ID" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "" >> $FILE_PATH \ No newline at end of file diff --git a/ci_scripts/make_files/prod/make_adsService.sh b/ci_scripts/make_files/prod/make_adsService.sh new file mode 100644 index 0000000..dd0182e --- /dev/null +++ b/ci_scripts/make_files/prod/make_adsService.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# make_adsService.sh +# +# +# Created by Bonsung Koo on 31/01/2025. +# + +FILE_PATH=$CI_PRIMARY_REPOSITORY_PATH/Surcharges/Shared/Services/Ads/ProductionAdsService/Sources/ProductionAdsService.swift + +echo "import Foundation" >> $FILE_PATH +echo "import AdsServiceProtocol" >> $FILE_PATH +echo "public final class ProductionAdsService: AdsServiceProtocol {" >> $FILE_PATH +echo "public init() { }" >> $FILE_PATH +echo "public var isShowingAds: Bool {" >> $FILE_PATH +echo "get {" >> $FILE_PATH +echo "return UserDefaults.standard.bool(forKey: "isShowingAds")" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "set {" >> $FILE_PATH +echo "UserDefaults.standard.set(newValue, forKey: "isShowingAds")" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "public var fixedBannerUnitId = \"$AD_FIXED_BANNER_UNIT_ID\"" >> $FILE_PATH +echo "public var listBannerUnitId = \"$AD_LIST_BANNER_UNIT_ID\"" >> $FILE_PATH +echo "}" >> $FILE_PAT \ No newline at end of file diff --git a/ci_scripts/make_files/prod/make_endpoint.sh b/ci_scripts/make_files/prod/make_endpoint.sh index 8a968be..138070c 100644 --- a/ci_scripts/make_files/prod/make_endpoint.sh +++ b/ci_scripts/make_files/prod/make_endpoint.sh @@ -6,17 +6,19 @@ # Created by Bonsung Koo on 28/01/2025. # -echo "import Foundation" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "import EndpointProtocol" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "public struct ProductionEndpoint: EndpointProtocol {" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "public init() { }" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "public var baseURL: String {" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "return \"$BASE_URL\"" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "}" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "public var authorisationScheme: String {" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "return \"$AUTHORISATION_SCHEME\"" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "}" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "public var authorisationToken: String {" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "return \"$AUTHORISATION_TOKEN\"" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "}" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift -echo "}" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift \ No newline at end of file +FILE_PATH=$CI_PRIMARY_REPOSITORY_PATH/Surcharges/DataSource/Endpoints/ProductionEndpoint/Sources/ProductionEndpoint.swift + +echo "import Foundation" >> $FILE_PATH +echo "import EndpointProtocol" >> $FILE_PATH +echo "public struct ProductionEndpoint: EndpointProtocol {" >> $FILE_PATH +echo "public init() { }" >> $FILE_PATH +echo "public var baseURL: String {" >> $FILE_PATH +echo "return \"$BASE_URL\"" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "public var authorisationScheme: String {" >> $FILE_PATH +echo "return \"$AUTHORISATION_SCHEME\"" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "public var authorisationToken: String {" >> $FILE_PATH +echo "return \"$AUTHORISATION_TOKEN\"" >> $FILE_PATH +echo "}" >> $FILE_PATH +echo "}" >> $FILE_PATH \ No newline at end of file diff --git a/ci_scripts/make_files/prod/make_firebase.sh b/ci_scripts/make_files/prod/make_firebase.sh index 465165e..e72a5b1 100644 --- a/ci_scripts/make_files/prod/make_firebase.sh +++ b/ci_scripts/make_files/prod/make_firebase.sh @@ -6,37 +6,39 @@ # Created by Bonsung Koo on 28/01/2025. # -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "CLIENT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "$FIREBASE_CLIENT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "REVERSED_CLIENT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "$FIREBASE_REVERSED_CLIENT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "API_KEY" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "$FIREBASE_API_KEY" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "GCM_SENDER_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "$FIREBASE_GCM_SENDER_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "PLIST_VERSION" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "1" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "BUNDLE_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "nz.surcharges" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "PROJECT_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "surcharges" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "STORAGE_BUCKET" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "$FIREBASE_STORAGE_BUCKET" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "IS_ADS_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "IS_ANALYTICS_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "IS_APPINVITE_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "IS_GCM_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "IS_SIGNIN_ENABLED" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "GOOGLE_APP_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "$FIREBASE_GOOGLE_APP_ID" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist -echo "" >> $CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist \ No newline at end of file +FILE_PATH=$CI_PRIMARY_REPOSITORY_PATH/Surcharges/Applications/Resources/Prod/GoogleService-Info.plist + +echo "" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "CLIENT_ID" >> $FILE_PATH +echo "$FIREBASE_CLIENT_ID" >> $FILE_PATH +echo "REVERSED_CLIENT_ID" >> $FILE_PATH +echo "$FIREBASE_REVERSED_CLIENT_ID" >> $FILE_PATH +echo "API_KEY" >> $FILE_PATH +echo "$FIREBASE_API_KEY" >> $FILE_PATH +echo "GCM_SENDER_ID" >> $FILE_PATH +echo "$FIREBASE_GCM_SENDER_ID" >> $FILE_PATH +echo "PLIST_VERSION" >> $FILE_PATH +echo "1" >> $FILE_PATH +echo "BUNDLE_ID" >> $FILE_PATH +echo "nz.surcharges" >> $FILE_PATH +echo "PROJECT_ID" >> $FILE_PATH +echo "surcharges" >> $FILE_PATH +echo "STORAGE_BUCKET" >> $FILE_PATH +echo "$FIREBASE_STORAGE_BUCKET" >> $FILE_PATH +echo "IS_ADS_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "IS_ANALYTICS_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "IS_APPINVITE_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "IS_GCM_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "IS_SIGNIN_ENABLED" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "GOOGLE_APP_ID" >> $FILE_PATH +echo "$FIREBASE_GOOGLE_APP_ID" >> $FILE_PATH +echo "" >> $FILE_PATH +echo "" >> $FILE_PATH \ No newline at end of file From 3f228fcfe812d223d4c90ea11ce50d3cf0c1fa87 Mon Sep 17 00:00:00 2001 From: Bonsung Koo Date: Fri, 31 Jan 2025 22:19:38 +1300 Subject: [PATCH 2/4] ci_script is changed #51 (#54) --- ci_scripts/ci_post_clone.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci_scripts/ci_post_clone.sh b/ci_scripts/ci_post_clone.sh index 889eb4c..9483ee6 100644 --- a/ci_scripts/ci_post_clone.sh +++ b/ci_scripts/ci_post_clone.sh @@ -18,6 +18,7 @@ then sh ./make_files/dev/make_endpoint.sh sh ./make_files/dev/make_firebase.sh + sh ./make_files/dev/make_adsService.sh cd .. @@ -42,6 +43,7 @@ else sh ./make_files/prod/make_endpoint.sh sh ./make_files/prod/make_firebase.sh + sh ./make_files/prod/make_adsService.sh cd .. From 78aa42b9546888340d4ad95ffa9029b24a76bcb6 Mon Sep 17 00:00:00 2001 From: Bonsung Koo Date: Fri, 31 Jan 2025 22:33:00 +1300 Subject: [PATCH 3/4] ci_scripts are changed #51 (#55) --- ci_scripts/make_files/dev/make_adsService.sh | 4 ++-- ci_scripts/make_files/prod/make_adsService.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ci_scripts/make_files/dev/make_adsService.sh b/ci_scripts/make_files/dev/make_adsService.sh index ee42807..9e6703d 100644 --- a/ci_scripts/make_files/dev/make_adsService.sh +++ b/ci_scripts/make_files/dev/make_adsService.sh @@ -14,10 +14,10 @@ echo "public final class DevelopmentAdsService: AdsServiceProtocol {" >> $FILE_P echo "public init() { }" >> $FILE_PATH echo "public var isShowingAds: Bool {" >> $FILE_PATH echo "get {" >> $FILE_PATH -echo "return UserDefaults.standard.bool(forKey: "isShowingAds")" >> $FILE_PATH +echo "return UserDefaults.standard.bool(forKey: \"isShowingAds\")" >> $FILE_PATH echo "}" >> $FILE_PATH echo "set {" >> $FILE_PATH -echo "UserDefaults.standard.set(newValue, forKey: "isShowingAds")" >> $FILE_PATH +echo "UserDefaults.standard.set(newValue, forKey: \"isShowingAds\")" >> $FILE_PATH echo "}" >> $FILE_PATH echo "}" >> $FILE_PATH echo "public var fixedBannerUnitId = \"$AD_FIXED_BANNER_UNIT_ID\"" >> $FILE_PATH diff --git a/ci_scripts/make_files/prod/make_adsService.sh b/ci_scripts/make_files/prod/make_adsService.sh index dd0182e..39bda75 100644 --- a/ci_scripts/make_files/prod/make_adsService.sh +++ b/ci_scripts/make_files/prod/make_adsService.sh @@ -14,10 +14,10 @@ echo "public final class ProductionAdsService: AdsServiceProtocol {" >> $FILE_PA echo "public init() { }" >> $FILE_PATH echo "public var isShowingAds: Bool {" >> $FILE_PATH echo "get {" >> $FILE_PATH -echo "return UserDefaults.standard.bool(forKey: "isShowingAds")" >> $FILE_PATH +echo "return UserDefaults.standard.bool(forKey: \"isShowingAds\")" >> $FILE_PATH echo "}" >> $FILE_PATH echo "set {" >> $FILE_PATH -echo "UserDefaults.standard.set(newValue, forKey: "isShowingAds")" >> $FILE_PATH +echo "UserDefaults.standard.set(newValue, forKey: \"isShowingAds\")" >> $FILE_PATH echo "}" >> $FILE_PATH echo "}" >> $FILE_PATH echo "public var fixedBannerUnitId = \"$AD_FIXED_BANNER_UNIT_ID\"" >> $FILE_PATH From a26db9e149e8e118f03d31c47361b24773afd379 Mon Sep 17 00:00:00 2001 From: Bonsung Koo Date: Fri, 31 Jan 2025 22:56:07 +1300 Subject: [PATCH 4/4] ci_scripts have been changed. #51 (#56) --- ci_scripts/make_files/dev/make_adsService.sh | 2 +- ci_scripts/make_files/prod/make_adsService.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci_scripts/make_files/dev/make_adsService.sh b/ci_scripts/make_files/dev/make_adsService.sh index 9e6703d..823b7d2 100644 --- a/ci_scripts/make_files/dev/make_adsService.sh +++ b/ci_scripts/make_files/dev/make_adsService.sh @@ -22,4 +22,4 @@ echo "}" >> $FILE_PATH echo "}" >> $FILE_PATH echo "public var fixedBannerUnitId = \"$AD_FIXED_BANNER_UNIT_ID\"" >> $FILE_PATH echo "public var listBannerUnitId = \"$AD_LIST_BANNER_UNIT_ID\"" >> $FILE_PATH -echo "}" >> $FILE_PAT \ No newline at end of file +echo "}" >> $FILE_PATH \ No newline at end of file diff --git a/ci_scripts/make_files/prod/make_adsService.sh b/ci_scripts/make_files/prod/make_adsService.sh index 39bda75..f782805 100644 --- a/ci_scripts/make_files/prod/make_adsService.sh +++ b/ci_scripts/make_files/prod/make_adsService.sh @@ -22,4 +22,4 @@ echo "}" >> $FILE_PATH echo "}" >> $FILE_PATH echo "public var fixedBannerUnitId = \"$AD_FIXED_BANNER_UNIT_ID\"" >> $FILE_PATH echo "public var listBannerUnitId = \"$AD_LIST_BANNER_UNIT_ID\"" >> $FILE_PATH -echo "}" >> $FILE_PAT \ No newline at end of file +echo "}" >> $FILE_PATH \ No newline at end of file