WWDC20 第二弹 - 苹果小程序?App Clip

App Clip能够说是一众Session里最引人注目的了,Apple生态又增长了新的产品形态。不管认可与否,当裁判也开始下场踢球,App Clip将带来的改变毫不可小觑。

什么是App Clips?


从Apple Session的说明,咱们能够这么理解:用户经过 NFC 标签、二维码、Message 信息、Map 、Safari、Siri 建议等途径唤起 App Clip应用程序,在未安装主App的状况下,以相似网页的接触形式和原生级别的体验,使用主App中的某些服务和功能git

App Clip实际上就是一段格式听从 Universal Link 格式的URL标识,Apple针对作了系统级处理。只不过App Clip URL与应用同样,必须在App Store Connect注册。web

PS:详细内容感兴趣的能够查看WWDC20 Session 10146: Configure and link your app clips小程序

使用场景

Apple对于App Clip的定位是但愿可以进一步触及到用户生活的方方面面,包括一些低频但必要的场景。 swift

在上面的一些场景中,每每用户并无特别服务于当前场景下的App,若是有一个程序足够轻量,免安装,且快速且高效地让用户可以触达当前场景下的服务,连通人与线下是否是更简单?这就是App Clips的设计初衷,让人与线下服务更触手可及。

以Apple提供的订购沙冰的例子说明:经过NFC唤醒商家App Clip,点击打开并开始购买。 微信小程序

如何唤醒?

苹果对App Clip的使用场景很是明确,系统对调起方式作了严格的过滤,支持的发起入口有以下几种:微信

  1. NFC
  2. QR Codes(也就是二维码,专门的生成工具会在年末开放)
  3. Maps
  4. Siri 建议
  5. Safari连接
  6. Messages

特色

  1. 因为有10M的大小限制,对于如今的网络状态而言(国内移动网络,懂得都懂),基本能够快速的打开,所以苹果在App Clip的提示上都使用了“Open”而不是“Install”,来下降用户的接受程度。
  2. 为了进一步提升App Clip到主App的转化,在使用App Clip的过程当中,Apple也会明显提示主App的存在,方便用户直接去下载。
  3. 30天不使用,系统自动删除App Clip及数据,来确保用户的存储空间可以合理分配。
  4. 支持地理位置,相机,麦克风和蓝牙等权限,限制访问 Health、Fitness、通信录、信息、照片、文件等我的数据。
  5. 为了不弹窗受权的糟糕体验,设计了免申请的通知、定位权限。固然仍是有限制,免申请的通知只在 8 个小时内有效,地理位置只能获取一次。
  6. 支持Sign in with Apple,也支持ASWebAuthenticationSession来第三方登陆,以及使用Apple Pay。
  7. 不会与App一块儿出如今用户的Setting App里,有单独的App Clips的分组。
  8. 一旦安装了主App,对应的App Clip将会被删除,再点击连接将会直接进入主App。

实现方式


依赖主App

虽然对于用户来讲不须要下载主App,但开发者必须使App Clip跟随主App一同提交审核,App Clip并不可以独立开发并提审。(这与Apple设计之初的理念是一致的,目的是为了快速体验功能,而不是替代App)markdown

独立的Target

在开发上,也是彻底Native的实现,相似于一个新增的Extension target,例如Keyboard Extension、iMessage Extension等。网络

支持UIKit与SwiftUI

有些人认为只可以使用SwiftUI开发(包括个人leader),其实是错误的,Apple只是说SwiftUI开发会更快(毕竟将来主打),能够直接看测试工程:app

App Clip不只支持SwiftUI,也支持UIKit,包括不少人还在坚守的Objective-C,彻底都没有问题,并不存在上手难度。async

数据共享

因为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 体验,例如官方提供的统一连锁下不一样咖啡馆举例:

如何处理Universal Link和App Clip URL?

官方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是苹果小程序,若是仅从二者设计之初的理念来比较,确实比较类似,可是从其余方面来说,二者差别较大:

  1. 入口不一样:App Clip支持多种打开方式,微信小程序只支持从微信进入,可是后者支持主动搜索。
  2. 性能不一样:App Clip依赖于系统,微信小程序依赖于微信,原生性能会明显优于小程序。
  3. 体验路径不一样:微信小程序须要打开微信,下拉小程序列表,找到并打开目标小程序,App Clip一步到位,实施降维打击。
  4. 定位不一样:App Clip明确是主App功能的一部分,不能作主App无关的内容,可是微信小程序没有该限制,而且支持独立发布。

也正是因为定位不一样,微信小程序彻底能够与App Clip共分天下,微信小程序已经造成生态圈,国内不少开发商专一于小程序的开发,都没有App,天然也就用不上App Clip,虽然App Clip必然会抢占小程序的市场,可是目前看,仍是没法从根本上动摇小程序的地位。

一些有待探索的问题


虽然Apple对App Clip进行了至关详尽的说明,仍然有一些问题并无找到答案:

  1. 若是App Clip不只提供快捷功能,再经过WKWebview(Web Api能够在App Clip使用)来展示更多内容,Apple是否有对策?
  2. Apple明确限制了包体大小,可是对于内存并无说明,例如Keyboard的内存管理十分严格,只有几十M,若是App Clip也采起一样限制,开发者还须要注意内存占用的问题。

相关Session

原创不易,文章有任何错误,欢迎批(feng)评(kuang)指(diao)教(wo),顺手点个赞👍,不甚感激!
相关文章
相关标签/搜索