feat(ios): GoogleSignInProviderIOS pasa a object — una sola forma desde Swift - #26
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implementa el spec 011. Cierra la causa que el spec 003 solo pudo parchear.
El problema
GoogleSignInProviderIOSera el único de los seis providers de iOS con forma declass+companion object, porque recibíaGoogleSignInConfigen el constructor. Kotlin/Native exporta uncompanion 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 ensignIn(config), igual queAppleSignInProviderIOS.signIn(scopes).GoogleSignInProviderIOS.Companion.shared.signInHandler = …GoogleSignInProviderIOS.shared.signInHandler = …GoogleSignInProviderIOS.Companion.shared.signOutHandler = …GoogleSignInProviderIOS.shared.signOutHandler = …GoogleSignInProviderIOS(config).signIn()GoogleSignInProviderIOS.signIn(config)Pasar a
objectno globaliza nada que no lo fuera ya:signInHandler,signOutHandlery elcallback 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
grepcomo criterio de AC-01. Se comprobó además en el header deObjective-C del framework, que es lo que Swift ve de verdad:
ComposeAppGoogleSignInProviderIOSCompanionpasa de existir a 0 aparicionesComposeAppGoogleSignInProviderIOSexpone ahora@property (class, readonly, getter=shared), idéntico a los providers que ya eranobjectktlintCheck,:custom-login:testDebugUnitTesty:composeApp:linkDebugFrameworkIosSimulatorArm64en verde en local.
La decisión abierta del spec, resuelta con datos
El spec dejaba abierto qué hacer con
getClientId()ygetTopViewController(), y dudaba por unposible «consumidor Swift desconocido». Se pudo medir en vez de estimar:
getClientId()tienecero call sites en toda la organización
apptolast, y ni Fledge ni Paparcar nombranGoogleSignInProviderIOSen Kotlin ni en Swift.getClientId()→ eliminada. Quien pudiera llamarla ya tiene en la mano laGoogleSignInConfigde la que leía.getTopViewController()yonSignInResult()→ se quedan con el@Deprecatedque les puso el spec 010.Dos cosas que salieron al verificar
AppleSignInProviderIOSexplicaba que.companionexiste «para el companion objectde una clase, como
GoogleSignInProviderIOS». Con este cambio deja de ser cierto.CLAUDE.mddocumentaba:custom-login:linkDebugFrameworkIosSimulatorArm64, que no existe.La librería no declara
binaries.frameworkpropio — se exporta a través delComposeAppdeldemo. 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-login→baseloginque viene detrás, para que losconsumidores 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