Reveal的三種安裝方法

安裝Reveal的三種方式

一矢炼、靜態(tài)鏈接(最簡(jiǎn)單快捷地啟用Reveal檢視的方式)

警告: 不要將Reveal庫(kù)文件隨著正式應(yīng)用一起發(fā)布笔诵。 下面的步驟將會(huì)展示如何通過(guò)構(gòu)建配置谦炒,而把Reveal靜態(tài)庫(kù)文件积暖,僅連接到調(diào)試構(gòu)建的流程中或悲。
1孙咪、啟動(dòng)Reveal并選擇Help → Show Reveal Library in Finder堪唐,這將會(huì)打開(kāi)Finder窗口,并顯示一個(gè)名為iOS-Libraries的文件夾翎蹈。Show Reveal Library in Finder(圖1)
將 Reveal.framework 文件(圖2)拖入你的項(xiàng)目中淮菠。
圖1

屏幕快照 2016-07-26 下午8.56.19.png

圖2
屏幕快照 2016-07-26 下午8.56.28.png

2、在下圖所顯示的Add to targets對(duì)話框中荤堪,選擇所有您希望與Reveal集成的target合陵。可選步驟:選中Copy items if needed澄阳,將會(huì)把 Reveal.framework 拷貝到工程中——如果您這么做了拥知, 請(qǐng)記住,當(dāng)更新Reveal至新版本時(shí)碎赢,也依照上述步驟再次更新此庫(kù)文件低剔。

屏幕快照 2016-07-26 下午8.59.21.png

3、在Xcode的Project Navigator中肮塞,選中您的工程户侥,然后將以下步驟應(yīng)用于所有您希望與Reveal集成的target之上:

1)選擇Build Phases標(biāo)簽,如果在Link Binary With Libraries配置項(xiàng)中已有Reveal.framework峦嗤,請(qǐng)將其移除蕊唐。

屏幕快照 2016-07-26 下午9.01.46.png

2)選擇Build Settings標(biāo)簽,在Other Linker FlagsDebug配置項(xiàng)中加入如下配置:
-ObjC -lz -framework Reveal

屏幕快照 2016-07-26 下午9.03.09.png

4烁设、如果一切正常運(yùn)行替梨,請(qǐng)切換到Reveal應(yīng)用,此時(shí)您的應(yīng)用應(yīng)會(huì)出現(xiàn)在應(yīng)用選擇器的下拉列表當(dāng)中装黑。選中您的應(yīng)用副瀑,確認(rèn)可以看到此時(shí)正在模擬器(或設(shè)備)中運(yùn)行的應(yīng)用界面截圖。


屏幕快照 2016-07-26 下午9.04.21.png

成功鏈接項(xiàng)目:


屏幕快照 2016-07-26 下午9.04.30.png

TIP:再次運(yùn)行您的應(yīng)用恋谭,這一次糠睡,請(qǐng)選擇基于**Release**的scheme。請(qǐng)確認(rèn)此時(shí)疚颊,Reveal不再能連接上您的應(yīng)用狈孔。如果應(yīng)用仍然與Reveal保持連接,請(qǐng)確認(rèn) Reveal.framework 沒(méi)有出現(xiàn)在**Build Phases**標(biāo)簽的**Link Binary With Libraries**配置項(xiàng)中

二材义、動(dòng)態(tài)鏈接不添加庫(kù)(推薦使用)

1均抽、將Reveal加入您的Xcode工程
2、集成Reveal:不修改您的Xcode工程并加載Reveal(僅能運(yùn)行在模擬器)
此方法的好處:通過(guò)不修改Xcode工程文件來(lái)加載Reveal的方式其掂,您可以檢視任何一個(gè)您正在開(kāi)發(fā)的iOS應(yīng)用油挥,而不需要對(duì)這些應(yīng)用的工程做任何修改。另一個(gè)好處就是,您不需要再擔(dān)心深寥,犯下一不小心將Reveal庫(kù)連接到應(yīng)用中發(fā)布了的錯(cuò)誤攘乒。
1)打開(kāi)您的iOS工程,選擇 View → Navigators → Show Breakpoint Navigator惋鹅。

2)在面板左下角持灰,點(diǎn)擊 + 按鈕并選擇Add Symbolic Breakpoint

屏幕快照 2016-07-26 下午9.14.26.png

3)在 Symbol 輸入?yún)^(qū)內(nèi)輸入 UIApplicationMain(不可有空格)
4)點(diǎn)擊 Add Action 按鈕, 確認(rèn) Action 被設(shè)置為 Debugger Command
5)將以下內(nèi)容拷貝到 Action 的輸入?yún)^(qū)內(nèi):
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0)
注意: 請(qǐng)確認(rèn)Reveal.app的路徑信息符合您Mac的實(shí)際位置负饲。位置不正確不能正常使用Reveal。
6)選中 Automatically continue after evaluating actions 選項(xiàng)

屏幕快照 2016-07-26 下午9.14.38.png

