如何優(yōu)雅的集成各個分享平臺的SDK

bg:最近公司在進(jìn)行組件化工作墓拜,解耦是必須面對的問題敦捧。這里說一下我們是怎么把各個平臺的分享sdk優(yōu)雅的進(jìn)行設(shè)計重構(gòu)的吃谣。本司的產(chǎn)品集成了16個第三方分享,簡直了鲫惶。

面臨的問題:

  • 如果把啟動分享的code都放在Launch里面蜈首,這里面的code將會非常嚇人,如何把這些code合理的分離出來欠母。
  • sdk太多欢策,因為我們有4個產(chǎn)品,如何能做到想用哪幾個就集成哪幾個赏淌,隨心配踩寇。

針對第一個問題我們的解決方案

寫一個生命周期的管理模塊的manage,負(fù)責(zé)分發(fā)Appdelegate里面的各種生命周期的方法到分發(fā)模塊六水,像
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
- (void)applicationDidBecomeActive:(UIApplication *)application;
- (void)applicationWillResignActive:(UIApplication *)application;
這類方法我們是分發(fā)了所有的這些方法俺孙。那么,在哪里進(jìn)行分發(fā)的掷贾,這里是通過定一個Appdelegate的父類睛榄,通過繼承的關(guān)系來分發(fā)。我們需要將分享模塊注冊到這個生命周期模塊中想帅,即將各個分享的平臺的參數(shù)注冊進(jìn)去场靴,如appkey,secret等博脑。我們是在+load()方法中將模塊迅速的注冊進(jìn)去的,大致像這樣

+(void)load {
    [XYAppLifecycleManager registerModuleClass:[CMShareLifeCycle class] config:@{
                                                                                 @"QQ":@{
                                                                                         @"appscheme":@"xx",
                                                                                         @"appkey":@"xx"
                                                                                         },
                                                                                 @"Weibo":@{
                                                                                         @"appscheme":@"xx",
                                                                                         @"appkey":@"xx"
                                                                                         },
                                                                                 @"Wechat":@{
                                                                                         @"appscheme":@"xx",
                                                                                         @"appkey":@"xx",
                                                                                         @"secret":@"xx"
                                                                                         }
                                                                                 } priority:100];
    
}

在分享模塊里面會有一個集合來持有這些配置過的分享平臺憎乙,通過runtime來生成這些實例

[servers enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSString *server = [NSString stringWithFormat:@"XY%@Adapter",obj];
        id<XYShareProtocol> shareClass = [[NSClassFromString(server) alloc] init];
        if (shareClass) {
            [self.shareServers addObject:shareClass];
        }
    }];

這里的adapter是用來適配每個分享平臺的票罐,為什么這么說呢。各個平臺可能有微小的差別泞边,這里體現(xiàn)在兩個方面:1.配置的參數(shù)该押,從上面的configure里面可以看出來、2.回調(diào)的方法阵谚,一共有下面幾個蚕礼,但不是每個分享都會全部走到。
1.-(void)applicationDidBecomeActive:(UIApplication *)application
2.-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
3.-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
4.-(void)didFinishLaunchingWithOptions:(NSDictionary *)launchOptions params:(NSDictionary *)params
我們在每次Appdelegate里面上面的方法被調(diào)用的時候會在生命周期模塊中進(jìn)行分發(fā)梢什,再到分享模塊中去向各個分享平臺的adapter分發(fā)奠蹬,如QQAdapter,adapter的類會遵循一個協(xié)議XYShareProtocol嗡午,該協(xié)議里面有如上的四種方法囤躁,其中有可選方法。類似這樣的實現(xiàn)

-(void)xy_didFinishLaunchingWithOptions:(NSDictionary *)launchOptions params:(NSDictionary *)params {
    
        XYSNSRegisterParam * registerParam = [[XYSNSRegisterParam alloc] init];
        XYSNSQQ *qq = [XYSNSQQ sharedInstance];
        NSString *appscheme = params[@"QQ"][@"appscheme"];
        NSString *appkey = params[@"QQ"][@"appkey"];
        [qq setAppScheme:appscheme];
        [registerParam setAppKey:appkey];
        [qq registerApp:registerParam];
}

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {

    return [XYSNSHelper application:application openURL:url sourceApplication:options[@"UIApplicationOpenURLOptionsOpenInPlaceKey"] annotation:options[@"UIApplicationOpenURLOptionsOpenInPlaceKey"] snsArray:@[[XYSNSQQ sharedInstance]]];
}

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    
    return [XYSNSHelper application:application openURL:url sourceApplication:sourceApplication annotation:annotation snsArray:@[[XYSNSQQ sharedInstance]]];
}

