{"library":"pyobjc-framework-apptrackingtransparency","title":"App Tracking Transparency Framework for PyObjC","description":"pyobjc-framework-AppTrackingTransparency provides Python wrappers for Apple's App Tracking Transparency framework on macOS. This framework enables applications to request user authorization for tracking across apps and websites, a critical privacy feature introduced in iOS 14 and macOS 11. It is part of the larger PyObjC project, which offers Python bindings for many macOS (Cocoa) frameworks. The current version is 12.1, with releases typically aligning with macOS SDK updates and Python compatibility.","language":"python","status":"active","last_verified":"Sat May 16","install":{"commands":["pip install pyobjc-framework-apptrackingtransparency"],"cli":null},"imports":["from AppTrackingTransparency import ATTrackingManager","from AppTrackingTransparency import ATTrackingManagerAuthorizationStatus"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import objc\nfrom Foundation import NSObject, NSLog, NSRunLoop, NSDefaultRunLoopMode, objc_object\nfrom AppTrackingTransparency import ATTrackingManager, ATTrackingManagerAuthorizationStatus\n\nclass TrackingDelegate(NSObject):\n    def init(self):\n        self = objc.super(TrackingDelegate, self).init()\n        if self is None: return None\n        return self\n\n    def requestTrackingPermission(self):\n        current_status = ATTrackingManager.trackingAuthorizationStatus()\n        NSLog(f\"Initial tracking status: {current_status}\")\n\n        if current_status == ATTrackingManagerAuthorizationStatus.notDetermined:\n            NSLog(\"Requesting tracking authorization...\")\n            # Objective-C method with completion handler translates to PyObjC with underscore suffix\n            ATTrackingManager.requestTrackingAuthorization_(self.trackingAuthorizationCompletionHandler_)\n        else:\n            NSLog(\"Authorization already determined or restricted.\")\n            self.checkTrackingStatus()\n\n    def trackingAuthorizationCompletionHandler_(self, status: ATTrackingManagerAuthorizationStatus) -> None:\n        # This handler might not be called on the main thread; dispatch UI updates if any.\n        NSLog(f\"Tracking authorization completion handler called with status: {status}\")\n        self.checkTrackingStatus()\n\n    def checkTrackingStatus(self):\n        status = ATTrackingManager.trackingAuthorizationStatus()\n        if status == ATTrackingManagerAuthorizationStatus.authorized:\n            NSLog(\"Tracking authorized!\")\n        elif status == ATTrackingManagerAuthorizationStatus.denied:\n            NSLog(\"Tracking denied.\")\n        elif status == ATTrackingManagerAuthorizationStatus.notDetermined:\n            NSLog(\"Tracking not determined.\")\n        elif status == ATTrackingManagerAuthorizationStatus.restricted:\n            NSLog(\"Tracking restricted by parental controls or MDM.\")\n        else:\n            NSLog(\"Unknown tracking status.\")\n\ndef main():\n    delegate = TrackingDelegate.alloc().init()\n    delegate.requestTrackingPermission()\n\n    # For the completion handler to be called, an NSRunLoop must be active.\n    # In a full AppKit application, this is handled automatically.\n    # For a console script, run a short loop.\n    NSLog(\"Running runloop for 5 seconds to allow async callback...\")\n    NSRunLoop.currentRunLoop().runUntilDate_(objc.NSTimeIntervalToBeDateTime(objc.current_time() + 5.0))\n    NSLog(\"Runloop finished.\")\n\nif __name__ == '__main__':\n    main()\n","lang":"python","description":"This example demonstrates how to request app tracking authorization and check its status. For the authorization prompt to appear, you *must* add the `NSUserTrackingUsageDescription` key with a purpose string to your application's `Info.plist` file (an Xcode project setting, not Python code). The completion handler for `requestTrackingAuthorization_` is asynchronous and requires a running `NSRunLoop` to execute.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-16","installed_version":null,"pypi_latest":"12.1","is_stale":null,"summary":{"python_range":"3.10–3.9","success_rate":0,"avg_install_s":null,"avg_import_s":null,"wheel_type":null},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":3.3,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":3.2,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":3.1,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":2.6,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyobjc-framework-apptrackingtransparency","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":3.9,"import_time_s":null,"mem_mb":null,"disk_size":null}]}}