Quitar los SDK de publicidad y analítica de terceros (AdMob + Firebase Analytics + ATT) #50

Closed
opened 2026-09-18 13:44:40 +00:00 by alexandrev · 2 comments
Owner

Decisión de Alexandre (auditoría 2026-09-18): "Portfolio Journal sin AdMob ni Google: es la única forma de que «sin rastreo» sea verdad, y el ingreso por anuncios es despreciable" (695 impresiones en 90 días).

Quitar del target app:

  • GoogleMobileAds y UserMessagingPlatform (paquete swift-package-manager-google-mobile-ads)
  • FirebaseCore + FirebaseAnalytics (paquete firebase-ios-sdk)
  • AdMobService, el banner y su hueco en ContentView, el flujo UMP y la entrada «Manage Ad Consent» de Ajustes
  • ATTrackingManager.requestTrackingAuthorization() y NSUserTrackingUsageDescription
  • los ~65 SKAdNetworkItems, GADApplicationIdentifier, GADDelayAppMeasurementInit y GoogleService-Info.plist
  • FirebaseService entero (el evento snapshot_added enviaba el importe del saldo a GA4)
  • app-ads.txt del sitio web

La app no debe pedir ATT al arrancar ni dejar hueco en la interfaz donde estaba el banner.

Decisión de Alexandre (auditoría 2026-09-18): *"Portfolio Journal sin AdMob ni Google: es la única forma de que «sin rastreo» sea verdad, y el ingreso por anuncios es despreciable"* (695 impresiones en 90 días). Quitar del target app: - `GoogleMobileAds` y `UserMessagingPlatform` (paquete swift-package-manager-google-mobile-ads) - `FirebaseCore` + `FirebaseAnalytics` (paquete firebase-ios-sdk) - `AdMobService`, el banner y su hueco en `ContentView`, el flujo UMP y la entrada «Manage Ad Consent» de Ajustes - `ATTrackingManager.requestTrackingAuthorization()` y `NSUserTrackingUsageDescription` - los ~65 `SKAdNetworkItems`, `GADApplicationIdentifier`, `GADDelayAppMeasurementInit` y `GoogleService-Info.plist` - `FirebaseService` entero (el evento `snapshot_added` enviaba el importe del saldo a GA4) - `app-ads.txt` del sitio web La app no debe pedir ATT al arrancar ni dejar hueco en la interfaz donde estaba el banner.
Author
Owner

Implementado en 7d2f605 (rama 1.7.0).

Fuera del proyecto: paquetes firebase-ios-sdk y swift-package-manager-google-mobile-ads, productos FirebaseCore, FirebaseAnalytics, GoogleMobileAds; Package.resolved borrado. Borrados Services/AdMobService.swift (215 líneas, con el flujo UMP, BannerAdView y la llamada a ATT) y Services/FirebaseService.swift (226 líneas) con sus 40 llamadas. FirebaseService se borra entero en vez de dejarse como capa vacía: una clase con ese nombre en una app que presume de no llevar Firebase es justo el detalle que se vuelve a colar en la próxima auditoría.

También fuera: el banner y su safeAreaInset en ContentView (las 5 pestañas ya no reservan 50 pt), la entrada «Manage Ad Consent» de Ajustes, el bloque AdMob de AppConstants, SettingsViewModel.toggleAnalytics (el flag no estaba conectado a nada), PremiumFeature.noAds y las claves feature_no_ads/paywall_benefit_noads de los 7 idiomas. Sin tocar precios ni productos. En Info.plist: NSUserTrackingUsageDescription, GADApplicationIdentifier, GADDelayAppMeasurementInit y los 65 SKAdNetworkItems. Borrados GoogleService-Info.plist, Scripts/analyze_ga4.py y el app-ads.txt del sitio web.

