APPClip實(shí)踐
背景
距離上次開發(fā)者大會(huì)已經(jīng)過(guò)去幾個(gè)月了,網(wǎng)上課參考的資料也多了起來(lái),iOS14的適配也已經(jīng)基本完成驗(yàn)證,乘著項(xiàng)目周期間隙,終于可以研究一下新特性了。今天我們就來(lái)試試這個(gè)APPClip.
簡(jiǎn)介
App Clip是一種很好的讓用戶快速訪問(wèn)并體驗(yàn)?zāi)愕腁pp提供了什么內(nèi)容的方式。App Clip是App的一部分,在需要的時(shí)候就可以找到它。App Clip很快也很輕,用戶可以很快打開它們。當(dāng)用戶從這個(gè)飯館點(diǎn)了外賣、租了一個(gè)滑板車或是第一次設(shè)置一個(gè)新連接上的設(shè)備,可以在短短幾秒內(nèi)開始并完成使用App的體驗(yàn)。當(dāng)他們完成之后,用戶就有機(jī)會(huì)下載你的App了。
上面這個(gè)是官方簡(jiǎn)介,看到這個(gè)就想起了微信小程序。沒錯(cuò),就是和微信小程序的功能一樣,不過(guò)是用原生語(yǔ)言開發(fā),對(duì)iOS開發(fā)者更加友好。后面還提到了APPClip碼、NFC、二維碼等使用場(chǎng)景,這讓我想起了刷地鐵卡的經(jīng)歷,可能之后可以在鎖屏的情況下使用吧,人機(jī)交互會(huì)比微信更加便捷。
當(dāng)然和原生比也有很多限制,比如大小10M等,這個(gè)就對(duì)開發(fā)者的要求變高了,現(xiàn)在隨便個(gè)APP就要50多M..也就是說(shuō)APPClip是原APP閹割版,功能更精簡(jiǎn)。
實(shí)踐環(huán)境
開發(fā)開發(fā)工具:XCode 12Beta1(公司網(wǎng)絡(luò)限制,下載新的太慢)
手機(jī):iphonex(iOS14 beta6)
開始實(shí)踐
首先新建一個(gè)工程,創(chuàng)建一個(gè)APPClip target。這步比較簡(jiǎn)單,步驟略過(guò)。
建好后我發(fā)現(xiàn)多了一個(gè)SceneDelegate.m

原來(lái)從xcode11開始,Appdelegate的一些功能分給了SceneDelegate,使用起來(lái)和原來(lái)的Appdelegate差不多。老項(xiàng)目需要新增SceneDelegate的話可以通過(guò)修改fileInfo.plist實(shí)現(xiàn)。

cocoapods測(cè)試
cocoapods是常用的依賴管理工具,新建target自然也要測(cè)試一下cocoapods是否支持AppClip。正常pod install。

沒有報(bào)錯(cuò),基本庫(kù)私有庫(kù)依賴都成功引用,完美。但是一運(yùn)行就崩潰,報(bào)錯(cuò)是動(dòng)態(tài)庫(kù)找不到。打開包一看,動(dòng)態(tài)庫(kù)的frameWorks沒有正常復(fù)制到包中。
[圖片上傳失敗...(image-16c423-1598940228407)]
[圖片上傳失敗...(image-6ed574-1598940228407)]
因?yàn)槲覀兊乃接袔?kù)中依賴動(dòng)態(tài)庫(kù),可能cocoapods對(duì)appclip還沒適配吧,復(fù)制腳本不對(duì)(目前是1.9.3版本)去官網(wǎng)查看,果然有Beta版本。

升級(jí)到1.10.0.beta.2后,在嘗試一下instal,能正常找到framework了。

