iOS開發(fā)——App架構(gòu)之抽象協(xié)議
從架構(gòu)設(shè)計層面,一個端,尤其是一個成熟的端,應(yīng)該有自己的規(guī)范,大到頁面跳轉(zhuǎn)、服務(wù)請求,小到某個具體的業(yè)務(wù)功能比如生成訂單、取消訂單、查看訂單等。一方面,制定統(tǒng)一的協(xié)議后,不僅可以約束各業(yè)務(wù)線開發(fā)同學(xué)的開發(fā)行為,統(tǒng)一代碼的風格,還可以增強團隊同學(xué)的合作以及凝聚力,另一方面,統(tǒng)一開發(fā)行為后,對于增加新的功能、修復(fù)bug、查詢問題等都有很好的幫助,極大提高開發(fā)效率。
App 架構(gòu)組最重要的一個職能就是統(tǒng)一 App 架構(gòu),讓業(yè)務(wù)開發(fā)同學(xué)在一套統(tǒng)一的架構(gòu)中盡情塑造端的產(chǎn)品,以提高業(yè)務(wù)開發(fā)效率和保證業(yè)務(wù)使用穩(wěn)定性為己任。本著這一原則,這一年來也在不斷探索各種跟 App 架構(gòu)相關(guān)技能。協(xié)議是我發(fā)現(xiàn)最能體現(xiàn) App 架構(gòu)意義的一個關(guān)鍵技術(shù),用好以及推廣好協(xié)議,能使業(yè)務(wù)開發(fā)效率倍增。
一般來說,App 中的協(xié)議類型可以任意發(fā)散,只要可以復(fù)用的地方,你都可以用協(xié)議一言以蔽之。當然,我們都是有追求的人,應(yīng)該創(chuàng)造一些更通用、更抽象、更值得讓大家復(fù)用的協(xié)議,舉個栗子,iOS SDK 中 url scheme 就是這樣一個典型。
iOS URL Scheme
URL Schemes是蘋果給出的用來跳轉(zhuǎn)到系統(tǒng)應(yīng)用或者跳轉(zhuǎn)到別人的應(yīng)用的一種機制,同時還可以在應(yīng)用之間傳遞數(shù)據(jù),用于實現(xiàn)一些特定的功能。你可以完全按照理解一個網(wǎng)頁的 URL 的方式來理解一個 iOS 應(yīng)用的 URL。
比如微信的 url scheme
- weixin://
微信朋友圈 url scheme 格式
- weixin://dl/moments
看著是不是很方便?
在其他app中,你可以像這樣就可以跳轉(zhuǎn)到微信 App 應(yīng)用(如果已安裝的話)
- NSURL *url = [NSURL URLWithString:@"weixin://"];
- [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
- }];
每個應(yīng)用都可以創(chuàng)建一個或者一些自己的 url scheme,只需要配置 info.plist 文件即可,然后通過 App 管理中心 [UIApplication sharedApplication] 即可進行 App 之間的通信。
同樣,我們將這樣的思路可以應(yīng)用到其他抽象模塊中來。在每一個抽象模塊中,我們用一個協(xié)議來指定它的使用規(guī)則以及支持的功能,開放給調(diào)用方使用時,只要其遵循協(xié)議規(guī)則,使用抽象模塊提供的 api 接口,即可進行模塊的調(diào)用或者使用其提供的服務(wù)。
由此,我們得出這樣一個結(jié)論:采用協(xié)議方式抽象一個模塊,需要兩個重要組件:協(xié)議+協(xié)議管理中心。
通用協(xié)議
- scheme://service/actor?params=\{\"xxx\":xxx\}&origin=xxx
在 App 架構(gòu)中,頁面導(dǎo)航框架是非常重要的一個組件,直接決定當前 App 的頁面組織形式以及風格,好的頁面導(dǎo)航框架也能讓業(yè)務(wù)方開發(fā)擁有***的新頁面搭建以及頁面間跳轉(zhuǎn)體驗。從協(xié)議角度出發(fā),我們可以這樣約定一個頁面跳轉(zhuǎn)協(xié)議:
頁面跳轉(zhuǎn)協(xié)議
- page://action?params=\{\}&origin=xxx
- // 跳轉(zhuǎn) native 頁面
- page://goto?params={"page_name":"xxxx","data":{"xxx":"xxx",...},"navi_type":0|1,"anime_type":-1|0|1|2|3|4,"success_callback":"xxxxxx","failure_callback":"xxxxx"}&origin=xxx
- // 跳轉(zhuǎn) h5 頁面
- page://act_web?params={"page_name":"xxxx","data":{"xxx":"xxx",...},"navi_type":0|1,"anime_type":-1|0|1|2|3|4,"success_callback":"xxxxxx","failure_callback":"xxxxx"}&origin=xxx
Manager 需要提供的 api 包括:
- // 跳轉(zhuǎn) native 頁面
- // 跳轉(zhuǎn) h5 頁面
服務(wù)請求協(xié)議
- // @TODO 可繼續(xù)拆分
- service://modulename/servicename?params={}&origin=xxx
Bridge 橋接協(xié)議
- // bridge 為特定 scheme,bridgename 為bridge js庫支持的api
- bridge://bridgename?module=xxx&method=xxx&args=\{\}&origin=xxx