在最近參與的項(xiàng)目過(guò)程中,我發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象。國(guó)內(nèi)的App開(kāi)發(fā)者,在設(shè)計(jì)“分享”這個(gè)功能的時(shí)候,一般都會(huì)根據(jù)業(yè)務(wù)的實(shí)際需要,設(shè)計(jì)一套自定義的解決方案,我們姑且稱(chēng)之為“自定義分享插件”。而相比之下,國(guó)外的開(kāi)發(fā)者更傾向于使用iOS提供的系統(tǒng)級(jí)的Share Extension,我們姑且稱(chēng)之為“原生分享插件”。那么,這兩種方案,各有什么特色和優(yōu)缺點(diǎn)呢?


什么是原生分享插件?
我們先來(lái)簡(jiǎn)單看一下什么是蘋(píng)果的原生分享插件Share Extension。前面說(shuō)過(guò),由于中國(guó)App開(kāi)發(fā)大量使用自定義的分享方式,所以可能很多設(shè)計(jì)師還不熟悉原生分享的機(jī)制。另外,蘋(píng)果直到去年的iOS8.0才重新定義了iOS的Extension機(jī)制,并重新設(shè)計(jì)了Share Extension,使得她真正變得好用而受到開(kāi)發(fā)者的認(rèn)可。所以,原生分享插件對(duì)于我們來(lái)說(shuō),其實(shí)還挺新的:)
在早先版本里,從iOS5到iOS6,乃至iOS7,分享插件的界面設(shè)計(jì)進(jìn)過(guò)了幾次變更,但是功能上一直十分有限,一開(kāi)始僅限于系統(tǒng)級(jí)和系統(tǒng)原生應(yīng)用的內(nèi)容傳遞,例如發(fā)送照片內(nèi)容到郵件和短信,或者從Safari保存網(wǎng)頁(yè)等。后來(lái)蘋(píng)果通過(guò)與Twitter和Facebook等幾家公司簽訂獨(dú)立的協(xié)議,實(shí)現(xiàn)了整合的方案,使內(nèi)容分享到這些應(yīng)用的過(guò)程更方便。
但是蘋(píng)果顯然也意識(shí)到了這一點(diǎn),即系統(tǒng)和應(yīng)用,以及應(yīng)用與應(yīng)用之間傳遞內(nèi)容信息的需求是用戶(hù)真實(shí)存在的需求,需要一個(gè)真正系統(tǒng)級(jí)的解決方案,就像當(dāng)年的Push Notification那樣,一個(gè)方案解決所有App的問(wèn)題,而不是一家一家地去簽協(xié)議。

所以,在去年的iOS8發(fā)布時(shí),蘋(píng)果對(duì)分享機(jī)制做了大刀闊斧的改變,這就是新的Share Extension,原生分享插件。App開(kāi)發(fā)者只需要在開(kāi)發(fā)過(guò)程中,為App加入原生分享插件,向系統(tǒng)注冊(cè),就可以通過(guò)Extension來(lái)實(shí)現(xiàn)與系統(tǒng)和其他App的內(nèi)容分享了。原生分享插件就相當(dāng)于一個(gè)中間媒介,可以接受Host App(發(fā)送內(nèi)容的App)提交的內(nèi)容,轉(zhuǎn)交給想要分享到的Containing App(接受內(nèi)容的App)。、

