一.簡(jiǎn)介
在 2020 年 6 月 23 日的 WWDC 大會(huì)中逸邦,蘋果預(yù)告了 App Clips 。
App Clip(官方翻譯:輕 App爬早;民間翻譯:「蘋果」小程序)捍掺,是主 app 輕量級(jí)的版本,旨在在特定場(chǎng)景為用戶提供快速便捷的體驗(yàn)靶擦。
如果你在上班路上經(jīng)過一家咖啡店想購買一杯咖啡腮考,但發(fā)現(xiàn)排隊(duì)下單付款的人很多,此刻你只需要使用 iPhone 自帶的掃碼工具掃描咖啡商店的 App Clip 二維碼或 NFC 標(biāo)簽玄捕,就可以購買一杯咖啡踩蔚,無需下載安裝咖啡商店的 app。
App Clip的啟動(dòng)需要由一個(gè)調(diào)用方調(diào)起枚粘,在iOS開發(fā)中寂纪,更專業(yè)點(diǎn)的術(shù)語叫invocation,invocation可以是多種形態(tài)的赌结,例如通過點(diǎn)擊基于位置信息的推薦Banner,點(diǎn)擊Sari的推薦或者通過掃描二維碼或NFC等孝冒。App Clip被invocation調(diào)起后柬姚,用戶可以通過它完成一件專注的任務(wù),當(dāng)用戶不再需要使用它時(shí)庄涡,它會(huì)自動(dòng)的被iPhone移除量承,這個(gè)過程對(duì)用戶來說是無感知的,因此App Clip也不會(huì)占用用戶的桌面空間穴店。
前面說過撕捍,App Clip的啟動(dòng)需要由invocation來觸發(fā),invocation包括如下5中場(chǎng)景:
通過NFC掃描來喚起
通過點(diǎn)擊Sari提供的基于地理位置的推薦
在地圖App上點(diǎn)擊指定的鏈接
點(diǎn)擊網(wǎng)頁上的智能推薦橫幅
通過Messages App分享的鏈接
如上圖泣洞,當(dāng)某個(gè)invocation觸發(fā)了App Clip時(shí)忧风,系統(tǒng)首先會(huì)檢查invocation關(guān)聯(lián)的URL,通過URL獲取用來展示預(yù)覽信息的數(shù)據(jù)球凰,預(yù)覽信息包括一個(gè)背景圖案狮腿,描述標(biāo)題與啟動(dòng)按鈕腿宰,用戶點(diǎn)擊啟動(dòng)按鈕后會(huì)打開App Clip。我們可以在App Clip啟動(dòng)時(shí)拿到傳遞進(jìn)來的URL缘厢,通過URL的參數(shù)進(jìn)行不同的邏輯處理吃度。
了解了App Clips的啟動(dòng)過程,我們知道實(shí)際上在啟動(dòng)App Clip之前贴硫,系統(tǒng)會(huì)先彈出一個(gè)預(yù)覽卡片椿每,這個(gè)卡片上的信息可以由開發(fā)者在iTunes Connect上自行定義。
在著手開發(fā)App Clips之前英遭,還有一些事情我們需要考慮间护。
A. 提供暢快的用戶體驗(yàn)
App Clips不會(huì)像通常的App那樣展示一個(gè)圖標(biāo)在主屏幕上,用戶不需要對(duì)App Clips進(jìn)行管理贪绘,不用下載也無需刪除兑牡,當(dāng)指定的App Clip一段時(shí)間不活躍后,系統(tǒng)會(huì)自動(dòng)對(duì)它們進(jìn)行清除税灌。因此均函,官方建議,App Clips提供的功能應(yīng)該是線性的菱涤,讓用戶一次性的完成任務(wù)苞也。
B. App Clips需要足夠小巧
App Clips應(yīng)該足夠的小巧,官方限定不可超過10M大小粘秆,只有足夠小如迟,在用戶需要使用的時(shí)候才能以更短的時(shí)間加載與展示。
C. 檢查可用的框架
在開發(fā)之前攻走,首先要確認(rèn)下App Clips可用的框架殷勘,大部分主App可用的框架在App Clips中都可以使用,但并不是所有昔搂,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中是不被支持的,若使用了在編譯時(shí)不會(huì)報(bào)錯(cuò)玲销,而是在運(yùn)行時(shí)報(bào)錯(cuò)或者返回錯(cuò)誤的結(jié)果。
D. 保護(hù)用戶隱私
由于App Clips會(huì)以推薦或其他廣告的方式觸發(fā)摘符,因此保護(hù)用戶的隱私非常重要贤斜。在App Clips中,隱私保護(hù)會(huì)一直被啟用逛裤,例如對(duì)后臺(tái)定位權(quán)限的申請(qǐng)瘩绒,當(dāng)用戶同意后,次日的凌晨4點(diǎn)带族,這個(gè)權(quán)限會(huì)被重新關(guān)閉锁荔,如果再次啟用了App Clips,需要重新向用戶申請(qǐng)蝙砌。當(dāng)然堕战,還有一些權(quán)限在App Clips中是禁止獲取的坤溃,其中有:運(yùn)動(dòng)和健身數(shù)據(jù),音樂和多媒體文件嘱丢,通訊錄/信息/照片等文件薪介。除了其宿主App意外,App Clips也不可以和其他應(yīng)用共享數(shù)據(jù)越驻。
App Clips 的消息推送
微信小程序不能通過 Push 的方式觸達(dá)用戶曾讓開發(fā)者憂心忡忡汁政。而手機(jī)廠商推出的系統(tǒng)級(jí)應(yīng)用在這方便可以給開發(fā)者更多的底氣,不管是蘋果的 App Clips 還是國產(chǎn)手機(jī)生態(tài)的快應(yīng)用缀旁,服務(wù)的消息推送能力都是吸引開發(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 購買了一杯咖啡后就退出了 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ù)后,可能過了幾天才會(huì)收到推送肾档。比如用戶在 App Clip 租了輛車摹恰,租期為 3 天,到期后會(huì)用戶收到「該還車了」的推送怒见。這種方式和普通 app 的消息推送一樣俗慈,都需要獲取用戶的推送授權(quán)。
二.實(shí)戰(zhàn)開發(fā)
前面講了很多開發(fā)App Clips的介紹遣耍,現(xiàn)在就讓我們上手創(chuàng)建一個(gè)App Clip體驗(yàn)一下姜盈。創(chuàng)建App Clip非常簡(jiǎn)單,首先其需要一個(gè)宿主App配阵,如果為已經(jīng)存在的一個(gè)完全應(yīng)用程序添加App Clip,就更加容易示血,我們只需要新建一個(gè)Target棋傍,選擇App Clip即可,通過File->New->target,選擇AppClip
难审,Xcode接下來會(huì)自動(dòng)給我們創(chuàng)建號(hào)一系列必須的文件瘫拣,并做好配置,這個(gè)時(shí)候我們可以直接選擇Clip的target進(jìn)行運(yùn)行告喊,只不過是一片空白麸拄。
前面說過派昧,App Clip的運(yùn)行需要invocation進(jìn)行調(diào)用,對(duì)于invocation的調(diào)用拢切,如果用戶安裝了完全的主App蒂萎,則會(huì)喚起主App來處理用戶任務(wù),如果用戶沒有安裝主App淮椰,則自動(dòng)調(diào)起App Clip五慈。無論通過哪種invocation來調(diào)起App Clip,我們都需要在App Clip的target中配置指定的域權(quán)限主穗。在target工程的設(shè)置頁面泻拦,找到Associated Domains選項(xiàng),在其中添加要調(diào)起App Clip的域名忽媒,需要找到這樣的格式:appclips:xxx.com争拐。這種配置方式與Deep link的邏輯基本一致。
服務(wù)器配置晦雨,在系統(tǒng)彈出 app clip 或允許 app clip 調(diào)用之前架曹,系統(tǒng)會(huì)驗(yàn)證 app clip 的配置和調(diào)用的URL。如果無法執(zhí)行驗(yàn)證金赦,則不會(huì)顯示app clip音瓷,也不會(huì)啟動(dòng)。配置方法跟UniversalLink一樣夹抗,在 server 的 App Site Association (通常是在網(wǎng)站 .well-known 下的 apple-app-site-association 文件) 中添加這個(gè)域名對(duì)應(yīng)的 appclips 條目:新增一個(gè)鍵值對(duì)绳慎,key為appclips,value為一個(gè)對(duì)象 "apps": ["bundle id.Clip"]
{
"applinks": {
"apps": [],
"details": [
{
"appID": "37PVRFWV9E.com.aihuishou.OPTapp.P",
"paths": [ "*"]
},
{
"appID": "889ZY53ZAF.com.aihuishou.OPTapp.J",
"paths": [ "*" ]
}
]
},
"appclips": {
"apps": [ "37PVRFWV9E.com.aihuishou.OPTapp.P.Clip" ]
}
}
一個(gè)能夠啟動(dòng)appClip的AppBanner形式如下:
<meta
name="apple-itunes-app"
content="app-id=myAppStoreID, app-clip-bundle-id=appClipBundleID
>
App clip card 顯示時(shí)漠烧,你的 app clip 就已經(jīng)開始下載了杏愤。App clip 的體積必須在 10MB 以內(nèi)。這樣已脓,大概率在用戶選擇打開你的 app clip 之前珊楼,就能下載完成,以提供良好體驗(yàn)度液。
用戶點(diǎn)擊 banner 或者 iMessage 鏈接厕宗,且繼續(xù)點(diǎn)擊打開按鈕后,app clip 的 user activity 關(guān)聯(lián)的生命周期函數(shù)將被調(diào)用堕担,swift中是
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
print(userActivity.webpageURL)
}
上面webpageURL就是獲取到調(diào)用的鏈接已慢。也可以通過這個(gè)來區(qū)分不同的應(yīng)用場(chǎng)景。
在開發(fā)時(shí)霹购,可以通過設(shè)置 _XCAppClipURL 這個(gè)環(huán)境變量佑惠,并運(yùn)行 app clip target 來“模擬”通過特定 URL 點(diǎn)擊后的情況。當(dāng) Associated Domain 設(shè)置正確后,在 Xcode 中運(yùn)行 app clip膜楷,就可以拿到包含這個(gè)環(huán)境值的 NSUserActivity旭咽。這樣在 Beta 期間的本地開發(fā)就不需要依賴外部 server 環(huán)境了。
首先配置一下_XCAppClipURL:
特別說明一下赌厅,這個(gè)地址一般為了測(cè)試穷绵,是需要與你domain中設(shè)置的是一樣的,但是我們真正使用的時(shí)候不可能只是一個(gè)固定的地址察蹲,后面是可以跟參數(shù)请垛,因?yàn)檎{(diào)起鏈接的時(shí)候只會(huì)拿這個(gè)地址前綴部分,比如url是www.paijitang.com?orderNo=123456都是可以識(shí)別的洽议。
如果在本地測(cè)試的話還需要配置一下 Launch Experience宗收,即給 App Clip 配置一個(gè) URL 和 App Clip Card 信息。在開發(fā)階段可以直接配置 Local Experience 或者在 testflight 上進(jìn)行配置亚兄。App Clip 準(zhǔn)備發(fā)布時(shí)混稽,需要在 app store connect 上進(jìn)行配置。
1.首先將MyClip通過Xcode運(yùn)行起來
2.打開手機(jī)【設(shè)置】-【開發(fā)者】-【Local Experience】-【Register Local Experience】
3.填入 URL PREFIX审胚,打開任何以 URL PREFIX 為前綴的 URL匈勋,都會(huì)被當(dāng) 做打開 App Clip 來處理。
填入 Clip Bundle Id膳叨。
填入 Title洽洁、Subtitle,選擇一張圖片菲嘴,這些信息將會(huì)顯示在 App Clip Card 上饿自。
特別說明,上面action有三個(gè)龄坪,Open,View,Play的區(qū)別就是打開卡片的時(shí)候昭雌,下面的按鈕分別是打開,查看健田,打開游戲烛卧,可以自己體驗(yàn)一下。
4.用步驟3中的URL PREFIX生成一個(gè)二維碼妓局。
5.使用控制面板的二維碼掃描器掃描总放,將會(huì)彈出APP Clip Card.不過前提是你的Clip已經(jīng)配置好真機(jī)運(yùn)行的證書文件,關(guān)于配置看下一步好爬。
配置證書
你可以切換到MyClip的target下查看局雄,它的bundle id其實(shí)就是它的宿主target的id后面加了一個(gè).Clip。
1.首先創(chuàng)建一個(gè)Identifiers:
接下來就是正常的配置Identifies的流程抵拘。但是比較重要的一點(diǎn)是必須要把Associated Domains這個(gè)給勾選上,不然真機(jī)運(yùn)行會(huì)報(bào)錯(cuò)型豁。
上面配置完成之后僵蛛,下面就需要?jiǎng)?chuàng)建對(duì)應(yīng)的描述文件即Profiles文件尚蝌,分別創(chuàng)建開發(fā)可發(fā)布證書。此過程不再詳細(xì)描述充尉。
之后回到項(xiàng)目里配置上相應(yīng)證書文件就行了飘言。
真機(jī)體驗(yàn)
1.運(yùn)行MyClip
2.掃描上面的二維碼
3.彈出卡片,點(diǎn)擊打開進(jìn)入驼侠。
這個(gè)時(shí)候可以查看我們上面那個(gè)func scene(_ scene: UIScene, continue userActivity: NSUserActivity)回調(diào)方法已經(jīng)被調(diào)用了姿鸿,這個(gè)就是為了平時(shí)測(cè)試使用。
發(fā)布App Clip
1.首先為MyClip配置一個(gè)icon,不然會(huì)上傳失敗倒源。
2.以下幾個(gè)位置需要與發(fā)布的target保持一致苛预。
3.這個(gè)Display Name需要選一個(gè)跟項(xiàng)目名不一致的名字,比如你的項(xiàng)目名是中華龍笋熬,你用中華龍輕應(yīng)用這個(gè)是不行的热某,提交appStore的時(shí)候會(huì)告訴你displayName or bundle Name已存在,所以需要起一個(gè)不一樣的名字胳螟。多試幾次就可以了昔馋。
4.當(dāng)你提交版本成功之后,那就需要在你的App store connnct中配置一下你的輕應(yīng)用糖耸,前提是你必須有一個(gè)包含輕應(yīng)用的包提交通過秘遏。然后你就可以在下圖中配置:
,你需要一張1800*1200的圖片嘉竟,然后配置一下副標(biāo)題和選擇一下操作邦危,這里的操作跟上面提到的Action是一個(gè)道理。
5.配置高級(jí)體驗(yàn)周拐。上面步驟4的配置完成之后铡俐,只能讓你在Safi瀏覽器和信息中體驗(yàn)輕App.高級(jí)體驗(yàn)則可以通過輕 App 碼(內(nèi)嵌網(wǎng)址和 NFC 標(biāo)簽)、二維碼以及“地圖”中的地點(diǎn)卡片調(diào)用妥粟。相關(guān)配置可以通過點(diǎn)擊編輯高級(jí)體驗(yàn)就可以設(shè)置审丘,比較簡(jiǎn)單。
6.如果你的app使用了TestFligh勾给,這個(gè)時(shí)候你就可以在手機(jī)testFligh App中查看剛才提交的版本滩报,會(huì)有一個(gè)輕App按鈕,點(diǎn)擊進(jìn)去就是你的輕App內(nèi)容播急。這里就可以測(cè)試你的功能了脓钾。
上面基本就是一個(gè)輕應(yīng)用從測(cè)試到發(fā)布的基本流程。
代碼部分
關(guān)于代碼和資源的組織桩警。很大機(jī)率 main app 和 app clip 是需要共用代碼的可训,可以無腦地選擇將源碼放到 main app 和 app clip 兩個(gè) target 中,也可以選擇打成 framework 或者 local Swift Package。不管如何握截,這部分共用的 binary 都會(huì)同時(shí)存在于 main app bundle 和 app clip bundle 中飞崖。圖片等素材資源也類似。簡(jiǎn)單說谨胞,app clip 其實(shí)就是一個(gè)完整但尺寸有所限制固歪、并且和某個(gè)域名綁定,因此不需要用戶認(rèn)證 Apple ID 就可以下載的 app胯努。
部分 app clip 是“用完就走”的牢裳,但是也有部分 app clip 是為了導(dǎo)流到 main app∫杜妫可以通過 SKOverlay 或 SKStoreProductViewController 來顯示一個(gè)指向 main app 的推廣窗:
方式一:?jiǎn)?dòng)的時(shí)候就顯示
這個(gè)時(shí)候點(diǎn)擊打開按鈕會(huì)顯示如下圖所示
方式二:代碼里點(diǎn)擊顯示
123456放你的應(yīng)用id,這個(gè)id可以在App Store Connect里面打開你的應(yīng)用蒲讯,然后看上面的網(wǎng)址中間有一串?dāng)?shù)字就是的,效果如下:
另外恬汁,對(duì)于公用的代碼部分伶椿,如果要區(qū)分主App和輕App,可以通過添加宏的形式解決氓侧,這個(gè)就不在此贅述脊另。
好了,到這里基本一個(gè)輕App的創(chuàng)建到開發(fā)到發(fā)布的整個(gè)流程就很清晰了约巷,可以實(shí)戰(zhàn)應(yīng)用了偎痛。
參考資料:
1.https://mp.weixin.qq.com/s?__biz=MzI2NTAxMzg2MA%3D%3D&idx=1&mid=2247484662&scene=21&sn=601cb10f17a9d4bb94fa4b911ed3586a#wechat_redirect
2.https://onevcat.com/2020/06/first-look-app-clips/
3.https://www.ifanr.com/minapp/1368393
4.https://developer.apple.com/documentation/app_clips/creating_an_app_clip_with_xcode