Skip to content

feat(ios): GoogleSignInProviderIOS pasa a object — una sola forma desde Swift - #26

Merged
hgarciaalberto merged 3 commits into
developfrom
feature/011-ios-provider-symmetry
Aug 19, 2026
Merged

feat(ios): GoogleSignInProviderIOS pasa a object — una sola forma desde Swift#26
hgarciaalberto merged 3 commits into
developfrom
feature/011-ios-provider-symmetry

Conversation

@hgarciaalberto

Copy link
Copy Markdown
Contributor

Implementa el spec 011. Cierra la causa que el spec 003 solo pudo parchear.

Sustituye a #22, que GitHub cerró automáticamente al borrarse su rama base
(feature/010-ios-build-hygiene) tras el merge de #21. Mismo trabajo, rebasado sobre develop.

El problema

GoogleSignInProviderIOS era el único de los seis providers de iOS con forma de class +
companion object, porque recibía GoogleSignInConfig en el constructor. Kotlin/Native exporta un
companion por su cuenta, así que el mismo seam tenía dos escrituras válidas en Swift. Las dos
compilan, y por eso nadie lo veía: no era un fallo, era ruido que enseñaba al lector que hay dos
contratos. El README llegó a usar las dos formas para el mismo objeto con 24 líneas de diferencia,
y de ahí salieron los ejemplos que no compilaban que arregló el 003.

El cambio

object, como los otros cinco. La config viaja en signIn(config), igual que
AppleSignInProviderIOS.signIn(scopes).

1.x 2.0.0
Swift GoogleSignInProviderIOS.Companion.shared.signInHandler = … GoogleSignInProviderIOS.shared.signInHandler = …
Swift GoogleSignInProviderIOS.Companion.shared.signOutHandler = … GoogleSignInProviderIOS.shared.signOutHandler = …
Kotlin GoogleSignInProviderIOS(config).signIn() GoogleSignInProviderIOS.signIn(config)

Pasar a object no globaliza nada que no lo fuera ya: signInHandler, signOutHandler y el
callback pendiente vivían en el companion, o sea uno por proceso. La forma anterior solo sugería
lo contrario.

Verificación

El spec proponía un grep como criterio de AC-01. Se comprobó además en el header de
Objective-C del framework
, que es lo que Swift ve de verdad:

  • ComposeAppGoogleSignInProviderIOSCompanion pasa de existir a 0 apariciones
  • ComposeAppGoogleSignInProviderIOS expone ahora
    @property (class, readonly, getter=shared), idéntico a los providers que ya eran object

ktlintCheck, :custom-login:testDebugUnitTest y :composeApp:linkDebugFrameworkIosSimulatorArm64
en verde en local.

La decisión abierta del spec, resuelta con datos

El spec dejaba abierto qué hacer con getClientId() y getTopViewController(), y dudaba por un
posible «consumidor Swift desconocido». Se pudo medir en vez de estimar: getClientId() tiene
cero call sites en toda la organización apptolast
, y ni Fledge ni Paparcar nombran
GoogleSignInProviderIOS en Kotlin ni en Swift.

  • getClientId()eliminada. Quien pudiera llamarla ya tiene en la mano la GoogleSignInConfig de la que leía.
  • getTopViewController() y onSignInResult() → se quedan con el @Deprecated que les puso el spec 010.

Dos cosas que salieron al verificar

  • El KDoc de AppleSignInProviderIOS explicaba que .companion existe «para el companion object
    de una clase, como GoogleSignInProviderIOS»
    . Con este cambio deja de ser cierto.
  • CLAUDE.md documentaba :custom-login:linkDebugFrameworkIosSimulatorArm64, que no existe.
    La librería no declara binaries.framework propio — se exporta a través del ComposeApp del
    demo. Se descubrió al ejecutarlo. Corregidas las cuatro apariciones.

Compatibilidad

BREAKING para hosts Swift, pero falla en compilación, no en runtime: el host se entera al subir
el pin, no un mes después con un botón muerto.

Sale en 2.0.0, junto al renombrado custom-loginbaselogin que viene detrás, para que los
consumidores migren una sola vez en lugar de dos. La versión la fija esa PR; aquí solo va la nota
en el README (Migrating to 2.0.0).

🤖 Generated with Claude Code

rndevelo and others added 3 commits August 20, 2026 00:51
Convertir GoogleSignInProviderIOS en object cierra la causa que el 003
parcheó: es el único de los seis providers con forma distinta, y de ahí
salió la documentación falsa que se copió a los otros cinco.

Queda escrito y sin implementar. Rompe a los hosts Swift ya integrados,
así que necesita ir coordinado con el bump del pin en Fledge, y arrastra
una decisión abierta sobre getClientId().

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E41idMYhfgBSz2EeuNUn5Q
La línea 609 usaba .companion y la 633 .Companion.shared para el mismo
objeto, con 24 líneas de diferencia. Las dos compilan; tener las dos es
lo que enseña al lector que hay dos contratos.

Va aparte del spec 011 a propósito: si el 011 se queda esperando a
Fledge, esto se puede cherry-pickear a develop por su cuenta.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E41idMYhfgBSz2EeuNUn5Q
…e Swift

Cierra la causa que el spec 003 solo pudo parchear. Google era el unico de
los seis providers de iOS con forma de `class` + `companion object`, porque
recibia GoogleSignInConfig en el constructor. Kotlin/Native exportaba ese
companion por su cuenta, asi que el mismo seam tenia dos escrituras validas
en Swift, y el README acabo publicando ejemplos con la equivocada.

Ahora es un `object` como los otros cinco y la config viaja en signIn(config),
igual que AppleSignInProviderIOS.signIn(scopes).

Verificado en el header de Objective-C del framework, no solo por grep:
ComposeAppGoogleSignInProviderIOSCompanion desaparece y la clase pasa a
exponer `getter=shared`, identica a los providers que ya eran object.

getClientId() se elimina: quien pudiera llamarla ya tiene en la mano la
GoogleSignInConfig de la que leia. Cero call sites en toda la organizacion.
getTopViewController() y onSignInResult() se quedan con el @deprecated que
les puso el spec 010.

De paso, dos cosas que la verificacion saco a la luz:
- El KDoc de AppleSignInProviderIOS explicaba que `.companion` existe "para
  el companion object de una clase, como GoogleSignInProviderIOS". Ya no es
  cierto.
- CLAUDE.md documentaba `:custom-login:linkDebugFrameworkIosSimulatorArm64`,
  que no existe: la libreria no declara binaries.framework propio, se exporta
  a traves del ComposeApp del demo. El task correcto vive en :composeApp.

BREAKING CHANGE: los hosts Swift pasan de
GoogleSignInProviderIOS.Companion.shared.* a GoogleSignInProviderIOS.shared.*
Sale en 2.0.0, junto al renombrado custom-login -> baselogin, para que los
consumidores migren una sola vez. Comprobado que hoy no rompe a nadie: ni
Fledge ni Paparcar nombran este provider en Kotlin ni en Swift.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@hgarciaalberto
hgarciaalberto merged commit 0bb99ea into develop Aug 19, 2026
2 checks passed
@hgarciaalberto
hgarciaalberto deleted the feature/011-ios-provider-symmetry branch August 19, 2026 22:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants