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(