添加Reveal
為了讓Reveal
能夠在運行時,檢視及調(diào)試您的iOS應用,首先您需將Reveal
庫文件連接入您的應用當中。而所需的Reveal庫文件已經(jīng)內(nèi)置在Reveal的應用程序當中。
Reveal提供了以下三種方式來集成庫文件與您的iOS應用:
靜態(tài)連接
將Reveal的靜態(tài)庫文件連接入應用,是最簡單快捷地啟用Reveal檢視的方式。
警告: 不要將
Reveal
庫文件隨著正式應用一起發(fā)布。 下面的步驟將會展示如何通過構建配置,而把Reveal
靜態(tài)庫文件,僅連接到調(diào)試構建的流程中。
1、在Xcode中打開您的iOS工程。
2、啟動Reveal并選擇
__Help → Show Reveal Library in Finder__
,這將會打開Finder
窗口,并顯示一個名為*iOS-Libraries*
的文件夾。
Show Reveal Library in Finder
3、將
Reveal.framework
文件拖入Xcode中
的Project Navigator
面板。4、在下圖所顯示的
__Add to targets__
對話框中,選擇所有您希望與Reveal
集成的target
??蛇x步驟:選中__Copy items if needed__
,將會把Reveal.framework
拷貝到工程中——如果您這么做了, 請記住,當更新Reveal至新版本時,也依照上述步驟再次更新此庫文件。
Copy resource to project dialog
5、點擊
Finish
。-
6、在
Xcode
的Project Navigator
中,選中您的工程,然后將以下步驟應用于所有您希望與Reveal
集成的target
之上:-
選擇
Build Phases
標簽,如果在Link Binary With Libraries
配置項中已有Reveal.framework
,請將其移除。Remove Reveal framework from target
-
選擇
Build Settings
標簽,在Other Linker Flags
的Debug
配置項中加入如下配置:-ObjC -lz -framework Reveal Add linker flags to target
-
7、在
Xcode
中,選擇基于Debug
配置的scheme
,構建并運行您的應用。如果應用運行于真實設備之上,請確保此設備與正在運行Reveal的Mac機器,處于同一Wi-Fi網(wǎng)絡
中。
Reveal App Chooser showing Soundstagram
如果一切正常運行,請切換到Reveal應用,此時您的應用應會出現(xiàn)在應用選擇器的下拉列表當中。選中您的應用,確認可以看到此時正在模擬器(或設備)中運行的應用界面截圖。
- 8、再次運行您的應用,這一次,請選擇基于
Release
的scheme
。請確認此時,Reveal
不再能連接上您的應用。如果應用仍然與Reveal
保持連接,請確認Reveal.framework
沒有出現(xiàn)在Build Phases
標簽的Link Binary With Libraries
配置項中。
集成Reveal
無需添加任何代碼,無需引入任何頭文件。庫將會在應用啟動時自動加載,并在您的應用內(nèi)部啟動必要的Reveal
服務。
如果您希望對集成的方式擁有更多地控制,請參考動態(tài)加載之集成步驟。
動態(tài)連接
對于那些想要完全控制應用程序加載庫文件時機的開發(fā)者,動態(tài)加載是一個不錯的方式。采用動態(tài)加載的方式,Reveal的代碼只會在運行時,根據(jù)您的需要而加載。
將動態(tài)庫文件集成入您的iOS應用的方式有兩種:
將Reveal加入您的Xcode工程
將Reveal加入您的Xcode工程,使得您團隊中的其他成員無需任何額外的配置,就可以使用Reveal。
警告: 永遠不要將包含Reveal動態(tài)庫文件的應用正式發(fā)布。Apple不允許將含有動態(tài)加載庫文件的iOS應用發(fā)布到Apple商店中。
在
Xcode
中打開您的iOS
工程。啟動
Reveal
并選擇__Help → Show Reveal Library in Finder__
,這將會打開Finder
窗口,并顯示一個名為iOS-Libraries
的文件夾。
Show Reveal Library in Finder
將
libReveal.dylib
文件拖入Xcode
中的Project Navigator
面板。在下圖所顯示的
__Add to targets__
對話框中,__反選所有的target__
。這確保了Xcode
不會在編譯時連接動態(tài)庫文件??蛇x步驟:選中__Copy items if needed__
,將會把libReveal.dylib
拷貝到工程中——如果您這么做了, 請記住,當更新Reveal
至新版本時,也依照上述步驟再次更新此庫文件
。
Copy resource to project dialog
點擊
Finish
。在
Xcode
的Project Navigator
中,選中您的工程,然后將以下步驟應用在所有您希望適配Reveal
的target
之上:
Copy library to bundle resources
* 在__Copy Bundle Resources__配置區(qū)域中,加入*libReveal.dylib*。
* 在**Link Binary With Libraries**配置項中:
* 如果已有*libReveal.dylib*,請將其移除——不應在編譯時連接dylib文件。
* 如果下列系統(tǒng)框架與庫文件還不存在,請將他們加入:
* libz.dylib
* CFNetwork.framework
* QuartzCore.framework
* CoreGraphics.framework - Xcode一般默認會在工程中包含此框架文件。
- 為了能在debugger之外,將庫文件動態(tài)地載入設備上的應用,您需要在構建過程中加入對libReveal.dylib文件的code sign。
Add Run Script phase
進入target
的Build Phases
標簽頁,選擇Editor → Add Build Phase → Add Run Script
菜單。在Run Script
階段中加入以下內(nèi)容:
set -e
if [ -n "${CODE_SIGN_IDENTITY}" ]; then
codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib"
fi
- 將下面的代碼加入到項目中合適的類文件中(例如您的UIApplicationDelegate),適當修改使之滿足您的需要:
Swift:
// MARK: - Reveal
func loadReveal() {
if NSClassFromString("IBARevealLoader") == nil {
let revealLibName = "libReveal"
let revealLibExtension = "dylib"
var error: String?
if let dylibPath = NSBundle.mainBundle().pathForResource(revealLibName, ofType: revealLibExtension) {
println("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 {
UIAlertView(title: "Reveal library could not be loaded",
message: "\(revealLibName).\(revealLibExtension) failed to load with error: \(error!)",
delegate: nil,
cancelButtonTitle: "OK").show()
}
}
}
Objective-C:
#pragma mark - Reveal
#import <dlfcn.h>
- (void)loadReveal
{
if (NSClassFromString(@"IBARevealLoader") == nil)
{
NSString *revealLibName = @"libReveal";
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];
[[[UIAlertView alloc] initWithTitle:@"Reveal library could not be loaded" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
}
}
}
警告: 不要在發(fā)布
release
構建中調(diào)用此方法,確保僅是在應用的調(diào)試debug
構建中加載libReveal.dylib
。
- 一個簡單的集成方式是,在
-[UIApplicationDelegate application: didFinishLaunchingWithOptions:]
方法中調(diào)用上面聲明的- (void)loadReveal
方法,以確保Reveal庫盡早地被加載進來。
Swift:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.loadReveal()
return true
}
Objective-C:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self loadReveal];
return YES;
}
提示: 在
-[UIApplicationDelegate application: didFinishLaunchingWithOptions:]
方法返回之前加載庫的一個好處是,將會讓Reveal
服務在應用啟動的同時也自動啟動。
- 如果您不希望如上述步驟自動啟動
Reveal
服務,也可以以手動的方式來啟動,例如通過一個Debug
按鈕。在應用啟動后,自己調(diào)用loadReveal
方法,然后再分發(fā)一個名為IBARevealRequestStart
的NSNotification
:
Swift:
func startReveal() {
NSNotificationCenter.defaultCenter().postNotificationName("IBARevealRequestStart", object: nil)
}
Objective-C:
- (void)startReveal
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];
}
-
在
Xcode
中,選擇基于Debug
配置的scheme
,構建并運行您的應用。Reveal App Chooser showing Soundstagram
如果一切正常運行,請切換到
Reveal
應用,此時您的應用應會出現(xiàn)在應用選擇器的下拉列表當中。選中您的應用,確認可以看到此時正在模擬器(或設備)中運行的應用界面截圖。
不修改您的Xcode工程并加載Reveal
此方法僅適用于在iOS模擬器上運行的應用。
通過不修改Xcode
工程文件來加載Reveal
的方式,您可以檢視任何一個您正在開發(fā)的iOS
應用,而不需要對這些應用的工程做任何修改。另一個好處就是,您不需要再擔心,犯下一不小心將Reveal
庫連接到應用中發(fā)布了的錯誤。
打開您的iOS工程,選擇
View → Navigators → Show Breakpoint Navigator
。在面板左下角,點擊
+
按鈕并選擇Add Symbolic Breakpoint
。
Adding Symbolic Breakpoint to Xcode project
在
Symbol
輸入?yún)^(qū)內(nèi)輸入UIApplicationMain
。點擊
Add Action
按鈕, 確認Action
被設置為Debugger Command
。將以下內(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)
注意: 請確認
Reveal.app
的路徑信息符合您Mac的實際位置
。
- 選中
Automatically continue after evaluating actions
選項。
Setting up Symbolic Breakpoint in Xcode project
- 右擊剛才新創(chuàng)建的斷點,選擇
Move Breakpoint To → User
.
Moving the Breakpoint to the User
您可以像其他斷點一樣,禁用或啟用此斷點。用戶級別斷點在所有的Xcode工程中都可以使用。
- 在iOS模擬器上構建并運行您的應用。
Reveal App Chooser showing Soundstagram
如果一切正常運行,請切換到Reveal應用,此時您的應用應會出現(xiàn)在應用選擇器的下拉列表當中。選中您的應用,確認可以看到此時正在模擬器中運行的應用界面截圖。
CocoaPods
CocoaPods
是一款針對iOS
與OSX
項目的依賴管理系統(tǒng)。它大大簡化了以往Xcode
工程里,對第三方庫的依賴管理與配置工作。
CocoaPods
提供了Podspec
用于將Reveal
集成入您的項目。
警告: 不要將連接了
Reveal
庫文件的應用用于正式發(fā)布。下面的指南描述了一種使用構建配置來使Reveal
靜態(tài)庫文件僅在調(diào)試構建中連接的方式。
此說明要求您在之前已經(jīng)在項目中配置好了
CocoaPods
,若不然,請先行配置Cocoapods
。
- 將下面內(nèi)容加入你的Podfile中:
pod 'Reveal-iOS-SDK', :configurations => ['Debug']
- 在項目的根目錄下執(zhí)行
pod install
命令(如果之前已經(jīng)在項目中使用了Cocoapods
,請執(zhí)行pod update
命令)。
提示:
我們一直致力讓CocoaPods倉庫中的Reveal Podspec保持最新,但有時它還是有可能稍稍落后于最近發(fā)布的Reveal版本。
如果您使用的CocoaPods版本早于0.34,那么在執(zhí)行 pod install 或者 pod update 命令時,可能會在控制臺看到如下的錯誤:
[!] Unknown external source parameters for `Reveal-iOS-SDK`: `{:configurations=>["Debug"]}`
請通過更新CocoaPods至最新版本來解決此問題。
移除Reveal
根據(jù)您實際所選擇的Reveal集成方式,請根據(jù)下述相關步驟來移除Reveal。
一旦庫文件成功的移除后,下面的內(nèi)容將不再會在您的應用啟動時出現(xiàn)在Xcode控制臺:
INFO: Reveal Server started (Protocol Version X).
靜態(tài)連接
- 打開您的Xcode工程。
- 從 Project Navigator 中刪除 Reveal.framework 的引用。
- 在Xcode的
Project Navigator
中選中您的工程,對于每一個集成了Reveal
得target
,請選擇Build Settings
標簽頁,將下面內(nèi)容從Debug
配置中的Other Linked Flags
設置中移除:
-framework Reveal
-ObjC and -lz (刪除前請確認此配置內(nèi)容僅是用于Reveal)。
- 搞定 - 運行應用,確認Reveal沒有和應用連接上。
動態(tài)連接
- 打開您的Xcode工程。
- 從 Project Navigator 中刪除 libReveal.dylib 的引用。
- 在Xcode的 Project Navigator中選中您的工程,對于每一個集成了Reveal得target,選擇 Build Phases 標簽頁,如果下列庫文件僅供Reveal使用的話,請將它們從 Link Binary With Libraries 配置中移除:
libz.dylib
CFNetwork.framework
QuartzCore.framework
CoreGraphics.framework
- 將自定義的codesign內(nèi)容從 Build Phases 下的 Run Script 中刪除。
- 將 loadReveal / startReveal 方法從您的代碼中刪除。
- 搞定 - 運行應用,確認Reveal沒有和應用連接上。
CocoaPods
- 在您的Podfile文件中刪除下面這行內(nèi)容:
pod 'Reveal-iOS-SDK', :configurations => ['Debug']
在項目的根目錄下執(zhí)行 pod update 命令。
如果您的 Podfile 中只有 Reveal-iOS-SDK 一個pod依賴,請根據(jù)此說明,將CocoaPods從項目中完全移除。
搞定 - 運行應用,確認Reveal沒有和應用連接上。