Verificado: xcodebuild build OK; 108 tests unitarios y 17 UI (incluido DuoLayoutUITests) en verde sobre iOS 27.0; grep de admob/googlemobileads/firebase/attracking/skadnetwork/logEvent sobre todo el código da cero; otool -L del binario no enlaza AppTrackingTransparency, AdSupport ni nada de Google, y el .app no tiene carpeta Frameworks. Capturas del nivel gratuito: sin hueco donde estaba el banner y sin petición de ATT al arrancar.

Implementado en `7d2f605` (rama 1.7.0). Fuera del proyecto: paquetes `firebase-ios-sdk` y `swift-package-manager-google-mobile-ads`, productos `FirebaseCore`, `FirebaseAnalytics`, `GoogleMobileAds`; `Package.resolved` borrado. Borrados `Services/AdMobService.swift` (215 líneas, con el flujo UMP, `BannerAdView` y la llamada a ATT) y `Services/FirebaseService.swift` (226 líneas) con sus 40 llamadas. `FirebaseService` se borra entero en vez de dejarse como capa vacía: una clase con ese nombre en una app que presume de no llevar Firebase es justo el detalle que se vuelve a colar en la próxima auditoría. También fuera: el banner y su `safeAreaInset` en `ContentView` (las 5 pestañas ya no reservan 50 pt), la entrada «Manage Ad Consent» de Ajustes, el bloque AdMob de `AppConstants`, `SettingsViewModel.toggleAnalytics` (el flag no estaba conectado a nada), `PremiumFeature.noAds` y las claves `feature_no_ads`/`paywall_benefit_noads` de los 7 idiomas. Sin tocar precios ni productos. En `Info.plist`: `NSUserTrackingUsageDescription`, `GADApplicationIdentifier`, `GADDelayAppMeasurementInit` y los 65 `SKAdNetworkItems`. Borrados `GoogleService-Info.plist`, `Scripts/analyze_ga4.py` y el `app-ads.txt` del sitio web. Verificado: `xcodebuild build` OK; 108 tests unitarios y 17 UI (incluido `DuoLayoutUITests`) en verde sobre iOS 27.0; `grep` de admob/googlemobileads/firebase/attracking/skadnetwork/logEvent sobre todo el código da cero; `otool -L` del binario no enlaza AppTrackingTransparency, AdSupport ni nada de Google, y el `.app` no tiene carpeta `Frameworks`. Capturas del nivel gratuito: sin hueco donde estaba el banner y sin petición de ATT al arrancar.
Author
Owner

La build 89 (1.7.0) está en TestFlight desde hoy: subida con altool tras --validate-app sin errores, procesada por App Store Connect (processingState: VALID) y ya en pruebas internas (internalBuildState: IN_BETA_TESTING). Notas de beta publicadas en es-ES y en-US.

Incluye la retirada de AdMob, Firebase Analytics y ATT (7d2f605). Verificado dentro del IPA: el Info.plist de la app no lleva NSUserTrackingUsageDescription, ni GADApplicationIdentifier, ni ningún SKAdNetworkItems, y el proyecto no tiene ninguna dependencia de terceros.

Lo que se pide probar a los testers es justamente esto: que la app ya no pida permiso de rastreo al arrancar. El issue ya estaba cerrado; esto es solo el registro de que ha llegado a manos de los testers.

La **build 89 (1.7.0)** está en TestFlight desde hoy: subida con `altool` tras `--validate-app` sin errores, procesada por App Store Connect (`processingState: VALID`) y ya en pruebas internas (`internalBuildState: IN_BETA_TESTING`). Notas de beta publicadas en es-ES y en-US. Incluye la retirada de AdMob, Firebase Analytics y ATT (`7d2f605`). Verificado dentro del IPA: el `Info.plist` de la app no lleva `NSUserTrackingUsageDescription`, ni `GADApplicationIdentifier`, ni ningún `SKAdNetworkItems`, y el proyecto no tiene ninguna dependencia de terceros. Lo que se pide probar a los testers es justamente esto: **que la app ya no pida permiso de rastreo al arrancar**. El issue ya estaba cerrado; esto es solo el registro de que ha llegado a manos de los testers.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: alexandrev/InvestmentTrackerApp#50