順便看了下包大小13M。。引入基礎(chǔ)依賴就超10M了。。用APPclip實(shí)現(xiàn)原本項(xiàng)目APP任重而道遠(yuǎn)啊。
環(huán)境配置
正常的APPClip啟動(dòng)是通過(guò)鏈接的方式打開的,然后配置文件需要放在服務(wù)器上,并且進(jìn)行關(guān)聯(lián)。但是作為開發(fā)者,xCode提供了一個(gè)很便捷的功能,在run的環(huán)境變量中配置參數(shù)就可以模擬用戶點(diǎn)擊鏈接。這樣就不用麻煩服務(wù)器的同學(xué),進(jìn)行本地測(cè)試了。

啟動(dòng)測(cè)試
由于APPClip和原生APP共用一套代碼,那么久需要區(qū)分是從APP遠(yuǎn)程進(jìn)來(lái)的還是用APPClip進(jìn)來(lái)的。通過(guò)測(cè)試原生啟動(dòng)和APPClip啟動(dòng)都會(huì)調(diào)用SceneDelegate中的以下方法

那么能區(qū)別的參數(shù)就是(UISceneConnectionOptions *)connectionOptions了。
將兩次進(jìn)入的時(shí)候po出來(lái)做對(duì)比
原APP

APPClip

結(jié)果很明顯了,那么怎么獲得剛才設(shè)置的鏈接呢?畢竟還需要通過(guò)鏈接跳轉(zhuǎn)到不同的頁(yè)面。經(jīng)過(guò)嘗試,最終找到了鏈接。方法如下:


代碼層面的區(qū)別
上面說(shuō)了啟動(dòng)的跳轉(zhuǎn)方案,那么現(xiàn)在再討論下代碼層面如何區(qū)別。因?yàn)槭?個(gè)target,有經(jīng)驗(yàn)的同學(xué)應(yīng)該都能想到Apple Clang - preprocessing
,自己手動(dòng)加個(gè)標(biāo)志就可以了。

#ifdef APPClip
// 可以在App Clip中使用的代碼
#else
// 不想在App Clip中使用的代碼
#endif
本地?cái)?shù)據(jù)共享
APPClip和遠(yuǎn)程APP的使用還有個(gè)關(guān)鍵點(diǎn),那就是本地?cái)?shù)據(jù)共享。當(dāng)然通過(guò)服務(wù)器共享是比較方便的。一般本地?cái)?shù)據(jù)共享有這么幾個(gè)方法:
- 沙盒緩存共享
- 鑰匙串共享
但是APPClip和原生APP的BundleId不一樣,是否可以通過(guò)上述方式共享呢?先測(cè)試下第一種沙盒模式
沙盒數(shù)據(jù)共享測(cè)試
首先就是獲取沙盒地址,APPClip類似于小程序,在桌面沒有應(yīng)用,那么是否有沙盒呢?

令我震驚的是,居然獲取到了沙盒地址。。然后再測(cè)試下存文件,新建一個(gè)文件夾測(cè)試。

結(jié)果是建成功了,并且使用也是正常。那么這個(gè)沙盒和原APP是用同一個(gè)嗎?這邊又將相同的代碼賦值到從原生APP進(jìn)來(lái)進(jìn)行測(cè)試,并不能獲取到APPClip中創(chuàng)建的文件夾,因此沙盒是分開存儲(chǔ)的。

查了下資料,要使用共享容器進(jìn)行數(shù)據(jù)交互,另外要是串只能和原本APP交互。這個(gè)需要配置證書,和widget一樣使用,具體方法網(wǎng)上很多,這里就不再敘述了。

總結(jié)
總的來(lái)說(shuō),APPClip類似小程序,對(duì)原生開發(fā)者來(lái)說(shuō),沒有語(yǔ)言上的門檻,還是很友好的。但是是否能普及還是有很大的疑問(wèn),畢竟在國(guó)內(nèi)微信小程序已經(jīng)培養(yǎng)了用戶習(xí)慣,店家也不會(huì)無(wú)故增加成本做相同的東西。但是從技術(shù)的角度來(lái)說(shuō),還是有備無(wú)患才好。