安裝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
圖2
2、在下圖所顯示的Add to targets對(duì)話框中荤堪,選擇所有您希望與Reveal集成的target合陵。可選步驟:選中Copy items if needed澄阳,將會(huì)把 Reveal.framework 拷貝到工程中——如果您這么做了拥知, 請(qǐng)記住,
當(dāng)更新Reveal至新版本時(shí)碎赢,也依照上述步驟再次更新此庫(kù)文件
低剔。
3、在Xcode的Project Navigator中肮塞,選中您的工程户侥,然后將以下步驟應(yīng)用于所有您希望與Reveal集成的target之上:
1)選擇Build Phases標(biāo)簽,如果在Link Binary With Libraries配置項(xiàng)中已有Reveal.framework峦嗤,請(qǐng)將其移除蕊唐。
2)選擇Build Settings標(biāo)簽,在Other Linker Flags的Debug配置項(xiàng)中加入如下配置:
-ObjC -lz -framework Reveal
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)用界面截圖。
成功鏈接項(xiàng)目:
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。
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)
7)右擊剛才新創(chuàng)建的斷點(diǎn)喂链,選擇 Move Breakpoint To → User
您可以像其他斷點(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。
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
7、為了當(dāng)一個(gè)應(yīng)用運(yùn)行在模擬器時(shí)動(dòng)態(tài)加載這些庫(kù),你需要在libReveal.dylib添加一些代碼當(dāng)在程序構(gòu)建的過(guò)程中悍抑。
在你的target
Bulid Phases
這一項(xiàng)選擇Editor->Add Bulid Phase ->Add Run Script鳄炉,編輯運(yùn)行腳本:
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)證看一下是否可以看到和你的模擬器一樣的畫面。