E11 — ArtCut / Pro: версии и запрос разрешения на отслеживание Дата русского перевода: 13 сентября 2026 г. Время сохранения оригинала (UTC): 2026-09-12T15:40:59.124Z Тип материала: Выдержка из текущего исходного кода Показаны различия на этапе компиляции и один путь запроса разрешения. Они не доказывают состав связанных фреймворков в исторических архивах, успешное получение согласия на устройствах или загрузку локальных исправлений. Переведены пояснения и сведения о происхождении материалов. Код и снимки экрана оставлены на языке оригинала; русские тексты не заменяют исходные свидетельства и не означают нового одобрения Apple. Проект: VideoEditorPro Файл: VideoEditorPro/App/AppVariant.swift Выбранные строки: 1–22 Выдержка с исходными номерами строк; выбранные строки сохранены без изменений. SHA-256 полного исходного файла: 72e091896724be8dca7c2981a23f593c8b3e9a98dd3d4b1f361835180455cf76 SHA-256 выдержки с номерами строк: 5e59357e3959e55b04ba12ef0a8e229041ee6b9841f6a51ece760ba0c365eb38 1 | import Foundation 2 | 3 | enum AppDistribution { 4 | case paid 5 | case freeWithAds 6 | } 7 | 8 | enum AppVariant { 9 | /// The App Store listing for the paid build. Keep this as a universal 10 | /// App Store URL so the storefront can localize the product name. 11 | static let proAppStoreURL = URL(string: "https://apps.apple.com/app/id6790354436")! 12 | 13 | #if ARTCUT_FREE 14 | static let distribution: AppDistribution = .freeWithAds 15 | static let displaysAds = true 16 | static let displayName = "ArtCut" 17 | #else 18 | static let distribution: AppDistribution = .paid 19 | static let displaysAds = false 20 | static let displayName = "ArtCutPro" 21 | #endif 22 | } Проект: VideoEditorPro Файл: VideoEditorPro/Services/TrackingAuthorizationManager.swift Выбранные строки: 34–52 Выдержка с исходными номерами строк; выбранные строки сохранены без изменений. SHA-256 полного исходного файла: 06092d42bedd141bd32f96880f2e5acfd368d4e48a79d5b9d6f5039a3a52d982 SHA-256 выдержки с номерами строк: 9fa52ec7f8eb9066e92101a158c010f6c7b0d9d587246f96b2d30d8728141f8b 34 | func requestIfNeededBeforeAdRequests() async -> TrackingAuthorizationState { 35 | guard AppVariant.displaysAds else { return .notRequired } 36 | 37 | #if ARTCUT_FREE && canImport(AppTrackingTransparency) 38 | let current = map(status: ATTrackingManager.trackingAuthorizationStatus) 39 | guard current == .notDetermined else { return current } 40 | 41 | if let requestTask { 42 | return await requestTask.value 43 | } 44 | 45 | let task = Task { @MainActor in 46 | try? await Task.sleep(nanoseconds: 650_000_000) 47 | return await withCheckedContinuation { continuation in 48 | ATTrackingManager.requestTrackingAuthorization { status in 49 | continuation.resume(returning: Self.map(status: status)) 50 | } 51 | } 52 | }