AppClipsStudio
Invocation-Routing, Größenprüfungen und Website Association für iOS App Clips.
Lizenz: MIT
Ein Swift-Package für iOS App Clips und die Apps, zu denen sie gehören. Es validiert die Invocation-URL, die das System beim Start übergibt, und leitet sie zu Ihren Screens weiter – so wie App Store Connect sie zu App-Clip-Experiences weiterleitet –, bestätigt, dass sich die Person dort befindet, wo der Code ist, und übergibt die Daten des App Clips an die vollständige App. Das Kommandozeilenwerkzeug appclipstudio prüft vor dem Upload die Größe jeder Variante, die App-Clip-Code-URLs, die apple-app-site-association-Datei und die Associated-Domains-Einträge. Keine Abhängigkeiten.
Funktionen
- Invocation-Routing nach Apples Matching-Regel: Patterns wie /table/:number und /shop/*, das spezifischste Präfix gewinnt, Handler können eine Übereinstimmung ablehnen, und ein Fallback deckt den Rest eines registrierten Präfixes ab
- Nicht vertrauenswürdige Eingaben bleiben begrenzt: nur https, höchstens 2.048 Byte, 32 Pfadkomponenten und 64 Query-Items, keine . oder .. Komponenten und keine Steuer- oder Formatzeichen im decodierten Host, Pfad oder Query
- Größenprüfung pro Variante: Apples Limits von 10, 15 und 100 MB, angewendet auf Xcodes App Thinning Size Report.txt nach iOS-Version, Deployment Target und Invocation-Typ, mit einem Exit-Status für CI
- Website Association: apple-app-site-association erzeugen und validieren, appclips:- und applinks:-Entitlement-Einträge prüfen und App-Clip-Code-URLs gegen Apples Regeln linten
- HandoffStore übergibt einen versionierten, ablaufenden, größenbegrenzten Codable-Wert über die gemeinsame App Group an die vollständige App
- Standortbestätigung mit einer validierten Region von höchstens 500 m und dem App-Store-Overlay für die vollständige App
- Eine Beispiel-App und ein App Clip (Examples/CoffeeShop), aus gemeinsamen Quellen gebaut; CI baut sie, und die README-Beispiele werden daraus kopiert
Schnellstart
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`Screenshots




Zeitleiste
Repository als modulares App-Clip-Framework eröffnet
v1.0.0 getaggt; Dokumentations- und CI-Arbeit, während die Modul-Quellen Platzhalter blieben
Aufräumen: Die Module wurden in ein einziges Target mit wenigen Stubs zusammengefasst
Als 2.0.0 aus Apples App-Clip-Dokumentation neu aufgebaut: Invocation-Routing, Größenprüfungen, Website Association und die appclipstudio-CLI; keine 1.0.0-API erhalten