AppClipsStudio
Routage d'invocation, vérifications de taille et association de site web pour les App Clips iOS.
Licence: MIT
Un package Swift pour les App Clips iOS et les apps auxquelles ils appartiennent. Il valide l'URL d'invocation que le système transmet au lancement et la route vers vos écrans de la même façon qu'App Store Connect la route vers les expériences App Clip, confirme que la personne se trouve bien là où le code se situe, et transmet les données de l'App Clip à l'app complète. Son outil en ligne de commande appclipstudio vérifie la taille de chaque variante, les URLs d'App Clip Code, le fichier apple-app-site-association et les entrées Associated Domains avant l'upload. Aucune dépendance.
Fonctionnalités
- Routage d'invocation selon la règle de correspondance d'Apple : des motifs comme /table/:number et /shop/*, le préfixe le plus spécifique l'emporte, les handlers peuvent refuser une correspondance, et un fallback couvre le reste d'un préfixe enregistré
- Les entrées non fiables restent bornées : https uniquement, au plus 2 048 octets, 32 composants de chemin et 64 éléments de requête, aucun composant . ou .., et aucun caractère de contrôle ou de formatage dans l'hôte, le chemin ou la requête décodés
- Vérifications de taille par variante : les limites de 10, 15 et 100 Mo d'Apple appliquées au App Thinning Size Report.txt d'Xcode selon la version iOS, la cible de déploiement et le type d'invocation, avec un code de sortie pour la CI
- Association de site web : générer et valider apple-app-site-association, vérifier les entrées d'entitlement appclips: et applinks:, et linter les URLs d'App Clip Code selon les règles d'Apple
- HandoffStore transmet une valeur Codable versionnée, expirante et de taille limitée à l'app complète via l'App Group partagé
- Confirmation de localisation avec une région validée d'au plus 500 m, et l'overlay App Store pour l'app complète
- Une app et un App Clip d'exemple (Examples/CoffeeShop) construits à partir de sources partagées ; la CI les construit et les exemples du README en sont copiés
Démarrage rapide
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}Installation
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`Captures d'écran




Chronologie
Dépôt ouvert en tant que framework App Clip modulaire
v1.0.0 étiquetée ; travail de documentation et de CI, pendant que les sources des modules restaient des espaces réservés
Nettoyage : les modules ont été consolidés en une seule target de quelques stubs
Reconstruit en 2.0.0 à partir de la documentation App Clip d'Apple : routage d'invocation, vérifications de taille, association de site web et le CLI appclipstudio ; aucune API de la 1.0.0 conservée