BBSSDK论坛移动化实现方案
BBS是一個論壇SDK項目,用戶通過簡單的幾句代碼就可以集成整個論壇模塊.項目通過模塊化開發(fā),多個模塊功能分離,用戶可以選擇需要的模塊進行集成.
二.BBS整體結(jié)構(gòu)
BBS的整體結(jié)構(gòu)如下圖所示:?
BBS由三大核心模塊組成:MOBFondation.framework,BBSSDK.framework,BBSSDKUI.framework.
MOBFondation.framework是公有framework,里面封裝了一系列通用的功能模塊,比如獲取設(shè)備信息,加解密,Native和js的橋接,網(wǎng)絡(luò)處理,數(shù)據(jù)解析......
BBSSDK.framework是數(shù)據(jù)framework,內(nèi)部封裝了所有數(shù)據(jù)接口.BBSSDK.framework可以獨立作為SDK進行使用,只需要自己寫UI,調(diào)用BBSSDK.framework,就能夠?qū)崿F(xiàn)論壇項目的開發(fā).不過由于BBSSDK.framework引用了MOBFondation.framework,所以在使用BBSSDK.framework時,需要添加MOBFondation.framework.
BBSSDKUI.framework是對界面的封裝,它以BBSSDK.framework為接口,穿插MOBFondation.framework的使用,包裝成一個完整的論壇UI模塊,開發(fā)者集成這個framework,可以通過簡單的幾句代碼實現(xiàn)BBS的接入.
ShareSDK和MobLink通過弱引用的方式實現(xiàn)了BBSSDKUI的拓展,通過ShareSDK實現(xiàn)了對分享功能的支持,通過MobLink實現(xiàn)了對網(wǎng)頁跳轉(zhuǎn)App的支持.對于如何實現(xiàn)的弱引用,下文會有涉及.
三.BBSSDKUI功能解析
BBSSDKUI分為簡約版和時尚版兩個版本,各自的主界面如下圖所示:?
這兩個版本除了展示效果的不同,功能完全一致.簡約版注重UI的簡潔,界面清晰利落.時尚版追求UI的炫酷,里面實現(xiàn)了很多毛玻璃,動畫等效果.具體選擇哪個版本,依據(jù)不同業(yè)務(wù)需求而定.
主界面展示了論壇和門戶兩大模塊.這兩個模塊實現(xiàn)不同業(yè)務(wù)功能,但并不一定全部展示.展示哪個模塊由后臺決定,用戶可以通過后臺進行手動配置.
我們看一下BBSSDKUI的功能結(jié)構(gòu):?
四.源碼解讀
開屏策略
開屏策略提供了全局必要配置,通過調(diào)用如下接口實現(xiàn):
/**獲取全局配置@param result 回調(diào)*/ + (void)getGlobalSettings:(void(^)(NSDictionary *settings, NSError *error))result;復(fù)制代碼由于開屏策略必須在調(diào)用其他接口之前完成,所以這里使用了信號量進行控制: 在時尚版的BBSUIHomeViewController里,
主界面上滑左右滑效果
在時尚版的主頁以及時尚版的個人中心,我們從上面的圖中可以看到,tableView可以左右滑動,也可以上下滑動.當TableView左右滑動的時候,其"header"不會跟著滑動,而當TableView上下滑動的時候,其"header"會跟著滑動.這種效果是怎么實現(xiàn)的呢?
我們先看看這種效果的UI結(jié)構(gòu):
?可見,UI大致是通過上下兩個ScrollView實現(xiàn)的.最外層的ScrollView用來切換各個子視圖(TableView).內(nèi)層的ScrollView(即TableView)上下滑動.表頭其實是一個UIView,通過監(jiān)聽TableView的contentOffSet,對表頭進行Frame設(shè)置.
BBSUIPortalViewController:/**這里通過封裝將TableView的實現(xiàn)集成到BBSUIThreadListViewController里,通過block的方式拿到contentOffSet*/ for (BBSPortalCatefories *obj in self.categoriesList) {BBSUIThreadListViewController *vc = [[BBSUIThreadListViewController alloc] initWithCatid:obj.catid allowcomment:obj.allowcomment];vc.viewType = BBSUIThreadListViewTypePortal;[vcs addObject:vc];[titles addObject:obj.catname];vc.offSetBlock = ^(CGFloat offSet){// NSLog(@"============== %f",offSet);[self setContentOffSet:offSet];};vc.refreshBannerBlock = ^(NSArray *bannnerList, NSError *error) {[self _refreshBannerWithBannnerList:bannnerList error:error];}; }復(fù)制代碼/**進行表頭Frame的處理*/ - (void)setContentOffSet:(CGFloat)offSet {CGRect frame = self.headerView.frame;frame.origin.y = -offSet + _iphoneXTopPadding;self.headerView.frame = frame;_lastTableViewOffsetY = offSet;// 考慮到segmentBar,在到達navigationbar位置的時候,segmentBar需要"懸停"if (offSet <= 245 - 64){CGRect segmentFrame = self.segmentControl.frame;segmentFrame.origin.y = 245-offSet + _iphoneXTopPadding;self.segmentControl.frame = segmentFrame;}else{CGRect segmentFrame = self.segmentControl.frame;segmentFrame.origin.y = 64 + _iphoneXTopPadding;self.segmentControl.frame = segmentFrame;}if (self.offSetBlock){self.offSetBlock(offSet);} }復(fù)制代碼弱引用的實現(xiàn)
BBSSDKUI對ShareSDK和MobLink采取弱引用的集成方式.在集成BBSSDKUI.framework的時候,即使不添加ShareSDK和MobLink這兩個模塊,也不會報錯,只不過相關(guān)的功能不能使用而已.這和對BBSSDK.framework和MOBFondation.framework的強依賴是不一樣的.
怎么實現(xiàn)的呢?
在項目初始化的時候,MOBFondation會通過hock的方式拿到所有的類名,在使用這個SDK的時候,通過協(xié)議的方式間接拿到這個類,然后通過私有方法進行調(diào)用.
- (void)_authLoginWithType:(NSInteger)type {......NSArray *components = [[MOBFComponentManager defaultManager] getComponents:@protocol(IMOBFShareComponent)];if (components.count > 0) {id<IMOBFShareComponent> ShareComponent = components[0];if (ShareComponent && [ShareComponent conformsToProtocol:@protocol(IMOBFShareComponent)]){[SVProgressHUD show];[ShareComponent authorize:authType settings:nil onStateChanged:^(NSInteger state, id<IMOBFSocialUser> user, NSError *error) {......}];}}else{NSLog(@"沒有接入ShareSdk");} }復(fù)制代碼這種方式避免了強依賴導(dǎo)致的高耦合,在接入過程中,可以選擇性的接入需要的組件,不需要的組件可以不接入,但也不會報錯.
總結(jié)
以上是生活随笔為你收集整理的BBSSDK论坛移动化实现方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【RESTful风格】软件接口设计中RE
- 下一篇: 项目常用第三方库 Swift版