Commit Graph

2 Commits

Author SHA1 Message Date
alexandrev-tibco 12386673ff textos de privacidad honestos + PrivacyInfo.xcprivacy
La ficha decía "Sin analíticas, sin rastreo, sin venta de datos — nunca" y
"la sincronización con iCloud … está cifrada de extremo a extremo". Lo
primero ya es verdad tras quitar los SDKs; lo segundo sigue sin serlo: es
la base privada de CloudKit, cifrado gestionado por Apple, no cifrado
nuestro de extremo a extremo.

fastlane/metadata — bloque de privacidad reescrito en las 13
localizaciones (en-US/GB/AU/CA, es-ES/MX, de-DE, fr-FR/CA, it, ja,
pt-BR/PT): sin cuentas, sin anuncios ni analítica de terceros, sin
servidores nuestros, datos en el dispositivo, iCloud opcional cifrado por
Apple. No se sube a ASC: los ficheros quedan en el repo.

Copias de seguridad — se elige decir la verdad en vez de cifrarlas: son
JSON legible que el usuario controla y puede abrir con cualquier editor.
Cifrarlas obligaría a gestionar una clave (Keychain o frase del usuario)
y convertiría una copia recuperable a mano en una que se pierde con la
clave; el pie de Ajustes ahora avisa de que no están cifradas.

PrivacyInfo.xcprivacy — Apple lo exige y la app no tenía ninguno. Declara
NSPrivacyTracking false, sin dominios de rastreo, sin tipos de datos
recogidos, y solo las API de motivo requerido que se usan de verdad:
FileTimestamp (CoreData, exportaciones, backups, diagnósticos) y
UserDefaults (preferencias y App Group).

Closes #52

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F1u4K16xy7eQVtgsYNZ9Vn
2026-09-18 16:10:17 +02:00
alexandrev-tibco 197bddcd7e Growth y monetización: fixes críticos, paywall multi-plan, teasers y App Intents
CRÍTICO — enlaces del App Store rotos (adquisición viral = 0):
- GoalShareService.appStoreURL apuntaba a id6744983373 (404): el QR de TODAS las
  imágenes compartidas llevaba a una página muerta. Corregido a id6757678318.
- SettingsView enlazaba id6741412965 (una novela romántica). Ahora usa la constante.

Monetización:
- IAPService multi-producto: sub anual (com.portfoliojournal.premium.annual, con
  intro offer/trial) + lifetime como ancla. isPremium acepta cualquiera de los dos.
  Paywall con selector de plan (anual por defecto si existe; degrada a solo lifetime
  mientras el producto no esté creado en App Store Connect).
- paywallBenefits: añadidos Multiple Accounts y Family Sharing (diferenciadores).
- Teaser de historia bloqueada en Charts: "N meses más con Premium" en vez de
  truncar en silencio (FreemiumValidator.hiddenHistoryMonths + banner).
- Trigger de paywall de backups ahora instrumentado (logPaywallShown "backups").

Retención / adquisición:
- Rating velocity: prompt tras 2 check-ins y 30 días (antes 3 + 90 — en una app
  mensual eso era >3 meses sin poder pedir la primera review con ~0 ratings).
- Sample data ON por defecto en onboarding (skip ya no aterriza en dashboard vacío).
- Notificación de protección de streak el día 25 si el check-in del mes está pendiente.
- App Intents + AppShortcutsProvider: "Update my portfolio" / "Check my portfolio"
  vía Siri/Shortcuts/Spotlight.
- Instrumentación: onboarding_step/onboarding_skipped y content_shared (viral loop).
- ScreenshotMode (--screenshots) para capturas de marketing automatizadas.

ASO:
- 6 locales nuevos en metadata (en-GB, en-CA, en-AU, es-MX, fr-CA, pt-PT) reusando
  traducciones — 6 campos de keywords extra; pt-PT adaptado (reforma).
- Categoría secundaria: PRODUCTIVITY.
- 17 strings nuevas localizadas en los 7 idiomas.

Pendiente manual: crear la sub anual en App Store Connect (grupo de suscripción +
intro offer 7 días) con el id exacto com.portfoliojournal.premium.annual.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qUZrBusG82T37R7PeokqJ
2026-07-02 22:12:32 +02:00