Public edition prepared 2026-09-12. Personal/account/contact details are visibly redacted where present. The original SHA256 identifies the captured unredacted full file, not this redacted extract. PUBLIC-SHA256SUMS.txt identifies downloadable public files. This material is not a signed declaration or proof of an Apple-received Build. # S01 Automation conditions and advertising initialization Project key: vidma Original relative path: Vidma/Services/AdMobService.swift Captured: 2026-09-12T18:57:15+08:00 Original full-file SHA256: 39048a58df0865808290fbbda958232849d87ed0f907950b7340c8c05b227632 Evidence level: local source excerpt Build correspondence: not yet established with an Apple-received binary. Line numbers refer to the captured original file. Gaps are explicitly marked. No source code was changed. ## Original lines 68 to 95 ```text 0068 static var isDisabledForAutomation: Bool { 0069 let arguments = ProcessInfo.processInfo.arguments 0070 let environment = ProcessInfo.processInfo.environment 0071 return arguments.contains("-ui-testing") 0072 || arguments.contains("-marketing-capture") 0073 || environment["XCTestConfigurationFilePath"] != nil 0074 } 0075 0076 static var simulatesColdStartGateForAutomation: Bool { 0077 #if DEBUG 0078 ProcessInfo.processInfo.arguments.contains("-ui-test-cold-start-gate") 0079 #else 0080 false 0081 #endif 0082 } 0083 0084 static func coldStartDecision( 0085 isAutomation: Bool, 0086 privacyFlowCompleted: Bool, 0087 canRequestAds: Bool, 0088 adLoadCompleted: Bool, 0089 isAdAvailable: Bool 0090 ) -> AdMobColdStartDecision { 0091 if isAutomation { return .enterApp } 0092 guard privacyFlowCompleted else { return .wait } 0093 guard canRequestAds else { return .enterApp } 0094 guard adLoadCompleted else { return .wait } 0095 return isAdAvailable ? .presentAd : .enterApp ``` ## Original lines 155 to 196 ```text 0155 private let minimumBackgroundDuration: TimeInterval = 30 0156 0157 private override init() { 0158 isColdStartGateVisible = !AdMobConfiguration.isDisabledForAutomation 0159 || AdMobConfiguration.simulatesColdStartGateForAutomation 0160 super.init() 0161 } 0162 0163 func prepare() { 0164 guard !hasPrepared else { return } 0165 hasPrepared = true 0166 0167 if AdMobConfiguration.simulatesColdStartGateForAutomation { 0168 Task { @MainActor [weak self] in 0169 try? await Task.sleep(for: .seconds(5)) 0170 self?.completeColdStartGate() 0171 } 0172 return 0173 } 0174 0175 guard !AdMobConfiguration.isDisabledForAutomation else { 0176 completeColdStartGate() 0177 return 0178 } 0179 isGatheringConsent = true 0180 0181 let parameters = RequestParameters() 0182 ConsentInformation.shared.requestConsentInfoUpdate(with: parameters) { [weak self] requestError in 0183 Task { @MainActor in 0184 guard let self else { return } 0185 if let requestError { 0186 self.finishConsentGathering(after: requestError) 0187 return 0188 } 0189 0190 do { 0191 try await ConsentForm.loadAndPresentIfRequired(from: nil) 0192 self.finishConsentGathering(after: nil) 0193 } catch { 0194 self.finishConsentGathering(after: error) 0195 } 0196 } ``` ## Original lines 206 to 210 ```text 0206 func handleScenePhase(_ phase: ScenePhase) { 0207 guard !AdMobConfiguration.isDisabledForAutomation else { return } 0208 switch phase { 0209 case .background: 0210 backgroundedAt = .now ```