7)右擊剛才新創(chuàng)建的斷點(diǎn)喂链,選擇 Move Breakpoint To → User

屏幕快照 2016-07-26 下午9.14.50.png

您可以像其他斷點(diǎn)一樣返十,禁用或啟用此斷點(diǎn)。用戶級(jí)別斷點(diǎn)在所有的Xcode工程中都可以使用
8)在iOS模擬器上構(gòu)建并運(yùn)行您的應(yīng)用
如果一切正常運(yùn)行椭微,請(qǐng)切換到Reveal應(yīng)用洞坑,此時(shí)您的應(yīng)用應(yīng)會(huì)出現(xiàn)在應(yīng)用選擇器的下拉列表當(dāng)中。選中您的應(yīng)用蝇率,確認(rèn)可以看到此時(shí)正在模擬器中運(yùn)行的應(yīng)用界面截圖迟杂。

三、動(dòng)態(tài)鏈接添加庫(kù)

添加Reveal到你的Xcode項(xiàng)目允許你團(tuán)隊(duì)中所有的成員不用再配置Reveal就可以使用Reveal本慕。
Warning:永遠(yuǎn)不要在你的發(fā)布版本中集成Reveal動(dòng)態(tài)庫(kù)排拷。Apple不允許通過(guò)在APP store下載的APP含有動(dòng)態(tài)庫(kù)。
1锅尘、代開(kāi)你Xcode中的iOS或者tvOS項(xiàng)目
2监氢、打開(kāi)Reveal點(diǎn)擊導(dǎo)航欄的Help->Show Reveal Library in Finder選項(xiàng)選擇iOS Library或者tvOS Library。這回打開(kāi)一個(gè)帶有相應(yīng)的framework的文件管理窗口藤违。
3浪腐、將libReveal.dylib(or libReveal-tvOS.dylib for tvOS apps)拖進(jìn)你的Xcode項(xiàng)目中。
4顿乒、在拖入Xcode Library的對(duì)話框中议街,選擇所有的targets。這樣會(huì)確保Xcode在編譯的時(shí)候不會(huì)鏈接動(dòng)態(tài)庫(kù)璧榄。選項(xiàng)Copy items if needed是可選的特漩,如果你選擇了這一項(xiàng)你需要注意當(dāng)Reveal更新的時(shí)候你要更新這個(gè)library。

屏幕快照 2016-07-26 下午8.59.21.png

5骨杂、點(diǎn)擊finish
6拾稳、在Xcode的導(dǎo)航欄中,選擇你想使用Reveal的target

  • 選擇Copy Bundle Resource這一項(xiàng)腊脱,添加libReveal.dylib(or libReveal-tvOS.dylib for tvOS apps)
  • 需要在Link Binary with Libraries做的:
    1)移除libReveal.dylib和libReveal-tvOS.dylib如果它們存在的話访得,
    ![Uploading 屏幕快照 2016-07-26 下午9.29.14_861591.png . . .]dylib不應(yīng)該在編譯的時(shí)候被鏈接
    2)添加如下的系統(tǒng)框架和庫(kù)如果它們不存在的話libz.tbd, CFNetwork.framework, QuartzCore.framework, 和 CoreGraphics.framework

屏幕快照 2016-07-26 下午9.29.14.png

7、為了當(dāng)一個(gè)應(yīng)用運(yùn)行在模擬器時(shí)動(dòng)態(tài)加載這些庫(kù),你需要在libReveal.dylib添加一些代碼當(dāng)在程序構(gòu)建的過(guò)程中悍抑。
在你的targetBulid Phases這一項(xiàng)選擇Editor->Add Bulid Phase ->Add Run Script鳄炉,編輯運(yùn)行腳本:

屏幕快照 2016-07-26 下午9.32.05.png

iOS targets:

set -e

if [ -n "${CODE_SIGN_IDENTITY}" ]; then
    codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib"
fi

tvOS targets:

set -e

if [ -n "${CODE_SIGN_IDENTITY}" ]; then
    codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal-tvOS.dylib"
fi

8.在你的項(xiàng)目中尋找一個(gè)合適的類添加下面的代碼(eg:UIApplicationDelegate),并且可以根據(jù)你的需求更改代碼:
swift:

// MARK: - Reveal

func loadReveal() {
    if NSClassFromString("IBARevealLoader") == nil {
        let revealLibName = "libReveal" // or "libReveal-tvOS" for tvOS targets
        let revealLibExtension = "dylib"
        var error: String?

        if let dylibPath = NSBundle.mainBundle().pathForResource(revealLibName, ofType: revealLibExtension) {
            print("Loading dynamic library \(dylibPath)")

            let revealLib = dlopen(dylibPath, RTLD_NOW)
            if revealLib == nil {
                error = String(UTF8String: dlerror())
            }
        } else {
            error = "File not found."
        }

        if error != nil {
            let alert = UIAlertController(title: "Reveal library could not be loaded", 
                                        message: "\(revealLibName).\(revealLibExtension) failed to load with error: \(error!)",
                                 preferredStyle: .Alert)
            alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
            UIApplication.sharedApplication().windows.first?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
        }
    }
}

