http://blog.csdn.net/jackfrued/article/details/50934092ios
Reveal是iOS开发工具中的神器之一,它可以在应用程序运行过程当中调试应用程序界面。 经过Reveal咱们能够链接到应用程序,并容许开发者编辑各类用户界面参数,结果会立刻在用户界面上呈现。就像Web开发人员用浏览器提供的开发人员工具调试页面同样,Reveal容许开发者在不修改代码、不从新构建项目、不从新部署应用程序的状况下就可以调试iOS应用的用户界面。objective-c
Reveal 下载地址:http://revealapp.com/download/swift
集成Reveal无需添加任何代码,无需引入任何头文件。库将会在应用启动时自动加载,并在您的应用内部启动必要的Reveal服务。windows
将Reveal的静态库文件链接入应用,是最简单快捷地启用Reveal检视的方式。xcode
警告: 不要将Reveal库文件随着正式应用一块儿发布。 下面的步骤将会展现如何经过构建配置,而把Reveal静态库文件,仅链接到调试构建的流程中。浏览器
在Xcode中打开您的iOS工程。ruby
启动Reveal并选择Help → Show Reveal Library in Finder,这将会打开Finder窗口,并显示一个名为iOS-Libraries的文件夹。bash
将 Reveal.framework 文件拖入Xcode中的Project Navigator面板。markdown
在下图所显示的Add to targets对话框中,选择全部您但愿与Reveal集成的target。可选步骤:选中Copy items if needed,将会把 Reveal.framework 拷贝到工程中——若是您这么作了, 请记住,当更新Reveal至新版本时,也依照上述步骤再次更新此库文件。网络
点击Finish。
选择Build Settings标签,在Other Linker Flags的Debug配置项中加入以下配置。
-ObjC -lz -framework Reveal
若是您使用的是Xcode 7, 请确认 Reveal.framework 所在的目录在您的工程配置项 “Framework Search Paths” 中。具体的内容看起来会像这样。
FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SYSTEM_APPS_DIR)/Reveal.app/Contents/SharedSupport/iOS-Libraries"
在Xcode中,构建并运行您的应用。若是应用运行于真实设备之上,请确保此设备与正在运行Reveal的Mac机器,处于同一Wi-Fi网络中。
若是一切正常运行,请切换到Reveal应用,此时您的应用应会出如今应用选择器的下拉列表当中。选中您的应用,确承认以看到此时正在模拟器(或设备)中运行的应用界面截图。
动态加载容许iOS应用在运行时,能够按需地加载第三方库。采用这种方式,库文件无需链接入应用的可执行文件,而是被加入到了应用Bundle中去,从而在运行时能按需加载。这种方式使得开发者能够在我的应用中,彻底自由地控制Reveal库的加载,以及其服务的启动与中止。
将Reveal加入您的Xcode工程,使得您团队中的其余成员无需任何额外的配置,就可使用Reveal。
警告: 永远不要将包含Reveal动态库文件的应用正式发布。Apple不容许将含有动态加载库文件的iOS应用发布到Apple商店中。
在Xcode中打开您的iOS工程。
启动Reveal并选择Help → Show Reveal Library in Finder,这将会打开Finder窗口,并显示一个名为iOS-Libraries的文件夹。
将 libReveal.dylib 文件拖入Xcode中的Project Navigator面板。
在下图所显示的Add to targets对话框中,反选全部的target。这确保了Xcode不会在编译时链接动态库文件。可选步骤:选中Copy items if needed,将会把 libReveal.dylib 拷贝到工程中——若是您这么作了, 请记住,当更新Reveal至新版本时,也依照上述步骤再次更新此库文件。
点击Finish。
在Copy Bundle Resources配置区域中,加入libReveal.dylib。
在Link Binary With Libraries配置项中:
为了能在debugger以外,将库文件动态地载入设备上的应用,您须要在构建过程当中加入对libReveal.dylib文件的code sign。
进入target的Build Phases标签页,选择Editor → Add Build Phase → Add Run Script菜单。在Run Script阶段中加入如下内容:
set -e if [ -n "${CODE_SIGN_IDENTITY}" ]; then codesign -fs "${CODE_SIGN_IDENTITY}" "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib" fi
将下面的代码加入到项目中合适的类文件中(例如您的UIApplicationDelegate),适当修改使之知足您的须要:
// 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) } } }
#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]; } } }
警告: 不要在发布(release)构建中调用此方法,确保仅是在应用的调试(debug)构建中加载libReveal.dylib。
一个简单的集成方式是,在-[UIApplicationDelegate applicationDidBecomeActive:]方法中调用上面声明的- (void)loadReveal方法,以确保Reveal库尽早地被加载进来。
Swift:
1. func applicationDidBecomeActive:(application: UIApplication) { self.loadReveal() }
Objective-C:
(void)applicationDidBecomeActive:(UIApplication *)application { [self loadReveal]; }
提示: 在
-[UIApplicationDelegate applicationDidBecomeActive:]
方法返回以前加载库的一个好处是,将会让Reveal服务在应用启动的同时也自动启动。
若是您不但愿如上述步骤自动启动Reveal服务,也能够以手动的方式来启动,例如经过一个Debug按钮。在应用启动后,本身调用loadReveal方法,而后再分发一个名为IBARevealRequestStart的NSNotification:
Swift:
func startReveal() {
NSNotificationCenter.defaultCenter().postNotificationName("IBARevealRequestStart", object: nil) }
Objective-C:
- (void)startReveal { [[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil]; }
在Xcode中,构建并运行您的应用。若是一切正常运行,请切换到Reveal应用,此时您的应用应会出如今应用选择器的下拉列表当中。选中您的应用,确承认以看到此时正在模拟器(或设备)中运行的应用界面截图。
CocoaPods 是一款针对iOS与OSX项目的依赖管理系统。它大大简化了以往Xcode工程里,对第三方库的依赖管理与配置工做。
CocoaPods提供了Podspec用于将Reveal集成入您的项目。
警告: 不要将链接了Reveal库文件的应用用于正式发布。下面的指南描述了一种使用构建配置来使Reveal静态库文件仅在调试构建中链接的方式。
此说明要求您在以前已经在项目中配置好了CocoaPods,若否则,请先行配置Cocoapods。
将下面内容加入你的Podfile中:
pod 'Reveal-iOS-SDK', :configurations => ['Debug']
根据您实际所选择的Reveal集成方式,请根据下述相关步骤来移除Reveal。
一旦库文件成功的移除后,下面的内容将再也不会在您的应用启动时出如今Xcode控制台:
INFO: Reveal Server started (Protocol Version X).
loadReveal / startReveal
方法从您的代码中删除。在您的Podfile文件中删除下面这行内容:
pod 'Reveal-iOS-SDK', :configurations => ['Debug']
在项目的根目录下执行 pod update 命令。
若是您的 Podfile 中只有 Reveal-iOS-SDK 一个pod依赖,请根据此说明,将CocoaPods从项目中彻底移除。
搞定 - 运行应用,确认Reveal没有和应用链接上。
上图是Reveal的运行界面,其界面主要分红3部分:
左边部分是整个界面的层级关系,在这里能够以树形级层的方式来查看整个界面元素。
中间部分是一个可视化的查看区域,用户能够在这里切换2D或3D的查看方式,这里看到的也是程序运行的实时界面。
右边部边是控件的详细参数查看区域,当咱们选中某一个具体的控件时,右边就能够显示出该控件的具体的参数列表。咱们除了能够查看这些参数值是否正确外,还能够尝试修改这些值。全部的修改均可以实时反应到中间的实时预览区域。
若是你的设备越狱了,那么还能够用Reveal来”调试“其它应用界面,何时会有这种奇怪的需求呢?——当咱们想学习别人是如何实现界面效果的时候。iOS设备的目录/Library/MobileSubstrate/DynamicLibraries 下存放着全部在系统启动时就须要加载的动态连接库,因此咱们只须要将Reveal的动态连接库上传到该目录便可。
对于越狱的设备,咱们能够在安装OpenSSH以后,用scp来上传该文件。具体步骤以下:
将libReveal.dylib 上传到 /Library/MobileSubstrate/DynamicLibraries 若是libReveal.dylib没有执行权限,用chmod +x libReveal.dylib命令,给其增长执行权限 执行 killall SpringBoard 重启桌面