AppClipsStudio
Invocation routing, comprobación de tamaño y website association para iOS App Clips.
Licencia: MIT
Un paquete Swift para App Clips de iOS y las apps a las que pertenecen. Valida la invocation URL que el sistema pasa al inicio y la enruta a tus pantallas igual que App Store Connect la enruta a las App Clip experiences, confirma que la persona está donde está el código y entrega los datos del App Clip a la app completa. Su herramienta de línea de comandos appclipstudio comprueba el tamaño de cada variant, las App Clip Code URLs, el archivo apple-app-site-association y las entradas de Associated Domains antes de subir. Sin dependencias.
Características
- Invocation routing con la regla de coincidencia de Apple: patterns como /table/:number y /shop/*, gana el prefix más específico, los handlers pueden rechazar una coincidencia y un fallback cubre el resto de un prefix registrado
- La entrada no confiable queda acotada: solo https, como máximo 2.048 bytes, 32 componentes de path y 64 query items, sin componentes . ni .., y sin caracteres de control o formato en el host, path o query decodificados
- Comprobación de tamaño por variant: los límites de 10, 15 y 100 MB de Apple aplicados al App Thinning Size Report.txt de Xcode según la versión de iOS, el deployment target y el tipo de invocation, con un exit status para CI
- Website association: genera y valida apple-app-site-association, comprueba las entradas de entitlement appclips: y applinks:, y revisa las App Clip Code URLs contra las reglas de Apple
- HandoffStore pasa un valor Codable versionado, con expiración y tamaño limitado a la app completa a través del App Group compartido
- Confirmación de ubicación con una región validada de como máximo 500 m, y el App Store overlay para la app completa
- Una app de ejemplo y App Clip (Examples/CoffeeShop) construidos a partir de fuentes compartidas; CI la compila y los samples del README se copian de ella
Inicio rápido
1import AppClipsStudio2import SwiftUI3 4enum Screen: Equatable {5 case welcome6 case table(Int)7}8 9struct ContentView: View {10 @State private var screen = Screen.welcome11 12 var body: some View {13 Group {14 switch screen {15 case .welcome: Text("Scan a table tag")16 case .table(let number): Text("Table \(number)")17 }18 }19 .font(.largeTitle)20 .onInvocation { invocation in21 screen = (try? Self.router.route(invocation)) ?? .welcome22 }23 }24 25 static let router: InvocationRouter<Screen> = {26 var router = InvocationRouter<Screen>()27 try? router.add("/table/:number") { match in28 match.integer("number").map(Screen.table)29 }30 router.fallback { _ in .welcome }31 return router32 }()33}Instalación
Swift Package Manager
1dependencies: [2 .package(url: "https://github.com/muhittincamdali/AppClipsStudio.git", from: "2.0.0")3],4targets: [5 .target(name: "YourAppFeature", dependencies: [6 .product(name: "AppClipsStudio", package: "AppClipsStudio")7 ])8]Xcode
1https://github.com/muhittincamdali/AppClipsStudio.gitCommand-line tool
1git clone https://github.com/muhittincamdali/AppClipsStudio.git2cd AppClipsStudio3swift build -c release4cp .build/release/appclipstudio /usr/local/bin/ # or run it with `swift run appclipstudio`Capturas de pantalla




Cronología
Repositorio abierto como un framework de App Clip modular
v1.0.0 etiquetada; trabajo de documentación y CI, mientras las fuentes de los módulos siguieron siendo placeholders
Limpieza: los módulos se consolidaron en un único target de unos pocos stubs
Reconstruido como 2.0.0 a partir de la documentación de App Clip de Apple: invocation routing, comprobación de tamaño, website association y el CLI appclipstudio; no se conservó ninguna API de 1.0.0