在最近參與的項(xiàng)目過程中蛤奥,我發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象。國(guó)內(nèi)的App開發(fā)者僚稿,在設(shè)計(jì)“分享”這個(gè)功能的時(shí)候凡桥,一般都會(huì)根據(jù)業(yè)務(wù)的實(shí)際需要,設(shè)計(jì)一套自定義的解決方案蚀同,我們姑且稱之為“自定義分享插件”缅刽。而相比之下啊掏,國(guó)外的開發(fā)者更傾向于使用iOS提供的系統(tǒng)級(jí)的Share Extension,我們姑且稱之為“原生分享插件”衰猛。那么迟蜜,這兩種方案,各有什么特色和優(yōu)缺點(diǎn)呢啡省?
什么是原生分享插件?
我們先來(lái)簡(jiǎn)單看一下什么是蘋果的原生分享插件Share Extension笼痹。前面說過配喳,由于中國(guó)App開發(fā)大量使用自定義的分享方式,所以可能很多設(shè)計(jì)師還不熟悉原生分享的機(jī)制凳干。另外晴裹,蘋果直到去年的iOS8.0才重新定義了iOS的Extension機(jī)制,并重新設(shè)計(jì)了Share Extension救赐,使得她真正變得好用而受到開發(fā)者的認(rèn)可涧团。所以,原生分享插件對(duì)于我們來(lái)說经磅,其實(shí)還挺新的:)
在早先版本里泌绣,從iOS5到iOS6,乃至iOS7预厌,分享插件的界面設(shè)計(jì)進(jìn)過了幾次變更阿迈,但是功能上一直十分有限,一開始僅限于系統(tǒng)級(jí)和系統(tǒng)原生應(yīng)用的內(nèi)容傳遞轧叽,例如發(fā)送照片內(nèi)容到郵件和短信苗沧,或者從Safari保存網(wǎng)頁(yè)等。后來(lái)蘋果通過與Twitter和Facebook等幾家公司簽訂獨(dú)立的協(xié)議炭晒,實(shí)現(xiàn)了整合的方案待逞,使內(nèi)容分享到這些應(yīng)用的過程更方便。
但是蘋果顯然也意識(shí)到了這一點(diǎn)网严,即系統(tǒng)和應(yīng)用识樱,以及應(yīng)用與應(yīng)用之間傳遞內(nèi)容信息的需求是用戶真實(shí)存在的需求,需要一個(gè)真正系統(tǒng)級(jí)的解決方案,就像當(dāng)年的Push Notification那樣怜庸,一個(gè)方案解決所有App的問題当犯,而不是一家一家地去簽協(xié)議。
所以休雌,在去年的iOS8發(fā)布時(shí)灶壶,蘋果對(duì)分享機(jī)制做了大刀闊斧的改變肝断,這就是新的Share Extension杈曲,原生分享插件。App開發(fā)者只需要在開發(fā)過程中胸懈,為App加入原生分享插件担扑,向系統(tǒng)注冊(cè),就可以通過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)說,如果你開發(fā)的是一個(gè)電商類App井联,希望鼓勵(lì)用戶把App上的商品分享給他們的朋友或者社交媒體卜壕,那么通過掛載和注冊(cè)原生分享插件,以后用戶想要分享App上的內(nèi)容時(shí)烙常,喚出分享界面轴捎,就可以把內(nèi)容分享到系統(tǒng)上的任一(注冊(cè)了分享插件的)位置。相反蚕脏,如果你開發(fā)的是一個(gè)社交App侦副,并鼓勵(lì)用戶從其他內(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)容是什么格式细燎,比如圖片視頻、文本還是鏈接皂甘。這被稱為Activation Rules玻驻。也就是說,假如用戶要分享的是一段文字,那么當(dāng)他點(diǎn)擊分享按鈕時(shí)璧瞬,彈出的Share Sheet上户辫,就不會(huì)顯示Instagram和Pintrest這類App,因?yàn)樗麄冎唤邮軋D片分享嗤锉。這也就是說渔欢,盡管是同一個(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)求用戶同意的場(chǎng)景牢屋。這樣設(shè)計(jì)的好處就是蘋果的設(shè)備安全系數(shù)很高,惡意軟件和病毒很難入侵槽袄。在這種情況下烙无,如果系統(tǒng)允許App隨便傳遞內(nèi)容信息,肯定是不行的遍尺。App們互相之間如果要傳遞信息截酷,也要先建立信任,也就是授權(quán)乾戏。所以在沒有原生分享插件的時(shí)候迂苛,每一次分享動(dòng)作,伴隨的都是可能要一次新的授權(quán)(如果你自定義分享插件鼓择,情況便是如此)三幻。而原生分享插件,就是將這些授權(quán)全都集中起來(lái)呐能,由系統(tǒng)平臺(tái)一次完成(App向系統(tǒng)注冊(cè)時(shí))念搬。這樣抑堡,iOS通過這種集成的方式,既能保證沙盒機(jī)制不被破壞朗徊,又實(shí)現(xiàn)了系統(tǒng)層面的信息分享首妖。
當(dāng)App注冊(cè)了原生分享插件,一方面爷恳,它就可以通過插件向系統(tǒng)和其他所有(也注冊(cè)了分享插件)的App發(fā)送內(nèi)容有缆,只要對(duì)方接受內(nèi)容的形式(圖片、文本等)温亲。另一方面棚壁,它也同意接受來(lái)自插件的相應(yīng)內(nèi)容。這意味著铸豁,用戶在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)景中相艇,用戶甚至可以不用跳轉(zhuǎn)到他要分享的那個(gè)App里去操作,而是直接在當(dāng)前界面完成分享纯陨,然后繼續(xù)該干嘛干嘛坛芽。
講完了這些,那么問題來(lái)了:
既然蘋果的這套Share Extension機(jī)制這么好翼抠,為什么國(guó)內(nèi)的App們還偏要自定義分享插件呢咙轩?
最大的問題在于,App的開發(fā)者想要分享內(nèi)容到甲乙丙阴颖,而原生分享插件顯示的是ABC活喊。
蘋果在設(shè)計(jì)原生分享插件時(shí),是從所有用戶的習(xí)慣角度出發(fā)的量愧,如果用戶經(jīng)常分享內(nèi)容到Facebook和Pintrest钾菊,而不常用Twitter,那么他可以通過Share的Action Sheet上的“更多”按鈕偎肃,進(jìn)入一個(gè)設(shè)置頁(yè)面煞烫,在那里調(diào)整分享到App的順序,甚至把不常用的分享渠道關(guān)掉累颂。
這顯然不符合國(guó)內(nèi)一些開發(fā)者的口味滞详,尤其是BAT這樣的大公司。微信就關(guān)閉了對(duì)原生分享的支持,而選擇了大量的自定義茵宪,所以我們可以看到微信的Share Sheet上出現(xiàn)了“收藏”最冰、“調(diào)整字體”等跟分享毫無(wú)關(guān)系的功能。淘寶的分享也是自定義的稀火。這類大公司的邏輯更多是讓分享內(nèi)容在自家的生態(tài)體系里流動(dòng)暖哨,而不是整個(gè)平臺(tái)。
一個(gè)非常有意思的特例是Pintrest凰狞。這家公司在自己的App上也使用了自定義的分享插件净薛,為了方便用戶把內(nèi)容分享給App內(nèi)的好友關(guān)系圈。但是如果在自定義的sheet上點(diǎn)擊表示“更多”的那個(gè)“…”紅色按鈕远剩,這是App又會(huì)調(diào)出原生分享插件表鳍。真是既滿足了自己的小算盤,又照顧到了全平臺(tái)的用戶逾冬。而這樣做的副作用就是黍聂,如果用戶在第一個(gè)自定義Sheet上點(diǎn)擊分享到Facebook,則調(diào)用系統(tǒng)分享編輯界面身腻,而如果用戶是在第二個(gè)原生分享sheet上點(diǎn)擊产还,則會(huì)跳轉(zhuǎn)到Facebook App里去做分享內(nèi)容編輯。