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),順手點個贊👍,不甚感激!
相關文章
相關標籤/搜索