diff --git a/Targets/D3N/Sources/App/AppDelegate.swift b/Targets/D3N/Sources/App/AppDelegate.swift index 093f7df..8b82c96 100644 --- a/Targets/D3N/Sources/App/AppDelegate.swift +++ b/Targets/D3N/Sources/App/AppDelegate.swift @@ -8,14 +8,24 @@ import UIKit import SwiftUI -import FirebaseCore - import AppTrackingTransparency +import FirebaseCore +import GoogleMobileAds + class AppDelegate: NSObject, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + if ATTrackingManager.trackingAuthorizationStatus == .notDetermined { + + } else { + ATTrackingManager.requestTrackingAuthorization { status in + GADMobileAds.sharedInstance().start(completionHandler: nil) + } + } + FirebaseApp.configure() - return true + + return true } } diff --git a/Targets/D3N/Sources/Config/D3N-Info.plist b/Targets/D3N/Sources/Config/D3N-Info.plist index a335ffb..62900ef 100644 --- a/Targets/D3N/Sources/Config/D3N-Info.plist +++ b/Targets/D3N/Sources/Config/D3N-Info.plist @@ -11,22 +11,6 @@ NSAllowsArbitraryLoads - SERVER_HOST - $(SERVER_HOST) - REWARDED_ID - - - NSMessage - - NSMenuItem - - default - - - - - OPENAI_API_KEY - $(OPENAI_API_KEY) CFBundlePackageType APPL Primary App Icon Set Name @@ -38,14 +22,219 @@ CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleShortVersionString - 2.5 + 2.7.1 CFBundleVersion - 2.5.0 + 2.7.1 UILaunchStoryboardName Launch CFBundleDisplayName D3N CFBundleName $(PRODUCT_NAME) + SERVER_HOST + $(SERVER_HOST) + APP_OPEN_ADS_ID + $(APP_OPEN_ADS_ID) + GADApplicationIdentifier + ca-app-pub-2392187154020666~4251839269 + SKAdNetworkItems + + + SKAdNetworkIdentifier + cstr6suwn9.skadnetwork + + + SKAdNetworkIdentifier + 4fzdc2evr5.skadnetwork + + + SKAdNetworkIdentifier + 4pfyvq9l8r.skadnetwork + + + SKAdNetworkIdentifier + 2fnua5tdw4.skadnetwork + + + SKAdNetworkIdentifier + ydx93a7ass.skadnetwork + + + SKAdNetworkIdentifier + 5a6flpkh64.skadnetwork + + + SKAdNetworkIdentifier + p78axxw29g.skadnetwork + + + SKAdNetworkIdentifier + v72qych5uu.skadnetwork + + + SKAdNetworkIdentifier + ludvb6z3bs.skadnetwork + + + SKAdNetworkIdentifier + cp8zw746q7.skadnetwork + + + SKAdNetworkIdentifier + 3sh42y64q3.skadnetwork + + + SKAdNetworkIdentifier + c6k4g5qg8m.skadnetwork + + + SKAdNetworkIdentifier + s39g8k73mm.skadnetwork + + + SKAdNetworkIdentifier + 3qy4746246.skadnetwork + + + SKAdNetworkIdentifier + f38h382jlk.skadnetwork + + + SKAdNetworkIdentifier + hs6bdukanm.skadnetwork + + + SKAdNetworkIdentifier + v4nxqhlyqp.skadnetwork + + + SKAdNetworkIdentifier + wzmmz9fp6w.skadnetwork + + + SKAdNetworkIdentifier + yclnxrl5pm.skadnetwork + + + SKAdNetworkIdentifier + t38b2kh725.skadnetwork + + + SKAdNetworkIdentifier + 7ug5zh24hu.skadnetwork + + + SKAdNetworkIdentifier + gta9lk7p23.skadnetwork + + + SKAdNetworkIdentifier + vutu7akeur.skadnetwork + + + SKAdNetworkIdentifier + y5ghdn5j9k.skadnetwork + + + SKAdNetworkIdentifier + n6fk4nfna4.skadnetwork + + + SKAdNetworkIdentifier + v9wttpbfk9.skadnetwork + + + SKAdNetworkIdentifier + n38lu8286q.skadnetwork + + + SKAdNetworkIdentifier + 47vhws6wlr.skadnetwork + + + SKAdNetworkIdentifier + kbd757ywx3.skadnetwork + + + SKAdNetworkIdentifier + 9t245vhmpl.skadnetwork + + + SKAdNetworkIdentifier + eh6m2bh4zr.skadnetwork + + + SKAdNetworkIdentifier + a2p9lx4jpn.skadnetwork + + + SKAdNetworkIdentifier + 22mmun2rn5.skadnetwork + + + SKAdNetworkIdentifier + 4468km3ulz.skadnetwork + + + SKAdNetworkIdentifier + 2u9pt9hc89.skadnetwork + + + SKAdNetworkIdentifier + 8s468mfl3y.skadnetwork + + + SKAdNetworkIdentifier + klf5c3l5u5.skadnetwork + + + SKAdNetworkIdentifier + ppxm28t8ap.skadnetwork + + + SKAdNetworkIdentifier + ecpz2srf59.skadnetwork + + + SKAdNetworkIdentifier + uw77j35x4d.skadnetwork + + + SKAdNetworkIdentifier + pwa73g5rt2.skadnetwork + + + SKAdNetworkIdentifier + mlmmfzh3r3.skadnetwork + + + SKAdNetworkIdentifier + 578prtvx9j.skadnetwork + + + SKAdNetworkIdentifier + 4dzt52r2t5.skadnetwork + + + SKAdNetworkIdentifier + e5fvkxwrpn.skadnetwork + + + SKAdNetworkIdentifier + 8c4e2ghe7u.skadnetwork + + + SKAdNetworkIdentifier + zq492l623r.skadnetwork + + + SKAdNetworkIdentifier + 3rd42ekr43.skadnetwork + + + SKAdNetworkIdentifier + 3qcr597p9d.skadnetwork + + diff --git a/Targets/D3N/Sources/Config/Environment.swift b/Targets/D3N/Sources/Config/Environment.swift index 6434b94..5d5698c 100644 --- a/Targets/D3N/Sources/Config/Environment.swift +++ b/Targets/D3N/Sources/Config/Environment.swift @@ -12,4 +12,8 @@ public struct Environment { public static var baseURL: String { return Bundle.main.infoDictionary?["SERVER_HOST"] as? String ?? "" } + + public static var appOpenAdsId: String { + return Bundle.main.infoDictionary?["APP_OPEN_ADS_ID"] as? String ?? "" + } } diff --git a/Targets/D3N/Sources/Core/Admob/AppOpenAds.swift b/Targets/D3N/Sources/Core/Admob/AppOpenAds.swift new file mode 100644 index 0000000..d79aa16 --- /dev/null +++ b/Targets/D3N/Sources/Core/Admob/AppOpenAds.swift @@ -0,0 +1,55 @@ +// +// Opening.swift +// D3N +// +// Created by 송영모 on 12/5/23. +// Copyright © 2023 sju. All rights reserved. +// + +import SwiftUI +import GoogleMobileAds +import UIKit + +public final class AppOpenAds: NSObject { + let id: String + var ad: GADAppOpenAd? + + var completion: (() -> Void)? + + public init(id: String) { + self.id = id + super.init() + load() + } + + private func load(){ + let request = GADRequest() + + GADAppOpenAd.load( + withAdUnitID: id, + request: request, + completionHandler: { [self] ad, error in + if let error = error { + print("Failed to load rewarded ad with error: \(error.localizedDescription)") + return + } + print("Rewarded ad loaded.") + self.ad = ad + self.show { } + } + ) + } + + public func show(completion: @escaping () -> Void){ + self.completion = completion + + if let ad = ad, + let root = (UIApplication.shared.connectedScenes.first as? UIWindowScene)?.windows.first?.rootViewController { + ad.present(fromRootViewController: root) + self.completion?() + } else { + print("Ad wasn't ready") + } + } +} + diff --git a/Targets/D3N/Sources/Feature/MainTab/MainTabStore.swift b/Targets/D3N/Sources/Feature/MainTab/MainTabStore.swift index eee8304..b7e7718 100644 --- a/Targets/D3N/Sources/Feature/MainTab/MainTabStore.swift +++ b/Targets/D3N/Sources/Feature/MainTab/MainTabStore.swift @@ -9,6 +9,8 @@ import Foundation import ComposableArchitecture +import GoogleMobileAds + enum MainScene: Hashable { case question } @@ -20,6 +22,8 @@ struct MainTabStore: Reducer { var today: TodayNewsNavigationStackStore.State? = .init() var allNews: AllNewsNavigationStackStore.State? = .init() var myPage: MyPageNavigationStackStore.State? = .init() + + var appOpenAds: AppOpenAds = .init(id: Environment.appOpenAdsId) } enum Action: BindableAction, Equatable { diff --git a/Tuist/Dependencies.swift b/Tuist/Dependencies.swift index 0ed5f19..46b83f7 100644 --- a/Tuist/Dependencies.swift +++ b/Tuist/Dependencies.swift @@ -10,7 +10,8 @@ import ProjectDescription let spm = SwiftPackageManagerDependencies([ .remote(url: "https://github.com/pointfreeco/swift-composable-architecture", requirement: .upToNextMajor(from: "1.2.0")), .remote(url: "https://github.com/Moya/Moya.git", requirement: .upToNextMajor(from: "15.0.0")), - .remote(url: "https://github.com/firebase/firebase-ios-sdk", requirement: .upToNextMajor(from: "10.15.0")) + .remote(url: "https://github.com/firebase/firebase-ios-sdk", requirement: .upToNextMajor(from: "10.15.0")), + .remote(url: "https://github.com/googleads/swift-package-manager-google-mobile-ads", requirement: .upToNextMajor(from: "10.9.0")) ]) let dependencies = Dependencies( diff --git a/Tuist/ProjectDescriptionHelpers/Project+Templates.swift b/Tuist/ProjectDescriptionHelpers/Project+Templates.swift index 43a875a..06cffba 100644 --- a/Tuist/ProjectDescriptionHelpers/Project+Templates.swift +++ b/Tuist/ProjectDescriptionHelpers/Project+Templates.swift @@ -14,6 +14,7 @@ extension Project { .external(name: "ComposableArchitecture"), .external(name: "Moya"), .external(name: "FirebaseAnalytics"), + .external(name: "GoogleMobileAds") ] var targets = makeAppTargets(