初探 App Clips in iOS 14

Sunny Cheng
9 min readJul 7, 2020

--

App Clips 功能對應 Android 的 Instant apps,主打可使用輕量功能且無需下載,將以浮動式卡片(App clip card)的方式呈現給使用者,其中浮動式卡片的介面在 App Store Connect 中設定。(8/27 更新— App Store Connect 開放設定了)

App Clips 使用者介面

使用者可透過 NFC 、 QR Code 、Safari 或 iMessage 分享 URL 或 Apple map 資訊嵌入等管道來開啟 App Clips,而開發者依然使用 UIKit 或 SwiftUI 開發。

當使用者一段時間沒有使用後,iOS 系統將會自動刪除 App Clips 與相關的 資料以保護用戶隱私,開發者無法獲得例如 fitness 或 health 等個人數據以及使用某些框架,如 CallKit、HomeKit等。

當用戶使用 App Clips 頻繁時,系統也會提供建議呈現的畫面。

App Clips 需與 App 一起過審,不能拆開。若使用者手機有安裝 App,則優先讓 App 接手,而非 App Clips。

限制

需小於 10 MB 以便快速下載,且一個 App 只能擁有一個 App Clip。

支援平台

與 App 設定相同,macOS 除外。

使用者隱私

為了保護使用者隱私,開發者無法獲得以下數據

  • Motion and fitness data
  • Apple Music and Media
  • Data from apps like Contacts, Files, Messages, Reminders, and Photos

設計建議

  1. 快速可完成的任務,避免使用者複雜操作。
  2. 提供價值給使用者,而非行銷用途。
  3. UX 入口越少越好,避免 Tab bars、複雜的頁面轉換或各種設定。
  4. 直接導引至使用者想看到的畫面。
  5. 讓使用者能快速啟動 App Clip 。
  6. 保證 App Clip 足夠輕量,避免不必要的程式碼以及不必要的資料下載。
  7. 創造連結讓 App Clip 可被使用者彼此分享。
  8. 讓使用者能快速且順利的付款,建議採用 Apple Pay。
  9. 避免需要帳號資訊。登入帳號是費時且複雜的操作,建議當使用者操作完 App Clip 時再要求註冊。若無法避免登入,須盡量減少輸入的資訊,可考慮採用 Sign in with Apple。
  10. App Clip 與主 App 的使用體驗要能接續。例如在 App Clip 登入過就應該避免使用者下載主 App 後開啟還需再登入一次。反過來說,也應該避免 App Clip 無法獨自完成任務,需要使用者下載主 App 才能完成。

Apple官方說明

如何創建

新建立 “App Clip” Target ,系統會自動帶入 App Name 與 Bundle ID(App Clip 本身的 Bundle ID 為主 App Bundle ID 後綴加上 .Clip)

與 App Clips 共享 Assets 或 files

在 Asset 上點選右鍵,新創 Asset Catalog 檔案,勾選 Target 包含主 App 與 App Clips。

在其他所需的分享的 swift 檔上,將 Target Membership 勾選 App Clip。

若檔案中有些變數牽連到某檔案,但無須跟 App Clip 分享時,可利用 Build Setting 中的 “Swift Compiler — Custom Flags” 新加入 “APPCLIP” ,並在程式碼中利用 #if 排除。

啟動 App Clip URL

與添加 Universal Link 相同

  1. Server 端添加 Apple App Site Association file
此為支援 Universal link 說明,App Clip 參數看下圖。Apple技術文件
將此字典添加進 Apple App Site Association file 中

2. Xcode — 添加 Associated Domains Entitlement

支援 Safari Smart App Banner

Smart App Banner(官方文件

如曾啟用 Smart App Banner,只需在網站加上 “app-clip-bundle-id=appClipBundleID” 屬性即可。

若未曾啟用 Smart App Banner,在網站上加入 HTML meta tag

官方文件

App Clip 響應 (Response to invocations)

  1. SwiftUI:onContinueUserActivity(_:perform:)
  2. App Delegate app:application(_:continue:restorationHandler:)
  3. Scene-Based app:scene(_:willContinueUserActivityWithType:)

接到 NSUserActivity 物件解析

NSUserActivity 裡的 webpageURL,Apple 文件

假設情況為實體的 NFC Tag 或需要檢查使用者打開 Clip 的所在位置是否正確

  1. 在 App Clip 的 info.plist 新增 ”NSAppClip”,數據類型為 NSDictionary。NSDictionary 放入 Key 為NSAppClipRequestLocationConfirmation並選擇數據類型為布林值。主 App 的 Info.plist 無需額外新增,因 App Clip 已檢查。另外介面也會提醒使用者此 App Clip 會檢查其所在位置,預設為開啟,但使用者可以選擇手動關閉。
App Clip 內的 info.plist 設定

2. 藉由 NSUserActivity.appClipActivationPayload 檢查

浮動式卡片介面

在 App Store Connect 設定,有兩種呈現方式

  1. Default App Clip Experience
  2. Advanced App Clip Experiences:可根據 URL 不同、使用者所在地點不同或不同的喚醒情況,來提供不同的浮動式卡片。

Image:3000px × 2000px PNG or JPEG,避免使用截圖。

Title:一眼可理解的資訊。

SubTitle:盡量減少文字描述。

Action Button:使用動詞,例如 View、Play、Open。

導下載視窗

使用 SKOverlaySKStoreProductViewController 來顯示導流視窗。

Apple 官方文件

需注意跳出安裝主 App 視窗的時機,不應該打斷使用者正在進行中的任務。

在卡片式介面或者是 App Clip 中導引至 App Store 下載

數據共享

應避免共享敏感資訊,例如密碼。

當使用者安裝後,主 App 將會接手原先 App Clip 的所有入口,須確保使用者得到連續的體驗,可藉由 Group Container 傳遞 data 至 App 使用,系統會自動刪除 App Clip 與其相關的 data。

加入相同的 App Group

  1. Xcode 專案中,主 App 與 App Clip 均在 Capabilities 頁面將 App Groups 開關打開。
  2. 主 App 與 App Clip 均加入相同的 app group,例如”group.exampleApp.appClipMigration“

使用 Shared Container 共享數據

  1. 在 App Clip 中使用containerURL(forSecurityApplicationGroupIdentifier:)得到指向共享空間的 URL,並利用此 URL 寫入數據,如使用write(to:atomically:encoding:)儲存 NSString。
  2. 在主 App 中使用相同的containerURL(forSecurityApplicationGroupIdentifier:)得到指向共享空間的 URL,並利用此 URL 讀取數據,如使用init(contentsOf:)獲得 NSString。

使用 UserDefaults 共享數據

  1. 儲存數據
App Clip

2. 讀取數據

主 App

使用者登入需求

ASAuthorizationController可幫助使用者存取已存在的帳密並登入,或者使用 Sign In With Apple 註冊新帳號。

開發者測試

可通過設置_XCAppClipURL環境變數來模擬使用者點選 URL 後的情況,選擇 App Clip 為 Target 運行後,測試是否得到 NSUserActivity 物件。

若已遞交新版本至 App Store Connect 並開啟測試,可發送 TestFlight 連結給測試者,惟需注意透過 TestFlight 開啟將會跳過 App Clip Card 畫面直接進入 App Clip 。

--

--

Sunny Cheng
Sunny Cheng

Written by Sunny Cheng

礦冶工程碩士,職涯第一個轉彎為新加坡市場的業務經理,自學後又轉彎成 OTT 產業的 iOS 工程師。

No responses yet