iOS開發(fā)-動(dòng)態(tài)庫的加載方式(二)以資源文件(NSBundle)的形式添加

寫在前面:對(duì)于開發(fā)企業(yè)級(jí)應(yīng)用的開發(fā)者而已,以資源文件的形式來加載動(dòng)態(tài)庫就顯得尤為重要然眼,因?yàn)椋o不同的客戶打不同的IPA包葵腹,里面的有些功能是不一樣高每,比如說有一個(gè)動(dòng)態(tài)庫是專門為一個(gè)客戶制定的屿岂,那么在給其他客戶打包時(shí)就不應(yīng)該把這個(gè)動(dòng)態(tài)庫打進(jìn)去。所以鲸匿,為了解決這個(gè)問題爷怀,我們可以使用下面的這種加載方式。

1.添加動(dòng)態(tài)庫到資源

277EFE9E-0FBC-4288-991E-5BD5914D15FA.png
237D411C-396B-4B9D-9355-829A45AF9053.png

然后带欢,選擇你剛才放在主工程目錄下的動(dòng)態(tài)庫运授。這時(shí)項(xiàng)目目錄下多了一個(gè)動(dòng)態(tài)庫。倘若你之前直接拖進(jìn)來時(shí)目錄下就已經(jīng)存在乔煞,請(qǐng)先右鍵刪除引用吁朦。

2.動(dòng)態(tài)加載動(dòng)態(tài)庫
直接上我項(xiàng)目中實(shí)際使用的代碼:
這個(gè)動(dòng)態(tài)庫主要實(shí)現(xiàn)的是一個(gè)視頻會(huì)議的功能
這個(gè)TBConfMeetingApi類是我處理這個(gè)創(chuàng)建會(huì)議和加入會(huì)議的一個(gè)工具類
.h文件

//
//  TBConfMeetingApi.h
//  Ecm
//
//  Created by zengchunjun on 16/9/13.
//
//

#import <Foundation/Foundation.h>
#import "TBConfMeetingManager.h"

@interface TBConfMeetingApi : NSObject

+ (void)joinConfWithSiteName:(NSString*)siteName DisplayName:(NSString*)displayName andUserName:(NSString*)userName MeetingID:(NSString*)meetingID MeetingPwd:(NSString*)meetingPwd WithPortrait:(NSString*) portrait VC:(UIViewController*)vc shareCallBack:(TBConferenceShareCallback)shareCallBack;

+ (void)createConfWithSiteName:(NSString*)siteName DisplayName:(NSString *)displayName andUserName:(NSString*)userName HostPwd:(NSString*)hostPwd MeetingTopic:(NSString*)meetingTopic MeetingPwd:(NSString *)meetingPwd WithAutoAdjustVideoBitrate:(BOOL)autoAdjustVideoBitrate VC:(UIViewController *)vc createCallBack:(TBConferenceEnterCallback)createCallBack shareCallBack:(TBConferenceShareCallback)shareCallBack;

@end

.m文件

//
//  TBConfMeetingApi.m
//  Ecm
//
//  Created by zengchunjun on 16/9/13.
//
//

#import "TBConfMeetingApi.h"

@implementation TBConfMeetingApi
// 初始化動(dòng)態(tài)庫,也就是加載動(dòng)態(tài)庫
+ (BOOL)initFramework
{
    if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0)
    {
        NSLog(@"%s",__func__);
        return NO;
    }
    // 使用GCD一次性代碼來只加載一次動(dòng)態(tài)庫
    static dispatch_once_t priOnceToken;
    dispatch_once(&priOnceToken, ^
                  {
                      NSString *path = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"TBConfMeeting.framework"];
                      
                      NSError *err = nil;
                      NSBundle *bundle = [NSBundle bundleWithPath:path];
                      if ([bundle loadAndReturnError:&err])
                      {
                          NSLog(@"bundle load framework success.");
                          
                      }
                      else
                      {
                          NSLog(@"bundle load framework err:%@", err);
                          
                      }
                  });
    return YES;
}

+ (void)createConfWithSiteName:(NSString*)siteName DisplayName:(NSString *)displayName andUserName:(NSString*)userName HostPwd:(NSString*)hostPwd MeetingTopic:(NSString*)meetingTopic MeetingPwd:(NSString *)meetingPwd WithAutoAdjustVideoBitrate:(BOOL)autoAdjustVideoBitrate VC:(UIViewController *)vc createCallBack:(TBConferenceEnterCallback)createCallBack shareCallBack:(TBConferenceShareCallback)shareCallBack
{
//#if !TARGET_IPHONE_SIMULATOR
//    [[ConfWithVc shareInstance] createConfWithSiteName:siteName DisplayName:displayName andUserName:userName HostPwd:hostPwd MeetingTopic:meetingTopic MeetingPwd:meetingPwd WithAutoAdjustVideoBitrate:autoAdjustVideoBitrate VC:vc createCallBack:callBack];
//#endif
    
    if (![self initFramework]) {
        return ;
    }
    NSString *className = @"TBConfMeetingManager";
    NSString *methodName = @"createConfWithSiteName:DisplayName:andUserName:HostPwd:MeetingTopic:MeetingPwd:WithAutoAdjustVideoBitrate:VC:createCallBack:shareCallBack:";
    Class class = NSClassFromString(className);
    NSMethodSignature *sig = [[class class] methodSignatureForSelector:NSSelectorFromString(methodName)];
    if (sig)
    {
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
        if (invocation)
        {
            [invocation setTarget:class];
            [invocation setSelector:NSSelectorFromString(methodName)];
            [invocation setArgument:&siteName atIndex:2];
            [invocation setArgument:&displayName atIndex:3];
            [invocation setArgument:&userName atIndex:4];
            [invocation setArgument:&hostPwd atIndex:5];
            [invocation setArgument:&meetingTopic atIndex:6];
            [invocation setArgument:&meetingPwd atIndex:7];
            [invocation setArgument:&autoAdjustVideoBitrate atIndex:8];
            [invocation setArgument:&vc atIndex:9];
            [invocation setArgument:&createCallBack atIndex:10];
            [invocation setArgument:&shareCallBack atIndex:11];
            [invocation invoke];
            const char *returnType = sig.methodReturnType;
            int *result;
            if(!strcmp(returnType, @encode(int)))
            {
                [invocation getReturnValue:&result];
            }
//            return result;
        }
    }
    
    
}

