開(kāi)發(fā)一個(gè) App Clip 并不難!我們立馬上開(kāi)發(fā)教程(app clips開(kāi)發(fā))
在 2020 年 6 月 23 日的 WWDC 大會(huì)中,蘋果預(yù)告了 App Clips 。
App Clip(官方翻譯:輕 App;民間翻譯:「蘋果」小程序),是主 app 輕量級(jí)的版本,旨在在特定場(chǎng)景為用戶提供快速便捷的體驗(yàn)。
如果你在上班路上經(jīng)過(guò)一家咖啡店想購(gòu)買一杯咖啡,但發(fā)現(xiàn)排隊(duì)下單付款的人很多,此刻你只需要使用 iPhone 自帶的掃碼工具掃描咖啡商店的 App Clip 二維碼或 NFC 標(biāo)簽,就可以購(gòu)買一杯咖啡,無(wú)需下載安裝咖啡商店的 app。
▲圖片來(lái)源:蘋果官網(wǎng)
這應(yīng)用場(chǎng)景聽(tīng)起來(lái)是不是跟微信小程序很像?
是的,于是我們?cè)?App Clips 發(fā)布后就立刻進(jìn)行了 App Clips 和微信小程序的對(duì)比和實(shí)操。(點(diǎn)此查看詳細(xì)內(nèi)容)
我們發(fā)現(xiàn),App Clips 和微信小程序的存在都是為了解決同一個(gè)問(wèn)題。但就開(kāi)發(fā)而言,App Clips 和微信小程序亦存在著方向上的差異。
微信小程序是 0 到 0.1 再到 1.0。開(kāi)發(fā)者為提供一個(gè)服務(wù),從頭開(kāi)始開(kāi)發(fā)小程序,用戶用完即走,體驗(yàn)很棒。App Clips 則是從 1.0 到 0.1,是對(duì)現(xiàn)有 app 的一種改良,因此在開(kāi)發(fā)上遇到的麻煩反而會(huì)少一些。
下面,我們就針對(duì) App Clip 幾個(gè)重要特性進(jìn)行詳細(xì)說(shuō)明,并以 App Clip demo 為例,講一講開(kāi)發(fā)的那些事。無(wú)論你是基于實(shí)際業(yè)務(wù)需要,或者學(xué)習(xí)、探索新事物的需求,只要具備一定的開(kāi)發(fā)基礎(chǔ),通過(guò)本教程,也能輕松搞定一個(gè) App Clip。
App Clip 的技術(shù)限制
App Clip 僅限應(yīng)用于特定場(chǎng)景,即盡可能快地完成一個(gè)任務(wù),即用即走。你可以把它看作主 app 的核心功能應(yīng)用,對(duì)于復(fù)雜的任務(wù)應(yīng)該在其對(duì)應(yīng)的主 app 完成,因此某些功能被禁止在 App Clip 中使用。
安裝包大小 10M 以內(nèi)
當(dāng)彈出 App Clip Card 時(shí)會(huì)立即下載 App Clip,安裝包大小的限制保證了用戶體驗(yàn) —— 當(dāng)用戶打開(kāi) App Clip 時(shí)大概率已經(jīng)下載好。
不能使用指定 Framework
Assets Library, CallKit, CareKit, CloudKit, Contacts, Contacts UI, Core Motion, File Provider, File Provider UI, HealthKit, HomeKit, Media, Player, Messages, Message UI, PhotoKit, ResearchKit, SensorKit, Speech
以上 Framework 不能在 AppClip 使用,若使用了在編譯時(shí)不會(huì)報(bào)錯(cuò),而是在運(yùn)行時(shí)報(bào)錯(cuò)或者返回錯(cuò)誤的結(jié)果。
與用戶隱私相關(guān)操作
- 不能跟蹤用戶信息,也不能通過(guò) identifierForVendor 來(lái)獲取用戶唯一標(biāo)識(shí)。
- 不能持續(xù)地獲取用戶位置,每次使用位置需要請(qǐng)求用戶授權(quán),次日凌晨 4:00,會(huì)自動(dòng)關(guān)閉授權(quán)。再次使用位置時(shí),需要用戶重新授權(quán)。
- 只允許 App Clip 和其對(duì)應(yīng)的主 app 通信,不允許和其他 app 進(jìn)行通信,這就導(dǎo)致微信登錄分享支付等功能在 App Clip 里使用不了。
- 不能訪問(wèn)蘋果音樂(lè)、多媒體,通訊錄,文件,運(yùn)動(dòng)健康,相冊(cè)等數(shù)據(jù)。
其他復(fù)雜任務(wù)
- 后臺(tái)活動(dòng):網(wǎng)絡(luò)請(qǐng)求、位置更新等
- 藍(lán)牙連接
- App extensions
- URL schemes
- 內(nèi)購(gòu)(In-app purchases)(區(qū)別蘋果支付 Apple Pay,在 App Clip 是能夠使用蘋果支付的)
App Clips 的消息推送
微信小程序不能通過(guò) Push 的方式觸達(dá)用戶曾讓開(kāi)發(fā)者憂心忡忡。而手機(jī)廠商推出的系統(tǒng)級(jí)應(yīng)用在這方便可以給開(kāi)發(fā)者更多的底氣,不管是蘋果的 App Clips 還是國(guó)產(chǎn)手機(jī)生態(tài)的快應(yīng)用,服務(wù)的消息推送能力都是吸引開(kāi)發(fā)者的重要能力。
消息推送在 App Clip 的應(yīng)用分兩種場(chǎng)景:短時(shí)間內(nèi)推送和長(zhǎng)時(shí)間內(nèi)的推送。(官方文檔)
短時(shí)間內(nèi)推送
用戶在啟動(dòng) App Clip 后,8 小時(shí)內(nèi)可以收到消息推送。比如用戶在 App Clip 購(gòu)買了一杯咖啡后就退出了 App Clip,當(dāng)咖啡準(zhǔn)備好了,用戶就會(huì)收到一個(gè)「咖啡已準(zhǔn)備好」的推送。這方式只需要在 Info.plist 屬性文件中添加 NSAppClip Key,并將 NSAppClipRequestEphemeralUserNotification 設(shè)置為 true,就能默認(rèn)獲取消息推送的權(quán)限。
長(zhǎng)時(shí)間內(nèi)推送
用戶在 App Clip 完成一個(gè)任務(wù)后,可能過(guò)了幾天才會(huì)收到推送。比如用戶在 App Clip 租了輛車,租期為 3 天,到期后會(huì)用戶收到「該還車了」的推送。這種方式和普通 app 的消息推送一樣,都需要獲取用戶的推送授權(quán)。
使用 MinCloud 創(chuàng)建一個(gè) App Clip
接下來(lái)將演示如何創(chuàng)建一個(gè) App Clip。該 Clip 主要展示了一個(gè)產(chǎn)品列表,點(diǎn)擊產(chǎn)品即可跳轉(zhuǎn)到產(chǎn)品詳情頁(yè)。通過(guò)集成 MinCloud 從知曉云獲取產(chǎn)品信息,最后為該 Clip 生成一個(gè)二維碼,用戶只需使用 iOS 14 的掃碼工具掃描二維碼,即可跳轉(zhuǎn)到 Clip。
創(chuàng)建 App Clip Target
在已存在的 SugarDemo 工程創(chuàng)建一個(gè) App Clip Target,并命名為 SugarClip。
這時(shí)在工程目錄中多了個(gè) SugarClip 目錄,接下來(lái)我們就可以在這里實(shí)現(xiàn) App Clip 了。
導(dǎo)入 MinCloud
通過(guò) CocoaPods 集成 MinCloud,打開(kāi) Podfile 文件,添加以下內(nèi)容:
platform :ios, '11.0' target 'SugarClip' do use_frameworks! pod 'MinCloud', :git => 'https://github.com/ifanrx/hydrogen-ios-sdk.git' pod 'Moya', '~> 13.0' pod 'SnapKit' pod 'Kingfisher' end target 'SugarDemo' do use_frameworks! pod 'MinCloud',:git => 'https://github.com/ifanrx/hydrogen-ios-sdk.git' pod 'SnapKit' pod 'Kingfisher' end
添加完后,執(zhí)行 pod install 安裝。
安裝好 MinCloud 后在工程中導(dǎo)入 MinCloud,打開(kāi) Sugar Clip 的 AppDelegate.swift 文件,在文件頂部添加 import MinCloud,并在 application (_: didFinishLaunchingWithOptions:) 方法內(nèi)添加:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. BaaS.register(clientID: "fdc4feb5403a985fe681") // 注冊(cè) clientid BaaS.isDebug = true // 是否打印日志 return true}
獲取產(chǎn)品數(shù)據(jù)
Product 結(jié)構(gòu)
首先創(chuàng)建一個(gè) Product 結(jié)構(gòu),用于表示產(chǎn)品信息。
struct Product: Decodable { public var id: String // 產(chǎn)品 id public var name: String? // 產(chǎn)品名稱 public var participantCount: Int? // 參與討論人數(shù) public var coverImage: String? // 封面圖 public var rating: Double? // 產(chǎn)品評(píng)分 public var brief: String? // 產(chǎn)品簡(jiǎn)介 public var description: String? // 產(chǎn)品描述}
獲取產(chǎn)品列表
func loadProductList() { let table = Table(tableId: "105766") table.find { [weak self] (recordList, error) in if let list: List<Product> = recordList?.listInfo.decoded() { self?.products = list.objects self?.tableView.reloadData() // 刷新產(chǎn)品列表 } }}
Table 對(duì)應(yīng) MinCloud 的表結(jié)構(gòu),通過(guò)表 id 就可以操作對(duì)應(yīng)表數(shù)據(jù)。使用 find 操作來(lái)獲取產(chǎn)品表所有產(chǎn)品記錄,獲取產(chǎn)品記錄后,將其解碼為 List<Product> 對(duì)象。
獲取產(chǎn)品詳情
func loadProduct() { let table = Table(tableId: "105766") table.get(productId) { [weak self] (record, error) in if let product: Product = record?.recordInfo.decoded() { self?.product = product self?.displaySubviews() // 展示產(chǎn)品詳細(xì)信息 } }}
使用 get 操作指定產(chǎn)品的 id 獲取產(chǎn)品的所有信息,獲取產(chǎn)品記錄后,將其解碼為 Product 對(duì)象。
產(chǎn)品頁(yè)面
在項(xiàng)目中創(chuàng)建了 ProductCell、RatingLabel、BriefView 等視圖控件,分別顯示產(chǎn)品列表項(xiàng)、產(chǎn)品評(píng)分、產(chǎn)品簡(jiǎn)介等信息。而這些控件可以在主 App 和 App Clip 復(fù)用。因此在 SugarDemo 目錄中創(chuàng)建了需要復(fù)用的組件,并將對(duì)應(yīng)的文件的 Target Membership 中勾選 SugarDemo 和 SugarClip 即可復(fù)用。
喚醒 App Clip
開(kāi)發(fā)完 App Clip 后,我們可以點(diǎn)擊 Smart app Banner,掃碼二維碼或 NFC 標(biāo)簽,點(diǎn)擊 Siri 獲取基于位置的建議,短信等方式來(lái)喚醒(invacation)App Clip。
在 AppClip 可以被喚醒之前需要配置 Launch Experience,即給 App Clip 配置一個(gè) URL 和 App Clip Card 信息。在開(kāi)發(fā)階段可以直接配置 Local Experience 或者在 testflight 上進(jìn)行配置。App Clip 準(zhǔn)備發(fā)布時(shí),需要在 app store connect 上進(jìn)行配置。
本文主要介紹 Local Experience 方式,其他方式可參考蘋果開(kāi)發(fā)文檔。
1. 首先將 SugarClip 通過(guò) Xcode 在手機(jī)運(yùn)行起來(lái)。
2. 打開(kāi)手機(jī)【設(shè)置】-【開(kāi)發(fā)者】-【Local Experience】-【Register Local Experience】。
- 填入 URL PREFIX,打開(kāi)任何以 URL PREFIX 為前綴的 URL,都會(huì)被當(dāng)做打開(kāi) App Clip 來(lái)處理。
- 填入 Clip Bundle Id。
- 填入 Title、Subtitle,選擇一張圖片,這些信息將會(huì)顯示在 App Clip Card 上。
3. 步驟 2 的 URL PREFIX 編碼成一個(gè)二維碼(https://www.qr-code-generator.com/)
4. 使用控制面板的二維碼掃描器掃描,將會(huì)彈出 App Clip Card。
5. 點(diǎn)擊查看,進(jìn)入 App Clip
至此,我們已經(jīng)完成了一個(gè) App Clip 的開(kāi)發(fā),可以對(duì)整個(gè)過(guò)程做一些總結(jié):
開(kāi)發(fā)難度:
App Clip 從技術(shù)選型上是面向 iOS 開(kāi)發(fā)者的,對(duì) iOS 開(kāi)發(fā)者來(lái)說(shuō),開(kāi)發(fā) App Clip 可以簡(jiǎn)單到修改點(diǎn)配置即可發(fā)布。而如果是小程序開(kāi)發(fā)者想要入坑,有兩條路可以走:
- 學(xué)習(xí) iOS 原生開(kāi)發(fā);
- 等待跨端的框架適配 App Clip。
挑戰(zhàn):
App Clip 現(xiàn)階段只允許使用 Sign in with Apple 蘋果登錄、Apple Pay 蘋果支付,無(wú)法集成微信登錄、微信支付等線下服務(wù)場(chǎng)景主流的第三方能力。這對(duì)想要使用 App Clip 優(yōu)化線下服務(wù)體驗(yàn)來(lái)說(shuō)是個(gè)挑戰(zhàn),畢竟國(guó)內(nèi)開(kāi)通了 Apple Pay 的不是多數(shù)。希望 App Clip 團(tuán)隊(duì)早日推出更好的解法。
紅利:
App Clip 體驗(yàn)輕巧優(yōu)秀,開(kāi)發(fā)者可通過(guò) App Clip 為主體 app 做一個(gè)試玩試用版本,讓用戶快速體驗(yàn),以降低用戶安裝門檻,提高整體轉(zhuǎn)化率。
通過(guò)這篇文章,希望你也能高效的開(kāi)發(fā)一個(gè) App Clip。