App Clip可以说是一众Session里最引人注目的了,Apple生态又增加了新的产品形态。无论承认与否,当裁判也开始下场踢球,App Clip将带来的改变绝不可小觑。
从Apple Session的说明,我们可以这么理解:用户通过 NFC 标签、二维码、Message 信息、Map 、Safari、Siri 建议等途径唤起 App Clip应用程序,在未安装主App的情况下,以类似网页的接触形式和原生级别的体验,使用主App中的某些服务和功能。
App Clip实际上就是一段格式遵从 Universal Link 格式的URL标识,Apple针对做了系统级处理。只不过App Clip URL与应用一样,必须在App Store Connect注册。
PS:详细内容感兴趣的可以查看WWDC20 Session 10146: Configure and link your app clips
Apple对于App Clip的定位是希望能够进一步触及到用户生活的方方面面,包括一些低频但必要的场景。
在上面的一些场景中,往往用户并没有特别服务于当前场景下的App,如果有一个程序足够轻量,免安装,且快速且高效地让用户能够触达当前场景下的服务,连通人与线下是不是更简单?这就是App Clips的设计初衷,让人与线下服务更触手可及。以Apple提供的订购沙冰的例子说明:通过NFC唤醒商家App Clip,点击打开并开始购买。
苹果对App Clip的使用场景非常明确,系统对调起方式做了严格的过滤,支持的发起入口有如下几种:
ASWebAuthenticationSession
来第三方登录,以及使用Apple Pay。
虽然对于用户来说不需要下载主App,但开发者必须使App Clip跟随主App一同提交审核,App Clip并不能够独立开发并提审。(这与Apple设计之初的理念是一致的,目的是为了快速体验功能,而不是替代App)
在开发上,也是完全Native的实现,类似于一个新增的Extension target,例如Keyboard Extension、iMessage Extension等。
有些人认为只能够使用SwiftUI开发(包括我的leader),实际上是错误的,Apple只是说SwiftUI开发会更快(毕竟未来主打),可以直接看测试工程:
App Clip不仅支持SwiftUI,也支持UIKit,包括很多人还在坚守的Objective-C,完全都没有问题,并不存在上手难度。
由于Target依赖于主App,所以Target间的资源共享都是完全OK的,只需要在资源归属上勾选上App Clip就可以了;同时,与Extension一致,App Clip可以通过App Groups来与主App共享数据。
Apple建议开发者可以在App Clip的视图中嵌入SKOverlay
,当用户在App Clip中完成相关任务后展示SKOverlay
,这样可以较好的引导用户,比如可以将其放置在用户的付款确认界面之后。
SKOverlay
也是新特性,这里就不展开说了,详细请参考WWDC20 Session: What's New with In-App Purchase 。
同时,主工程支持多个App Clip Target,目前并不清楚Apple对于数量的限制是多少,但是估计能够满足大部分App主要功能的拆分,以某团为例,可以存在多个App Clip:单车、外卖、酒店住宿、打车等等。
只需要提供不同参数,就可以针对不同场景不同需求来提供不同的 App Clip 体验,例如官方提供的统一连锁下不同咖啡馆举例:
官方Demo提供的解决方案是通过编译宏APPCLIP
来做分支处理,这样能够最大程度共用代码:
import SwiftUI #if APPCLIP import AppClip import CoreLocation #endif @main struct FrutaApp: App { @StateObject private var model = FrutaModel() #if !APPCLIP @StateObject private var store = Store() #endif @SceneBuilder var body: some Scene { WindowGroup { #if APPCLIP NavigationView { SmoothieMenu() } .environmentObject(model) .onContinueUserActivity(NSUserActivityTypeBrowsingWeb, perform: handleUserActivity) #else ContentView() .environmentObject(model) .environmentObject(store) #endif } } #if APPCLIP func handleUserActivity(_ userActivity: NSUserActivity) { guard let incomingURL = userActivity.webpageURL, let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true), let queryItems = components.queryItems else { return } if let smoothieID = queryItems.first(where: { $0.name == "smoothie" })?.value { model.selectSmoothie(id: smoothieID) } guard let payload = userActivity.appClipActivationPayload, let latitudeValue = queryItems.first(where: { $0.name == "latitude" })?.value, let longitudeValue = queryItems.first(where: { $0.name == "longitude" })?.value, let latitude = Double(latitudeValue), let longitude = Double(longitudeValue) else { return } let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: latitude, longitude: longitude), radius: 100, identifier: "smoothie_location") payload.confirmAcquired(in: region) { inRegion, error in if let error = error { print(error.localizedDescription) return } DispatchQueue.main.async { model.applePayAllowed = inRegion } } } #endif } 复制代码
其中handleUserActivity
就是在处理App Clip链接。
当然,直接将主App和App Clip的代码分开也是可以的,但是这可能对于两者区别较大的产品更适合,但同时也违反了Apple的初衷,希望App Clip仅仅是主App的一部分,这可能会导致审核遇阻。
相信看到这儿,大家应该对App Clip有一定了解,很多自媒体会拿微信小程序比较,认为App Clip是苹果小程序,如果仅从两者设计之初的理念来比较,确实比较相似,但是从其他方面来讲,两者差异较大:
也正是由于定位不同,微信小程序完全可以与App Clip共分天下,微信小程序已经形成生态圈,国内很多开发商专注于小程序的开发,都没有App,自然也就用不上App Clip,虽然App Clip必然会抢占小程序的市场,但是目前看,还是无法从根本上动摇小程序的地位。
虽然Apple对App Clip进行了相当详尽的说明,仍然有一些问题并没有找到答案:
WKWebview
(Web Api可以在App Clip使用)来展现更多内容,Apple是否有对策?相关Session:
WWDC20 Session 10174: Explore app clips
WWDC20 Session 10146: Configure and link your app clips
WWDC20 Session 10118: Create app clips for other businesses
WWDC20 Session 10120: Streamline your app clip
WWDC20 Session 10172: Design great app clips
官方Demo:
下载链接
原创不易,文章有任何错误,欢迎批(feng)评(kuang)指(diao)教(wo),顺手点个赞👍,不甚感激!