這里用到了一個工廠方法荔睹,分享模塊就像單于一個工廠狸演,它會把各個分享平臺通過runtime實例化出來即adapter,而各個adapter又遵循一個抽象的接口XYShareProtocol僻他,最終把各個分享平臺高度抽象化了宵距。

這對第二個問題我們的解決方案

其實完成這個任務(wù)是建立在上個任務(wù)的基礎(chǔ)上,只有分享模塊的抽象程度足夠的搞吨拗,才能做到隨心所欲的配置满哪。我們是用pod來進(jìn)行管理的,podspec文件的部分內(nèi)容如下

s.default_subspec = 'Core'

s.subspec 'Core' do |cr|
    cr.name = 'Core'
    cr.platform = :ios,'8.0'
    cr.source_files = 'XYShareSDK/Core/**/*.{h,m}'
end
s.subspec 'Twitter' do |tt|
    tt.name = 'Twitter'
    tt.platform = :ios,'8.0'
    tt.source_files = 'XYShareSDK/Twitter/*.{h,m}'
    tt.dependency 'Fabric','1.6.11'
    tt.dependency 'XYShareSDK/Core'
    tt.dependency 'TwitterCore','1.11.3'
    tt.dependency 'TwitterKit','1.11.3'

end

s.subspec 'Google' do |google|
    google.name = 'Google'
    google.platform = :ios,'8.0'
    google.source_files = 'XYShareSDK/Google/*.{h,m}'
    google.vendored_frameworks = 'XYShareSDK/Google/Library/*.framework'
    google.resource = 'XYShareSDK/Google/Library/*.bundle'
    google.dependency 'GoogleSymbolUtilities'
    google.dependency 'XYShareSDK/Core'

    # google.dependency 'XYShareSDK/GoogleSymbolUtilities'
end

Core文件夾里面都是高度抽象的code劝篷,其他的Twitter哨鸭、Google里面都是具體的分享。
我們在使用的時候podfile 像這樣

pod 'XYShareSDK/QQ', :git => 'http://xxx.xxx.xxx0/ioscomponentgroup/xysharesdk.git',:branch => 'branchForSubSpec'
pod 'XYShareSDK/WeChat', :git => 'http://xxx.xxx.xxx/ioscomponentgroup/xysharesdk.git',:branch => 'branchForSubSpec'
pod 'XYShareSDK/Weibo', :git => 'http://xxx.xxx.xxx/ioscomponentgroup/xysharesdk.git',:branch => 'branchForSubSpec'

雖然只寫了這么多携龟,但是中間的波折真實不少兔跌。希望本文對正在做重構(gòu)或組件化的童鞋有所幫助,歡迎issues

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峡蟋,一起剝皮案震驚了整個濱河市坟桅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蕊蝗,老刑警劉巖仅乓,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓬戚,居然都是意外死亡夸楣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豫喧,“玉大人石洗,你說我怎么就攤上這事〗粝裕” “怎么了讲衫?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孵班。 經(jīng)常有香客問我涉兽,道長,這世上最難降的妖魔是什么篙程? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任枷畏,我火速辦了婚禮,結(jié)果婚禮上虱饿,老公的妹妹穿的比我還像新娘拥诡。我一直安慰自己,他們只是感情好郭厌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布袋倔。 她就那樣靜靜地躺著,像睡著了一般折柠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上批狐,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天扇售,我揣著相機(jī)與錄音,去河邊找鬼嚣艇。 笑死承冰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的食零。 我是一名探鬼主播困乒,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贰谣!你這毒婦竟也來了娜搂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤吱抚,失蹤者是張志新(化名)和其女友劉穎百宇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秘豹,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡携御,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啄刹。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涮坐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出誓军,到底是詐尸還是另有隱情膊升,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布谭企,位于F島的核電站廓译,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏债查。R本人自食惡果不足惜非区,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盹廷。 院中可真熱鬧征绸,春花似錦、人聲如沸俄占。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缸榄。三九已至渤弛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甚带,已是汗流浹背她肯。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹰贵,地道東北人晴氨。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像碉输,于是被迫代替她去往敵國和親籽前。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容