APP Clips 技术文档
1. APP Clips简介
App Clip 是iOS系统支持的,可以专注于app 中某项功能。例如:你在上班路上想购买一杯咖啡,但发现咖啡店内排队下单付款的人很多,此刻你只需要使用iPhone 自带的扫码工具扫描咖啡商店的 App Clip 二维码或 NFC 标签,就可以购买一杯咖啡,无需下载安装咖啡商店的 app。
App Clip 的启动需要由一个调用方调起,在iOS开发中叫invocation。App Clip被invocation调起后,用户可以通过该Clip完成一项专注的任务,当用户不再需要使用它时,它会自动被iPhone移除,这个过程对用户来说是无感知的,因此App Clip也不会占用用户的桌面空间。
App Clip的启动需要由invocation来触发,invocation包括如下5中场景:通过NFC扫描来唤起、通过点击Sari提供的基于地理位置的推荐、在地图App上点击指定的链接、点击网页上的智能推荐横幅、通过Messages App分享的链接。
当某个invocation触发了App Clip时,系统首先会检查invocation关联的URL,通过URL获取用来展示预览信息的数据,预览信息包括一个背景图案,描述标题与启动按钮,用户点击启动按钮后会打开App Clip。我们可以在App Clip启动时,通过回调方法拿到传递进来的URL,通过URL的参数进行不同的逻辑处理。
在启动App Clip之前,系统会先弹出一个预览卡片,这个卡片上的信息可以由开发者在iTunes Connect上自行定义。
App Clips 的特点:
-
Clip与主App的关系
App Clip的运行需要invocation进行调用,对于invocation的调用,如果用户安装了完全的主App,则会唤起主App来处理用户任务,如果用户没有安装主App,则自动调起App Clip。 -
功能轻便
用户无需对App Clips进行管理,不用下载也无需删除,当指定的App Clip一段时间不活跃后,系统会自动对它们进行清除。 -
体积小巧
App Clips应该足够的小巧,官方限定不可超过10M大小,只有足够小,在用户需要使用的时候才能以更短的时间加载与展示。 -
可用的框架受限
在开发之前,首先要确认下App Clips可用的框架,大部分主App可用的框架在App Clips中都可以使用,但并不是所有,Assets Library, CallKit, CareKit, CloudKit, Contacts, Contacts UI, Core Motion, File Provider, File Provider UI, HealthKit, HomeKit, Media, Player, Messages, Message UI, PhotoKit, ResearchKit, SensorKit, Speech中是不被支持的,若使用了在编译时不会报错,而是在运行时报错或者返回错误的结果。 -
保护用户隐私
由于App Clips会以推荐或其他广告的方式触发,因此保护用户的隐私非常重要。在App Clips中,隐私保护会一直被启用,例如对后台定位权限的申请,当用户同意后,次日的凌晨4点,这个权限会被重新关闭,如果再次启用了App Clips,需要重新向用户申请。当然,还有一些权限在App Clips中是禁止获取的,其中有:运动和健身数据,音乐和多媒体文件,通讯录/信息/照片等文件。除了其宿主App意外,App Clips也不可以和其他应用共享数据。 -
App Clips 的消息推送
微信小程序不能通过 Push 的方式触达用户曾让开发者忧心忡忡。而手机厂商推出的系统级应用在这方便可以给开发者更多的底气,不管是苹果的 App Clips 还是国产手机生态的快应用,服务的消息推送能力都是吸引开发者的重要能力。消息推送在 App Clip 的应用分两种场景:短时间内推送和长时间内的推送。
短时间内推送:
用户在启动 App Clip 后,8 小时内可以收到消息推送。比如用户在 App Clip 购买了一杯咖啡后就退出了 App Clip,当咖啡准备好了,用户就会收到一个「咖啡已准备好」的推送。这方式只需要在 Info.plist 属性文件中添加 NSAppClip Key,并将 NSAppClipRequestEphemeralUserNotification 设置为 true,就能默认获取消息推送的权限。
长时间内推送:
用户在 App Clip 完成一个任务后,可能过了几天才会收到推送。比如用户在 App Clip 租了辆车,租期为 3 天,到期后会用户收到「该还车了」的推送。这种方式和普通 app 的消息推送一样,都需要获取用户的推送授权。
2.开发流程
2.1 创建App Clip
首先其需要一个宿主App,在这个宿主App的工程中新建一个Target,选择App Clip即可,通过File->New->target,选择AppClip,Xcode 接下来会自动创建所需文件,这时候就可以直接选择该Clip的target进行运行,只是无内容。
2.2 App端配置
在调用App Clip时,无论通过哪种invocation来调起App Clip,都需要在App Clip的target中配置指定的关联域。在target工程的Signing&Capability页面找到Associated Domains选项,在其中添加要调起App Clip的域名,格式为appclips:xxx.com。配置方式与UniversalLink的逻辑基本一致。
2.3 服务端配置
在系统弹出 app clip 或允许 app clip 调用之前,系统会验证 app clip 的配置和调用的URL。如果无法执行验证,则不会显示app clip,也不会启动。配置方法跟UniversalLink一样,在 server 的 App Site Association (通常是在网站 .well-known 下的 apple-app-site-association 文件) 中添加这个域名对应的 appclips 条目:新增一个键值对,key为appclips,value为一个对象 "apps": ["bundle id.Clip"]
在服务器配置apple-app-site-association文件格式:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "com.jd.paidaojia1",
"paths": [ "*"]
}
]
},
"appclips": {
"apps": [ "com.jd.paidaojia1.Clips" ]
}
}
一个能够启动appClip的AppBanner形式如下:
<meta
name="apple-itunes-app"
content="app-id=myAppStoreID, app-clip-bundle-id=appClipBundleID
>
App Clip 的卡片开始显示时就已经开始了包的下载,App clip 的体积必须在 10MB 以内。这样,大概率在用户选择打开你的 app clip 之前,就能下载完成,以提供良好体验。
用户点击 banner 或者 iMessage 链接,且继续点击打开按钮后,app clip 的 user activity 关联的生命周期函数将被调用,swift中是
// webpageURL为调起的链接,可用以传参
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
print(userActivity.webpageURL)
}
2.4 Beta 期间调试Clip
在开发时,可以通过设置 _XCAppClipURL 这个环境变量来“模拟”通过特定 URL 调起过程。当 Associated Domain 设置正确后,在 Xcode 中运行 app clip,就可以拿到包含这个环境值的 NSUserActivity。这样在 Beta 期间的本地开发就不需要依赖外部 server 环境了。
特别说明一下,这个地址一般为了测试,是需要与你domain中设置的是一样的,但是我们真正使用的时候不可能只是一个固定的地址,后面是可以跟参数,因为调起链接的时候只会拿这个地址前缀部分,比如url是www.paijitang.com?orderNo=123456都是可以识别的。
如果在本地测试的话还需要配置一下 Launch Experience,即给 App Clip 配置一个 URL 和 App Clip Card 信息。在开发阶段可以直接配置 Local Experience 或者在 testflight 上进行配置。App Clip 准备发布时,需要在 app store connect 上进行配置。
手机上配置Launch Experience:
- 打开手机【设置】-【开发者】-【Local Experience】-【Register Local Experience】;
- 填入 Clip Bundle Id;
填入 URL PREFIX,打开任何以 URL PREFIX 为前缀的 URL;
填入 Title、Subtitle,选择一张图片,这些信息将会显示在 App Clip Card 上; - 在Safari中输入有该前缀的一个Url,并请求;
- 将会弹出APP Clip Card.不过前提是你的Clip已经配置好真机运行的证书文件,关于配置看下一步。
- 关于其他的invocation方式,也可以尝试一下。
特别说明,上面action有三个,Open、View、Play 的区别就是打开卡片的时候,下面的按钮分别是打开、查看、打开游戏,可以自己体验一下。
2.5 Clip需要配置证书
你可以切换到MyClip的target下查看,它的bundle id其实就是它的宿主target的id后面加了一个.Clip,当然你可以改这个后缀,但是需要和证书上的一致。
接下来就是正常的配置Identifies的流程。但是比较重要的一点是必须要把Associated Domains这个给勾选上,不然真机运行会报错。
上面配置完成之后,下面就需要创建对应的描述文件即Profiles文件,分别创建开发可发布证书。之后回到项目里配置上相应证书文件即可。
2.6 发布App Clip
首先,为MyClip配置一个icon,不然会上传失败;
其次,以下几个位置需要与发布的target保持一致。
注:这个Display Name需要选一个跟项目名不一致的名字,否则,提交appStore的时候会告诉你displayName or bundle Name已存在;
最后,需要在App store connnct中配置一下Clip,前提是你必须有一个包含轻应用的包提交通过。然后你就可以在下图中配置:
上面步骤4的配置完成之后,只能让你在Safi浏览器和信息中体验轻App.高级体验则可以通过轻 App 码(内嵌网址和 NFC 标签)、二维码以及“地图”中的地点卡片调用。相关配置可以通过点击编辑高级体验就可以设置,比较简单。
如果你的app使用了TestFligh,这个时候你就可以在手机testFligh App中查看刚才提交的版本,会有一个轻App按钮,点击进去就是你的轻App内容。这里就可以测试你的功能了。
上面基本就是一个轻应用从测试到发布的基本流程。
参考资料:
1.https://mp.weixin.qq.com/s?__biz=MzI2NTAxMzg2MA%3D%3D&idx=1&mid=2247484662&scene=21&sn=601cb10f17a9d4bb94fa4b911ed3586a#wechat_redirect
2.https://onevcat.com/2020/06/first-look-app-clips/
3.https://www.ifanr.com/minapp/1368393
4.https://developer.apple.com/documentation/app_clips/creating_an_app_clip_with_xcode