1 | import Foundation
|
2 | import AppConsent
|
3 | import os
|
4 |
|
5 | extension OSLog {
|
6 | static let sfbxlog: OSLog = OSLog(subsystem: "io.sfbx.appconsent", category: "AppConsent")
|
7 | }
|
8 |
|
9 | @objc(AppconsentClearReactnative)
|
10 | class AppconsentClearReactnative: NSObject {
|
11 | private var notice: ACNotice?
|
12 |
|
13 | @objc
|
14 | func constantsToExport() -> [AnyHashable : Any]! {
|
15 | return ["version": "4.4.7"]
|
16 | }
|
17 |
|
18 | @objc
|
19 | static func requiresMainQueueSetup() -> Bool {
|
20 | return true
|
21 | }
|
22 |
|
23 | @objc
|
24 | func configureWith(_ appKey: String, forceApplyGDPR: Bool, forceATT: Bool) {
|
25 | self.notice = ACNotice(withAppKey: appKey, forceApplyGDPR: forceApplyGDPR, forceATT: forceATT)
|
26 | }
|
27 |
|
28 | @objc
|
29 | func present(_ force: Bool) {
|
30 | OperationQueue.main.addOperation {
|
31 | guard let controller = UIApplication.shared.delegate?.window??.rootViewController else {
|
32 | os_log("AppConsent: Failed to attach CMP to window rootViewController.", log: OSLog.sfbxlog, type: .error)
|
33 | return
|
34 | }
|
35 | self.notice?.presentNotice(force: force, viewController: controller)
|
36 | }
|
37 | }
|
38 |
|
39 | @objc
|
40 | func checkForUpdate(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
41 | self.notice?.checkForUpdate({ success in
|
42 | resolver?(success)
|
43 | }, failure: { error in
|
44 | rejecter?("checkForUpdateFailure", "Error returned", error)
|
45 | })
|
46 | }
|
47 |
|
48 | @objc
|
49 | func isGDPRCountry(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
50 | guard let value = self.notice?.isGDPRCountry() else {
|
51 | rejecter?("isGDPRCountryFailure", "Unknown value", nil)
|
52 | return
|
53 | }
|
54 | resolver?(value)
|
55 | }
|
56 |
|
57 | @objc
|
58 | func consentAlreadyGiven(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
59 | guard let value = self.notice?.consentGiven() else {
|
60 | rejecter?("consentAlreadyGivenFailure", "Unknown value", nil)
|
61 | return
|
62 | }
|
63 | resolver?(value)
|
64 | }
|
65 |
|
66 | @objc
|
67 | func consentGiven(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
68 | guard let value = self.notice?.consentGiven() else {
|
69 | rejecter?("consentGivenFailure", "Unknown value", nil)
|
70 | return
|
71 | }
|
72 | resolver?(value)
|
73 | }
|
74 |
|
75 | @objc
|
76 | func clearConsent() {
|
77 | self.notice?.clearConsent()
|
78 | }
|
79 |
|
80 | @objc
|
81 | func extraConsentableAllowed(_ extraId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
82 | guard let value = self.notice?.extraConsentableAllowed(extraId: extraId) else {
|
83 | rejecter?("extraConsentableAllowedFailure", "Unknown value", nil)
|
84 | return
|
85 | }
|
86 | resolver?(value)
|
87 | }
|
88 |
|
89 | @objc
|
90 | func extraVendorAllowed(_ extraId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
91 | guard let value = self.notice?.extraVendorAllowed(extraId: extraId) else {
|
92 | rejecter?("extraVendorAllowedFailure", "Unknown value", nil)
|
93 | return
|
94 | }
|
95 | resolver?(value)
|
96 | }
|
97 |
|
98 | @objc
|
99 | func extraFloatingPurposeAllowed(_ extraId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
100 | guard let value = self.notice?.floatingPurposeAllowed(extraId: extraId) else {
|
101 | rejecter?("extraFloatingPurposeAllowedFailure", "Unknown value", nil)
|
102 | return
|
103 | }
|
104 | resolver?(value)
|
105 | }
|
106 |
|
107 | @objc
|
108 | func setConsentableConsent(_ values: [String: NSInteger], resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
109 | self.notice?.setConsentableConsents(values: values, success: {
|
110 | resolver?(true)
|
111 | }, failure: { error in
|
112 | rejecter?("setConsentableConsentFailure", "Error returned", error)
|
113 | })
|
114 | }
|
115 |
|
116 | @objc
|
117 | func setExtraConsentableConsent(_ values: [String: NSInteger], resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
118 | self.notice?.setExtraConsentableConsents(values: values, success: {
|
119 | resolver?(true)
|
120 | }, failure: { error in
|
121 | rejecter?("setExtraConsentableConsentFailure", "Error returned", error)
|
122 | })
|
123 | }
|
124 |
|
125 | @objc
|
126 | func getExternalIds(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
127 | guard let value: Dictionary<String, String> = self.notice?.getExternalIds() else {
|
128 | os_log("AppConsent: ERROR getExternalIds.", log: OSLog.sfbxlog, type: .error)
|
129 | rejecter?("getExternalIdsFailure", "Unknown value", nil)
|
130 | return
|
131 | }
|
132 | os_log("AppConsent: getExternalIds. %{public}s", log: OSLog.sfbxlog, type: .info, value.debugDescription)
|
133 | resolver?(value.debugDescription)
|
134 | }
|
135 |
|
136 | @objc
|
137 | func setExternalIds(_ ids: [String: String], resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
138 | guard let value = self.notice?.setExternalIds(externalIds: ids) else {
|
139 | os_log("AppConsent: ERROR setExternalIds.", log: OSLog.sfbxlog, type: .error)
|
140 | rejecter?("setExternalIdsFailure", "Unknown value", nil)
|
141 | return
|
142 | }
|
143 | resolver?(true)
|
144 | }
|
145 |
|
146 | @objc
|
147 | func saveExternalIds(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
148 | self.notice?.saveExternalIds(success: { state, configuration in
|
149 | resolver?(true)
|
150 | }, failure: { error in
|
151 | os_log("AppConsent: ERROR saveExternalIds: %{public}s", log: OSLog.sfbxlog, type: .error, error.localizedDescription)
|
152 | rejecter?("saveExternalIdsFailure", error.localizedDescription, error)
|
153 | })
|
154 | }
|
155 |
|
156 |
|
157 |
|
158 |
|
159 |
|
160 | @objc
|
161 | func consentableAllowedByObjectId(_ objectId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
162 | guard let id: UInt32 = UInt32(objectId) else {
|
163 | rejecter?("consentableAllowedByIABIdFailure", "bad objectId value, not an int", nil)
|
164 | return
|
165 | }
|
166 | guard let value = self.notice?.consentableAllowed(objectId: id) else {
|
167 | rejecter?("consentableAllowedByObjectIdFailure", "Unknown value", nil)
|
168 | return
|
169 | }
|
170 | resolver?(value)
|
171 | }
|
172 |
|
173 | @objc
|
174 | func consentableAllowedByIABId(_ iabId: String, type: NSInteger, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
175 | guard let id: UInt32 = UInt32(iabId) else {
|
176 | rejecter?("consentableAllowedByIABIdFailure", "bad iabId value, not an int", nil)
|
177 | return
|
178 | }
|
179 | guard let consentableType = ACConsentableType(rawValue: type) else {
|
180 | rejecter?("consentableAllowedByIABIdFailure", "Unknown consentable type", nil)
|
181 | return
|
182 | }
|
183 | guard let value = self.notice?.consentableAllowed(iabId: id, type: consentableType) else {
|
184 | rejecter?("consentableAllowedByIABIdFailure", "Unknown iabId", nil)
|
185 | return
|
186 | }
|
187 | resolver?(value)
|
188 | }
|
189 |
|
190 | @objc
|
191 | func vendorAllowedByIABId(_ iabId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
192 | guard let id: UInt32 = UInt32(iabId) else {
|
193 | rejecter?("consentableAllowedByIABIdFailure", "bad iabId value, not an int", nil)
|
194 | return
|
195 | }
|
196 | guard let value = self.notice?.vendorAllowed(iabId: id) else {
|
197 | rejecter?("vendorAllowedByIABIdFailure", "Unknown value", nil)
|
198 | return
|
199 | }
|
200 | resolver?(value)
|
201 | }
|
202 |
|
203 | @objc
|
204 | func stackAllowedByIABId(_ iabId: String, resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
205 | guard let id: UInt32 = UInt32(iabId) else {
|
206 | rejecter?("consentableAllowedByIABIdFailure", "bad iabId value, not an int", nil)
|
207 | return
|
208 | }
|
209 | guard let value = self.notice?.stackAllowed(iabId: id) else {
|
210 | rejecter?("stackAllowedByIABIdFailure", "Unknown value", nil)
|
211 | return
|
212 | }
|
213 | resolver?(value)
|
214 | }
|
215 |
|
216 | @objc
|
217 | func getAppKey(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
218 | guard let value = self.notice?.appKey else {
|
219 | rejecter?("getAppKeyFailure", "Unknown value", nil)
|
220 | return
|
221 | }
|
222 | resolver?(value)
|
223 | }
|
224 |
|
225 | @objc
|
226 | func getForceApplyGDPR(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
227 | guard let value = self.notice?.forceApplyGDPR else {
|
228 | rejecter?("getForceApplyGDPRFailure", "Unknown value", nil)
|
229 | return
|
230 | }
|
231 | resolver?(value)
|
232 | }
|
233 |
|
234 |
|
235 |
|
236 |
|
237 |
|
238 | @objc
|
239 | func getForceATT(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
240 | guard let value = self.notice?.forceATT else {
|
241 | rejecter?("getForceATTFailure", "Unknown value", nil)
|
242 | return
|
243 | }
|
244 | resolver?(value)
|
245 | }
|
246 |
|
247 | @objc
|
248 | func appTrackingIsAvailable(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
249 | guard let value = self.notice?.appTrackingIsAvailable() else {
|
250 | rejecter?("appTrackingIsAvailableFailure", "Unknown value", nil)
|
251 | return
|
252 | }
|
253 | resolver?(value)
|
254 | }
|
255 |
|
256 | @objc
|
257 | func appTrackingAuthorizationGiven(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
258 | guard let value = self.notice?.appTrackingAuthorizationGiven() else {
|
259 | rejecter?("appTrackingAuthorizationGivenFailure", "Unknown value", nil)
|
260 | return
|
261 | }
|
262 | resolver?(value.rawValue)
|
263 | }
|
264 |
|
265 | @objc
|
266 | func appTrackingAuthorizationStatus(_ resolver: RCTPromiseResolveBlock?, rejecter: RCTPromiseRejectBlock?) {
|
267 | guard let value = self.notice?.appTrackingAuthorizationStatus() else {
|
268 | rejecter?("appTrackingAuthorizationStatusFailure", "Unknown value", nil)
|
269 | return
|
270 | }
|
271 | resolver?(value.rawValue)
|
272 | }
|
273 | }
|