1 // Copyright 2022-present 650 Industries. All rights reserved. 2 3 import AppTrackingTransparency 4 import ABI49_0_0ExpoModulesCore 5 6 public class TrackingTransparencyPermissionRequester: NSObject, ABI49_0_0EXPermissionsRequester { permissionTypenull7 static public func permissionType() -> String { 8 return "appTracking" 9 } 10 requestPermissionsnull11 public func requestPermissions(resolver resolve: @escaping ABI49_0_0EXPromiseResolveBlock, rejecter reject: ABI49_0_0EXPromiseRejectBlock) { 12 if #available(iOS 14, *) { 13 ATTrackingManager.requestTrackingAuthorization() { [weak self] _ in 14 resolve(self?.getPermissions()); 15 } 16 } else { 17 resolve(self.getPermissions()); 18 } 19 } 20 getPermissionsnull21 public func getPermissions() -> [AnyHashable: Any] { 22 var status: ABI49_0_0EXPermissionStatus 23 24 if #available(iOS 14, *) { 25 var systemStatus: ATTrackingManager.AuthorizationStatus 26 27 let trackingUsageDescription = Bundle.main.object(forInfoDictionaryKey: "NSUserTrackingUsageDescription") 28 if trackingUsageDescription == nil { 29 ABI49_0_0EXFatal(ABI49_0_0EXErrorWithMessage(""" 30 This app is missing 'NSUserTrackingUsageDescription' so tracking transparency will fail. \ 31 Ensure that this key exists in app's Info.plist. 32 """)) 33 systemStatus = .denied 34 } else { 35 systemStatus = ATTrackingManager.trackingAuthorizationStatus 36 } 37 38 switch systemStatus { 39 case .authorized: 40 status = ABI49_0_0EXPermissionStatusGranted 41 case .restricted, 42 .denied: 43 status = ABI49_0_0EXPermissionStatusDenied 44 case .notDetermined: 45 fallthrough 46 @unknown default: 47 status = ABI49_0_0EXPermissionStatusUndetermined 48 } 49 } else { 50 status = ABI49_0_0EXPermissionStatusGranted 51 } 52 53 return [ 54 "status": status.rawValue 55 ] 56 } 57 } 58