AppClipsStudio
iOS App Clip'leri için invocation yönlendirme, boyut kontrolü ve website association.
Lisans: MIT
iOS App Clip'leri ve ait oldukları uygulamalar için bir Swift paketi. Sistemin açılışta verdiği invocation URL'sini doğrular ve App Store Connect'in App Clip experience'larına yaptığı gibi kendi ekranlarınıza yönlendirir, kişinin kodun bulunduğu yerde olduğunu doğrular ve App Clip'in verisini tam uygulamaya aktarır. appclipstudio komut satırı aracı; her variant'ın boyutunu, App Clip Code URL'lerini, apple-app-site-association dosyasını ve Associated Domains girdilerini yüklemeden önce kontrol eder. Bağımlılığı yok.
Özellikler
- Apple'ın eşleştirme kuralıyla invocation yönlendirme: /table/:number ve /shop/* gibi pattern'ler, en özgül prefix kazanır, handler bir eşleşmeyi reddedebilir, kayıtlı prefix'in geri kalanını fallback karşılar
- Güvenilmeyen girdi sınırlı kalır: yalnız https, en fazla 2.048 byte, 32 path bileşeni ve 64 query item, . ya da .. bileşeni yok, decode edilmiş host, path ve query'de kontrol ya da format karakteri yok
- Variant başına boyut kontrolü: Apple'ın 10, 15 ve 100 MB limitleri; Xcode'un App Thinning Size Report.txt dosyasına iOS sürümü, deployment target ve invocation türüne göre uygulanır, CI için exit status döner
- Website association: apple-app-site-association üretme ve doğrulama, appclips: ve applinks: entitlement girdilerini kontrol etme, App Clip Code URL'lerini Apple'ın kurallarına göre denetleme
- HandoffStore, sürümlü, süresi dolabilen ve boyutu sınırlı bir Codable değeri paylaşılan App Group üzerinden tam uygulamaya aktarır
- En fazla 500 m'lik doğrulanmış bir bölgeyle konum teyidi ve tam uygulama için App Store overlay'i
- Ortak kaynaklardan derlenen örnek uygulama ve App Clip (Examples/CoffeeShop); CI onu derler, README örnekleri ondan alınır
Hızlı Başlangıç
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}Kurulum
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`Ekran Görüntüleri




Zaman Çizelgesi
Repo, modüler bir App Clip framework'ü olarak açıldı
v1.0.0 etiketlendi; doküman ve CI çalışması yapıldı, modül kaynakları ise placeholder olarak kaldı
Sadeleştirme: modüller birkaç stub'dan oluşan tek bir target'ta toplandı
Apple'ın App Clip dokümantasyonundan yola çıkılarak 2.0.0 olarak yeniden kuruldu: invocation yönlendirme, boyut kontrolü, website association ve appclipstudio CLI; 1.0.0 API'sinden hiçbir şey korunmadı