初探 App Clips in iOS 14
App Clips 功能對應 Android 的 Instant apps,主打可使用輕量功能且無需下載,將以浮動式卡片(App clip card)的方式呈現給使用者,其中浮動式卡片的介面在 App Store Connect 中設定。(8/27 更新— App Store Connect 開放設定了)
使用者可透過 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
設計建議
- 快速可完成的任務,避免使用者複雜操作。
- 提供價值給使用者,而非行銷用途。
- UX 入口越少越好,避免 Tab bars、複雜的頁面轉換或各種設定。
- 直接導引至使用者想看到的畫面。
- 讓使用者能快速啟動 App Clip 。
- 保證 App Clip 足夠輕量,避免不必要的程式碼以及不必要的資料下載。
- 創造連結讓 App Clip 可被使用者彼此分享。
- 讓使用者能快速且順利的付款,建議採用 Apple Pay。
- 避免需要帳號資訊。登入帳號是費時且複雜的操作,建議當使用者操作完 App Clip 時再要求註冊。若無法避免登入,須盡量減少輸入的資訊,可考慮採用 Sign in with Apple。
- App Clip 與主 App 的使用體驗要能接續。例如在 App Clip 登入過就應該避免使用者下載主 App 後開啟還需再登入一次。反過來說,也應該避免 App Clip 無法獨自完成任務,需要使用者下載主 App 才能完成。
如何創建
新建立 “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 相同
- Server 端添加 Apple App Site Association file
2. Xcode — 添加 Associated Domains Entitlement
支援 Safari Smart App Banner
如曾啟用 Smart App Banner,只需在網站加上 “app-clip-bundle-id=appClipBundleID” 屬性即可。
若未曾啟用 Smart App Banner,在網站上加入 HTML meta tag
App Clip 響應 (Response to invocations)
- SwiftUI:
onContinueUserActivity(_:perform:)
- App Delegate app:
application(_:continue:restorationHandler:)
- Scene-Based app:
scene(_:willContinueUserActivityWithType:)
接到 NSUserActivity 物件解析
假設情況為實體的 NFC Tag 或需要檢查使用者打開 Clip 的所在位置是否正確
- 在 App Clip 的 info.plist 新增 ”NSAppClip”,數據類型為 NSDictionary。NSDictionary 放入 Key 為
NSAppClipRequestLocationConfirmation
並選擇數據類型為布林值。主 App 的 Info.plist 無需額外新增,因 App Clip 已檢查。另外介面也會提醒使用者此 App Clip 會檢查其所在位置,預設為開啟,但使用者可以選擇手動關閉。
2. 藉由 NSUserActivity.appClipActivationPayload 檢查
浮動式卡片介面
在 App Store Connect 設定,有兩種呈現方式
- Default App Clip Experience
- Advanced App Clip Experiences:可根據 URL 不同、使用者所在地點不同或不同的喚醒情況,來提供不同的浮動式卡片。
Image:3000px × 2000px PNG or JPEG,避免使用截圖。
Title:一眼可理解的資訊。
SubTitle:盡量減少文字描述。
Action Button:使用動詞,例如 View、Play、Open。
導下載視窗
使用 SKOverlay
或 SKStoreProductViewController
來顯示導流視窗。
需注意跳出安裝主 App 視窗的時機,不應該打斷使用者正在進行中的任務。
數據共享
應避免共享敏感資訊,例如密碼。
當使用者安裝後,主 App 將會接手原先 App Clip 的所有入口,須確保使用者得到連續的體驗,可藉由 Group Container 傳遞 data 至 App 使用,系統會自動刪除 App Clip 與其相關的 data。
加入相同的 App Group
- Xcode 專案中,主 App 與 App Clip 均在 Capabilities 頁面將 App Groups 開關打開。
- 主 App 與 App Clip 均加入相同的 app group,例如”group.exampleApp.appClipMigration“
使用 Shared Container 共享數據
- 在 App Clip 中使用
containerURL(forSecurityApplicationGroupIdentifier:)
得到指向共享空間的 URL,並利用此 URL 寫入數據,如使用write(to:atomically:encoding:)
儲存 NSString。 - 在主 App 中使用相同的
containerURL(forSecurityApplicationGroupIdentifier:)
得到指向共享空間的 URL,並利用此 URL 讀取數據,如使用init(contentsOf:)
獲得 NSString。
使用 UserDefaults 共享數據
- 儲存數據
2. 讀取數據
使用者登入需求
ASAuthorizationController
可幫助使用者存取已存在的帳密並登入,或者使用 Sign In With Apple 註冊新帳號。
開發者測試
可通過設置_XCAppClipURL
環境變數來模擬使用者點選 URL 後的情況,選擇 App Clip 為 Target 運行後,測試是否得到 NSUserActivity 物件。
若已遞交新版本至 App Store Connect 並開啟測試,可發送 TestFlight 連結給測試者,惟需注意透過 TestFlight 開啟將會跳過 App Clip Card 畫面直接進入 App Clip 。