Objective—C:

#import <dlfcn.h>

#pragma mark - Reveal

- (void)loadReveal
{
    if (NSClassFromString(@"IBARevealLoader") == nil)
    {
        NSString *revealLibName = @"libReveal"; // or @"libReveal-tvOS" for tvOS targets
        NSString *revealLibExtension = @"dylib";
        NSString *error;
        NSString *dyLibPath = [[NSBundle mainBundle] pathForResource:revealLibName ofType:revealLibExtension];

        if (dyLibPath != nil)
        {
            NSLog(@"Loading dynamic library: %@", dyLibPath);
            void *revealLib = dlopen([dyLibPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW);

            if (revealLib == NULL)
            {
                error = [NSString stringWithUTF8String:dlerror()];
            }
        }
        else
        {
            error = @"File not found.";
        }

        if (error != nil)
        {
            NSString *message = [NSString stringWithFormat:@"%@.%@ failed to load with error: %@", revealLibName, revealLibExtension, error];
            UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Reveal library could not be loaded" 
                                                                           message:message
                                                                    preferredStyle:UIAlertControllerStyleAlert];
            [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
            [[[[[UIApplication sharedApplication] windows] firstObject] rootViewController] presentViewController:alert animated:YES completion:nil];
        }
    }
}

WARING:你應(yīng)該確保在你的發(fā)布版本中不調(diào)用這個(gè)方法搜骡。你要確保僅在調(diào)試版本加載libReveal.dylib這個(gè)庫(kù)拂盯。

9、你可以 -[UIApplicationDelegate applicationDidBecomeActive:] 方法中調(diào)用如下方法來(lái)確認(rèn)這個(gè)庫(kù)以被正確的加載记靡。

Swift:

func applicationDidBecomeActive:(application: UIApplication) {
    self.loadReveal()
}

Objective-C:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self loadReveal];
}

NOTE:在-[UIApplicationDelegate applicationDidBecomeActive:返回值之前加載該庫(kù)谈竿,Reveal 服務(wù)將會(huì)自動(dòng)開(kāi)始啟動(dòng)。
10摸吠、如果你不想自動(dòng)啟動(dòng)Reveal服務(wù)在上一步空凸,你想通過(guò)調(diào)試按鈕或者其他的類似按鈕。你只需要在app已經(jīng)啟動(dòng)的時(shí)候調(diào)用loadReveal這個(gè)方法寸痢,然后系統(tǒng)會(huì)發(fā)出一個(gè)IBARevealRequestStart的通知:
Swift:

func startReveal() {
    NSNotificationCenter.defaultCenter().postNotificationName("IBARevealRequestStart", object: nil)
}

Objective-C:

- (void)startReveal
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];
}

11呀洲、在Xcode中構(gòu)建并運(yùn)行你的項(xiàng)目,如果一切順利啼止,你應(yīng)該可以切換你的iOS項(xiàng)目在Reveal的下拉列表中道逗。選擇你的app然后驗(yàn)證看一下是否可以看到和你的模擬器一樣的畫面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末献烦,一起剝皮案震驚了整個(gè)濱河市滓窍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巩那,老刑警劉巖贰您,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拢操,居然都是意外死亡锦亦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門令境,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)杠园,“玉大人,你說(shuō)我怎么就攤上這事舔庶∨滓希” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵惕橙,是天一觀的道長(zhǎng)瞧甩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)弥鹦,這世上最難降的妖魔是什么肚逸? 我笑而不...
    開(kāi)封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任爷辙,我火速辦了婚禮,結(jié)果婚禮上朦促,老公的妹妹穿的比我還像新娘膝晾。我一直安慰自己,他們只是感情好务冕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布血当。 她就那樣靜靜地躺著,像睡著了一般禀忆。 火紅的嫁衣襯著肌膚如雪臊旭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天箩退,我揣著相機(jī)與錄音离熏,去河邊找鬼。 笑死乏德,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吠昭。 我是一名探鬼主播喊括,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矢棚!你這毒婦竟也來(lái)了郑什?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒲肋,失蹤者是張志新(化名)和其女友劉穎蘑拯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體兜粘,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡申窘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孔轴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剃法。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖路鹰,靈堂內(nèi)的尸體忽然破棺而出贷洲,到底是詐尸還是另有隱情,我是刑警寧澤晋柱,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布优构,位于F島的核電站,受9級(jí)特大地震影響雁竞,放射性物質(zhì)發(fā)生泄漏钦椭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玉凯。 院中可真熱鬧势腮,春花似錦、人聲如沸漫仆。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盲厌。三九已至署照,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吗浩,已是汗流浹背建芙。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工档悠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留规哪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓葫录,卻偏偏與公主長(zhǎng)得像阀湿,于是被迫代替她去往敵國(guó)和親赶熟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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