@@ -261,119 +261,65 @@ extension ViewController: WKScriptMessageHandler {
261261// MARK: - App Tracking Transparency Handlers
262262extension ViewController {
263263
264+ // Helper method to dispatch ATT events to webview with proper JSON serialization
265+ private func dispatchATTEvent( eventName: String , detail: [ String : Any ] ) {
266+ guard let jsonData = try ? JSONSerialization . data ( withJSONObject: detail) ,
267+ let jsonString = String ( data: jsonData, encoding: . utf8) else {
268+ print ( " Error serializing ATT response for event: \( eventName) " )
269+ return
270+ }
271+ let script = """
272+ window.dispatchEvent(new CustomEvent(' \( eventName) ', {
273+ detail: \( jsonString)
274+ }));
275+ """
276+ vibetype. webView. evaluateJavaScript ( script) { result, error in
277+ if let error = error {
278+ print ( " Error dispatching \( eventName) : \( error) " )
279+ }
280+ }
281+ }
282+
264283 func handleATTPermissionRequest( ) {
265284 if #available( iOS 14 , * ) {
266285 TrackingTransparencyManager . requestPermission { status in
267286 let statusString = TrackingTransparencyManager . statusToString ( status)
268287 let detail : [ String : Any ] = [ " status " : statusString]
269- guard let jsonData = try ? JSONSerialization . data ( withJSONObject: detail) ,
270- let jsonString = String ( data: jsonData, encoding: . utf8) else {
271- print ( " Error serializing ATT permission response " )
272- return
273- }
274- let script = """
275- window.dispatchEvent(new CustomEvent('attPermissionResponse', {
276- detail: \( jsonString)
277- }));
278- """
279- vibetype. webView. evaluateJavaScript ( script) { result, error in
280- if let error = error {
281- print ( " Error dispatching ATT permission response: \( error) " )
282- }
283- }
288+ self . dispatchATTEvent ( eventName: " attPermissionResponse " , detail: detail)
284289 }
285290 } else {
286291 // ATT is only available on iOS 14+
287- let script = """
288- window.dispatchEvent(new CustomEvent('attPermissionResponse', {
289- detail: { status: 'unavailable', error: 'ATT requires iOS 14 or later' }
290- }));
291- """
292- vibetype. webView. evaluateJavaScript ( script) { result, error in
293- if let error = error {
294- print ( " Error dispatching ATT permission response: \( error) " )
295- }
296- }
292+ let detail : [ String : Any ] = [ " status " : " unavailable " , " error " : " ATT requires iOS 14 or later " ]
293+ dispatchATTEvent ( eventName: " attPermissionResponse " , detail: detail)
297294 }
298295 }
299296
300297 func handleATTGetStatus( ) {
301298 if #available( iOS 14 , * ) {
302299 let statusString = TrackingTransparencyManager . getStatusString ( )
303300 let detail : [ String : Any ] = [ " status " : statusString]
304- guard let jsonData = try ? JSONSerialization . data ( withJSONObject: detail) ,
305- let jsonString = String ( data: jsonData, encoding: . utf8) else {
306- print ( " Error serializing ATT status response " )
307- return
308- }
309- let script = """
310- window.dispatchEvent(new CustomEvent('attStatusResponse', {
311- detail: \( jsonString)
312- }));
313- """
314- vibetype. webView. evaluateJavaScript ( script) { result, error in
315- if let error = error {
316- print ( " Error dispatching ATT status response: \( error) " )
317- }
318- }
301+ dispatchATTEvent ( eventName: " attStatusResponse " , detail: detail)
319302 } else {
320303 // ATT is only available on iOS 14+
321304 let detail : [ String : Any ] = [ " status " : " unavailable " ]
322- guard let jsonData = try ? JSONSerialization . data ( withJSONObject: detail) ,
323- let jsonString = String ( data: jsonData, encoding: . utf8) else {
324- print ( " Error serializing ATT status response " )
325- return
326- }
327- let script = """
328- window.dispatchEvent(new CustomEvent('attStatusResponse', {
329- detail: \( jsonString)
330- }));
331- """
332- vibetype. webView. evaluateJavaScript ( script) { result, error in
333- if let error = error {
334- print ( " Error dispatching ATT status response: \( error) " )
335- }
336- }
305+ dispatchATTEvent ( eventName: " attStatusResponse " , detail: detail)
337306 }
338307 }
339308
340309 func handleATTGetIDFA( ) {
341310 if #available( iOS 14 , * ) {
342311 let idfa = TrackingTransparencyManager . getIDFA ( )
343- let detail : [ String : Any ? ] = [ " idfa " : idfa]
344- guard let jsonData = try ? JSONSerialization . data ( withJSONObject: detail, options: [ ] ) ,
345- let jsonString = String ( data: jsonData, encoding: . utf8) else {
346- print ( " Error serializing ATT IDFA response " )
347- return
348- }
349- let script = """
350- window.dispatchEvent(new CustomEvent('attIDFAResponse', {
351- detail: \( jsonString)
352- }));
353- """
354- vibetype. webView. evaluateJavaScript ( script) { result, error in
355- if let error = error {
356- print ( " Error dispatching ATT IDFA response: \( error) " )
357- }
312+ var detail : [ String : Any ] = [ : ]
313+ if let idfa = idfa {
314+ detail [ " idfa " ] = idfa
315+ } else {
316+ detail [ " idfa " ] = NSNull ( )
358317 }
318+ dispatchATTEvent ( eventName: " attIDFAResponse " , detail: detail)
359319 } else {
360320 // ATT is only available on iOS 14+
361- let detail : [ String : Any ? ] = [ " idfa " : nil , " error " : " ATT requires iOS 14 or later " ]
362- guard let jsonData = try ? JSONSerialization . data ( withJSONObject: detail, options: [ ] ) ,
363- let jsonString = String ( data: jsonData, encoding: . utf8) else {
364- print ( " Error serializing ATT IDFA response " )
365- return
366- }
367- let script = """
368- window.dispatchEvent(new CustomEvent('attIDFAResponse', {
369- detail: \( jsonString)
370- }));
371- """
372- vibetype. webView. evaluateJavaScript ( script) { result, error in
373- if let error = error {
374- print ( " Error dispatching ATT IDFA response: \( error) " )
375- }
376- }
321+ let detail : [ String : Any ] = [ " idfa " : NSNull ( ) , " error " : " ATT requires iOS 14 or later " ]
322+ dispatchATTEvent ( eventName: " attIDFAResponse " , detail: detail)
377323 }
378324 }
379325}
0 commit comments