所有开源包
平台Swift

AppClipsStudio

iOS App Clips 的调用路由、体积检查和网站关联

5星标数最新版本: v2.0.0 · 更新时间: 2026年10月15日
支持平台:iOS 16macOS 13

许可证: MIT

一个为 iOS App Clips 及其所属 app 服务的 Swift package。它校验系统启动时传入的调用 URL,并像 App Store Connect 把流量路由到 App Clip 体验那样,把它路由到你的界面,确认用户所在位置与 App Clip Code 所在位置相符,并把 App Clip 的数据交给完整版 app。它的 appclipstudio 命令行工具会在上传前检查每个变体的体积、App Clip Code URL、apple-app-site-association 文件和 Associated Domains 条目。无依赖。

功能特性

  • 按照 Apple 的匹配规则进行调用路由:支持 /table/:number 和 /shop/* 这样的模式,最具体的前缀优先匹配,handler 可以拒绝某次匹配,fallback 负责覆盖已注册前缀的其余部分
  • 不可信输入受到边界限制:仅允许 https,最多 2,048 字节、32 个路径分段和 64 个查询项,不允许 . 或 .. 分段,解码后的 host、path 或 query 中不允许出现控制字符或格式字符
  • 按变体做体积检查:依据 iOS 版本、部署目标和调用类型,把 Apple 的 10 MB、15 MB 和 100 MB 限制套用到 Xcode 的 App Thinning Size Report.txt 上,并为 CI 提供退出状态
  • 网站关联:生成并校验 apple-app-site-association,检查 appclips: 和 applinks: entitlement 条目,并按 Apple 的规则检查 App Clip Code URL
  • HandoffStore 通过共享的 App Group,把一个带版本号、会过期、有体积限制的 Codable 值传递给完整版 app
  • 位置确认支持最多 500 米的校验区域,并为完整版 app 提供 App Store overlay
  • 示例 app 和 App Clip(Examples/CoffeeShop)由共享源码构建;CI 会构建它,README 中的示例代码也是从中复制而来

快速开始

swift
1import AppClipsStudio
2import SwiftUI
3 
4enum Screen: Equatable {
5 case welcome
6 case table(Int)
7}
8 
9struct ContentView: View {
10 @State private var screen = Screen.welcome
11 
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 in
21 screen = (try? Self.router.route(invocation)) ?? .welcome
22 }
23 }
24 
25 static let router: InvocationRouter<Screen> = {
26 var router = InvocationRouter<Screen>()
27 try? router.add("/table/:number") { match in
28 match.integer("number").map(Screen.table)
29 }
30 router.fallback { _ in .welcome }
31 return router
32 }()
33}

安装

Swift Package Manager

swift
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

text
1https://github.com/muhittincamdali/AppClipsStudio.git

Command-line tool

sh
1git clone https://github.com/muhittincamdali/AppClipsStudio.git
2cd AppClipsStudio
3swift build -c release
4cp .build/release/appclipstudio /usr/local/bin/ # or run it with `swift run appclipstudio`

截图

从桌面标签 URL 打开的示例 App Clip:Harbor Street 的 12 号桌,浅色模式
从桌面标签 URL 打开的示例 App Clip:Harbor Street 的 12 号桌,深色模式
从海报 URL 打开的示例 App Clip:Flat White 优惠,浅色模式
从海报 URL 打开的示例 App Clip:Flat White 优惠,深色模式

时间线

  1. 仓库开放,作为一个模块化的 App Clip framework

  2. 打上 v1.0.0 标签;期间做了文档和 CI 工作,但模块源码仍是占位代码

  3. 清理:模块被合并成一个只有少量 stub 的单一 target

  4. 依据 Apple 的 App Clip 文档重建为 2.0.0:调用路由、体积检查、网站关联和 appclipstudio CLI;未保留任何 1.0.0 API

相关链接

相关文章

阅读文章 (English)