+ (void)joinConfWithSiteName:(NSString*)siteName DisplayName:(NSString*)displayName andUserName:(NSString*)userName MeetingID:(NSString*)meetingID MeetingPwd:(NSString*)meetingPwd WithPortrait:(NSString*) portrait VC:(UIViewController*)vc shareCallBack:(TBConferenceShareCallback)shareCallBack
{
//#if !TARGET_IPHONE_SIMULATOR
//    [[ConfWithVc shareInstance] joinConfWithSiteName:siteName DisplayName:displayName andUserName:userName MeetingID:meetingID MeetingPwd:meetingPwd WithPortrait:nil VC:vc];
//#endif
    
    if (![self initFramework]) {
        return;
    }
    NSString *className = @"TBConfMeetingManager";
    NSString *methodName = @"joinConfWithSiteName:DisplayName:andUserName:MeetingID:MeetingPwd:WithPortrait:VC:shareCallBack:";
    Class class = NSClassFromString(className);
    NSMethodSignature *sig = [[class class] methodSignatureForSelector:NSSelectorFromString(methodName)];
    if (sig)
    {
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
        if (invocation)
        {
            [invocation setTarget:class];
            [invocation setSelector:NSSelectorFromString(methodName)];
            [invocation setArgument:&siteName atIndex:2];
            [invocation setArgument:&displayName atIndex:3];
            [invocation setArgument:&userName atIndex:4];
            [invocation setArgument:&meetingID atIndex:5];
            [invocation setArgument:&meetingPwd atIndex:6];
            [invocation setArgument:&portrait atIndex:7];
            [invocation setArgument:&vc atIndex:8];
            [invocation setArgument:&shareCallBack atIndex:9];
            
            [invocation invoke];
                    }
    }
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渡贾,一起剝皮案震驚了整個(gè)濱河市逗宜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剥啤,老刑警劉巖锦溪,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異府怯,居然都是意外死亡刻诊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門牺丙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來则涯,“玉大人,你說我怎么就攤上這事冲簿∷谂校” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵峦剔,是天一觀的道長(zhǎng)档礁。 經(jīng)常有香客問我,道長(zhǎng)吝沫,這世上最難降的妖魔是什么呻澜? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮惨险,結(jié)果婚禮上羹幸,老公的妹妹穿的比我還像新娘。我一直安慰自己辫愉,他們只是感情好栅受,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般屏镊。 火紅的嫁衣襯著肌膚如雪依疼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天闸衫,我揣著相機(jī)與錄音涛贯,去河邊找鬼。 笑死蔚出,一個(gè)胖子當(dāng)著我的面吹牛弟翘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骄酗,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稀余,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了趋翻?” 一聲冷哼從身側(cè)響起睛琳,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踏烙,沒想到半個(gè)月后师骗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讨惩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年辟癌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荐捻。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黍少,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出处面,到底是詐尸還是另有隱情厂置,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布魂角,位于F島的核電站昵济,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏野揪。R本人自食惡果不足惜访忿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望囱挑。 院中可真熱鬧醉顽,春花似錦沼溜、人聲如沸平挑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽通熄。三九已至唆涝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唇辨,已是汗流浹背廊酣。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赏枚,地道東北人亡驰。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像饿幅,于是被迫代替她去往敵國(guó)和親凡辱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議栗恩。它實(shí)...
    香橙柚子閱讀 23,860評(píng)論 8 183
  • github排名https://github.com/trending,github搜索:https://gith...
    小米君的demo閱讀 4,589評(píng)論 2 38
  • 某些所謂意義透乾,對(duì)我來說,似乎都無從去找尋謎題與謎底磕秤。 我不知道為什么要執(zhí)意一個(gè)人來到這里乳乌。 這偏遠(yuǎn)之地的小城,有古...
    895bfb9cc59c閱讀 399評(píng)論 0 4
  • 偶然看到一條新聞,大意是床绪,大學(xué)生大學(xué)畢業(yè)沒有找到滿意的工作客情,責(zé)怪大學(xué)浪費(fèi)了時(shí)間和精力。他們口口聲聲“大學(xué)該賠我人...
    皖琬閱讀 252評(píng)論 0 0
  • 言少意淺癞己,見諒膀斋。 附陶淵明形影神贈(zèng)答詩 《形贈(zèng)影》天地長(zhǎng)不沒,山川無改時(shí)痹雅。草木得常理仰担,霜露榮悴之。謂人最靈智绩社,獨(dú)復(fù)...
    青玉藏風(fēng)閱讀 258評(píng)論 0 2