舉例來(lái)說(shuō),如果你開(kāi)發(fā)的是一個(gè)電商類(lèi)App,希望鼓勵(lì)用戶(hù)把App上的商品分享給他們的朋友或者社交媒體,那么通過(guò)掛載和注冊(cè)原生分享插件,以后用戶(hù)想要分享App上的內(nèi)容時(shí),喚出分享界面,就可以把內(nèi)容分享到系統(tǒng)上的任一(注冊(cè)了分享插件的)位置。相反,如果你開(kāi)發(fā)的是一個(gè)社交App,并鼓勵(lì)用戶(hù)從其他內(nèi)容源分享內(nèi)容你的App,同樣需要注冊(cè)到分享插件,表明你同意接受由它發(fā)送來(lái)的內(nèi)容。
當(dāng)然,不同形式的內(nèi)容也不是隨便就到處傳遞的。無(wú)論你是發(fā)送內(nèi)容的Host App,還是接受內(nèi)容的Containing App,都需要向原生分享插件描述清楚,要發(fā)送或接受的內(nèi)容是什么格式,比如圖片視頻、文本還是鏈接。這被稱(chēng)為Activation Rules。也就是說(shuō),假如用戶(hù)要分享的是一段文字,那么當(dāng)他點(diǎn)擊分享按鈕時(shí),彈出的Share Sheet上,就不會(huì)顯示Instagram和Pintrest這類(lèi)App,因?yàn)樗麄冎唤邮軋D片分享。這也就是說(shuō),盡管是同一個(gè)原生分享組件,但是在不同的App上,它出現(xiàn)時(shí)顯示的內(nèi)容會(huì)自動(dòng)根據(jù)要分享出去的內(nèi)容性質(zhì)做出變化。
所以,iOS的Share Extension原生分享插件,就像一個(gè)巨大的內(nèi)容中轉(zhuǎn)站,在系統(tǒng)和App,以及App之間建立起關(guān)聯(lián),方便內(nèi)容的傳遞。
那么為什么要采用這樣一種集成式的設(shè)計(jì)思路,而不是鼓勵(lì)各App之間點(diǎn)對(duì)點(diǎn)傳輸呢?
最大的優(yōu)勢(shì)就是安全性和便利性。
iOS上的App被設(shè)計(jì)在一個(gè)“沙盒”里,App與系統(tǒng)間,以及App與另一個(gè)App之間的數(shù)據(jù)傳輸是受到嚴(yán)格限制的。所以我們經(jīng)常遇到App在使用相機(jī)、相冊(cè)或者GPS傳感器時(shí),都要請(qǐng)求用戶(hù)同意的場(chǎng)景。這樣設(shè)計(jì)的好處就是蘋(píng)果的設(shè)備安全系數(shù)很高,惡意軟件和病毒很難入侵。在這種情況下,如果系統(tǒng)允許App隨便傳遞內(nèi)容信息,肯定是不行的。App們互相之間如果要傳遞信息,也要先建立信任,也就是授權(quán)。所以在沒(méi)有原生分享插件的時(shí)候,每一次分享動(dòng)作,伴隨的都是可能要一次新的授權(quán)(如果你自定義分享插件,情況便是如此)。而原生分享插件,就是將這些授權(quán)全都集中起來(lái),由系統(tǒng)平臺(tái)一次完成(App向系統(tǒng)注冊(cè)時(shí))。這樣,iOS通過(guò)這種集成的方式,既能保證沙盒機(jī)制不被破壞,又實(shí)現(xiàn)了系統(tǒng)層面的信息分享。
當(dāng)App注冊(cè)了原生分享插件,一方面,它就可以通過(guò)插件向系統(tǒng)和其他所有(也注冊(cè)了分享插件)的App發(fā)送內(nèi)容,只要對(duì)方接受內(nèi)容的形式(圖片、文本等)。另一方面,它也同意接受來(lái)自插件的相應(yīng)內(nèi)容。這意味著,用戶(hù)在iOS設(shè)備上,從任意一個(gè)App分享內(nèi)容到其他任意一個(gè)App時(shí),都不用再額外進(jìn)行一個(gè)App之間的授權(quán)動(dòng)作了。分享真正變成系統(tǒng)級(jí)別的,無(wú)處不在的。
并且,這個(gè)方案的系統(tǒng)整合程度很高,意味著,在實(shí)際的交互場(chǎng)景中,用戶(hù)甚至可以不用跳轉(zhuǎn)到他要分享的那個(gè)App里去操作,而是直接在當(dāng)前界面完成分享,然后繼續(xù)該干嘛干嘛。

講完了這些,那么問(wèn)題來(lái)了:
既然蘋(píng)果的這套Share Extension機(jī)制這么好,為什么國(guó)內(nèi)的App們還偏要自定義分享插件呢?
最大的問(wèn)題在于,App的開(kāi)發(fā)者想要分享內(nèi)容到甲乙丙,而原生分享插件顯示的是ABC。
蘋(píng)果在設(shè)計(jì)原生分享插件時(shí),是從所有用戶(hù)的習(xí)慣角度出發(fā)的,如果用戶(hù)經(jīng)常分享內(nèi)容到Facebook和Pintrest,而不常用Twitter,那么他可以通過(guò)Share的Action Sheet上的“更多”按鈕,進(jìn)入一個(gè)設(shè)置頁(yè)面,在那里調(diào)整分享到App的順序,甚至把不常用的分享渠道關(guān)掉。

這顯然不符合國(guó)內(nèi)一些開(kāi)發(fā)者的口味,尤其是BAT這樣的大公司。微信就關(guān)閉了對(duì)原生分享的支持,而選擇了大量的自定義,所以我們可以看到微信的Share Sheet上出現(xiàn)了“收藏”、“調(diào)整字體”等跟分享毫無(wú)關(guān)系的功能。淘寶的分享也是自定義的。這類(lèi)大公司的邏輯更多是讓分享內(nèi)容在自家的生態(tài)體系里流動(dòng),而不是整個(gè)平臺(tái)。

一個(gè)非常有意思的特例是Pintrest。這家公司在自己的App上也使用了自定義的分享插件,為了方便用戶(hù)把內(nèi)容分享給App內(nèi)的好友關(guān)系圈。但是如果在自定義的sheet上點(diǎn)擊表示“更多”的那個(gè)“…”紅色按鈕,這是App又會(huì)調(diào)出原生分享插件。真是既滿(mǎn)足了自己的小算盤(pán),又照顧到了全平臺(tái)的用戶(hù)。而這樣做的副作用就是,如果用戶(hù)在第一個(gè)自定義Sheet上點(diǎn)擊分享到Facebook,則調(diào)用系統(tǒng)分享編輯界面,而如果用戶(hù)是在第二個(gè)原生分享sheet上點(diǎn)擊,則會(huì)跳轉(zhuǎn)到Facebook App里去做分享內(nèi)容編輯。

