Reveal 是 iOS 开发工具中的神器之一,它能够在应用程序运行过程中调试应用程序界面。 通过 Reveal 我们可以连接到应用程序,并允许开发者编辑各种用户界面参数,结果会马上在用户界面上呈现。就像 web 开发人员用浏览器提供的开发人员工具调试页面一样,Reveal 允许开发者在不修改代码、不重新构建项目、不重新部署应用程序的情况下就能够调试 iOS 应用的用户界面。
Reveal 下载地址:
集成 Reveal 无需添加任何代码,无需引入任何头文件。库将会在应用启动时自动加载,并在您的应用内部启动必要的 Reveal 服务。
将 Reveal 的静态库文件连接入应用,是最简单快捷地启用 Reveal 检视的方式。
警告: 不要将 Reveal 库文件随着正式应用一起发布。 下面的步骤将会展示如何通过构建配置,而把 Reveal 静态库文件,仅连接到调试构建的流程中。
- FRAMEWORK_SEARCH_PATHS = $(inherited)"$(SYSTEM_APPS_DIR)/Reveal.app/Contents/SharedSupport/iOS-Libraries"
动态加载允许 iOS 应用在运行时,可以按需地加载第三方库。采用这种方式,库文件无需连接入应用的可执行文件,而是被加入到了应用 Bundle 中去,从而在运行时能按需加载。这种方式使得开发者可以在个人应用中,完全自由地控制 Reveal 库的加载,以及其服务的启动与停止。
将 Reveal 加入您的 Xcode 工程,使得您团队中的其他成员无需任何额外的配置,就可以使用 Reveal。
警告: 永远不要将包含 Reveal 动态库文件的应用正式发布。Apple 不允许将含有动态加载库文件的 iOS 应用发布到 Apple 商店中。
- set - e
- if [ - n "${CODE_SIGN_IDENTITY}"];
- then codesign - fs "${CODE_SIGN_IDENTITY}""${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/libReveal.dylib"fi
Objective-C:
- // 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。
Objective-C:
- 1.func applicationDidBecomeActive: (application: UIApplication) {
- self.loadReveal()
- }
- (void) applicationDidBecomeActive: (UIApplication * ) application { [self loadReveal];
- }
提示: 在如果您不希望如上述步骤自动启动 Reveal 服务,也可以以手动的方式来启动,例如通过一个 Debug 按钮。在应用启动后,自己调用 loadReveal 方法,然后再分发一个名为 IBARevealRequestStart 的 NSNotification:方法返回之前加载库的一个好处是,将会让 Reveal 服务在应用启动的同时也自动启动。
- -[UIApplicationDelegate applicationDidBecomeActive:]
Objective-C:
- func startReveal() {
- NSNotificationCenter.defaultCenter().postNotificationName("IBARevealRequestStart", object: nil)
- }
- - (void) startReveal { [[NSNotificationCenter defaultCenter] postNotificationName: @"IBARevealRequestStart"object: nil];
- }
CocoaPods 是一款针对 iOS 与 OSX 项目的依赖管理系统。它大大简化了以往 Xcode 工程里,对第三方库的依赖管理与配置工作。
CocoaPods 提供了 Podspec 用于将 Reveal 集成入您的项目。
警告: 不要将连接了 Reveal 库文件的应用用于正式发布。下面的指南描述了一种使用构建配置来使 Reveal 静态库文件仅在调试构建中连接的方式。
此说明要求您在之前已经在项目中配置好了 CocoaPods,若不然,请先行配置 Cocoapods。
- pod 'Reveal-iOS-SDK',
- :configurations = >['Debug']
根据您实际所选择的 Reveal 集成方式,请根据下述相关步骤来移除 Reveal。
一旦库文件成功的移除后,下面的内容将不再会在您的应用启动时出现在 Xcode 控制台:
INFO: Reveal Server started (Protocol Version X).
方法从您的代码中删除。
- loadReveal / startReveal
- pod 'Reveal-iOS-SDK',
- :configurations = >['Debug']
上图是 Reveal 的运行界面,其界面主要分成 3 部分:
如果你的设备越狱了,那么还可以用 Reveal 来 "调试" 其它应用界面,什么时候会有这种奇怪的需求呢?——当我们想学习别人是如何实现界面效果的时候。iOS 设备的目录 / Library/MobileSubstrate/DynamicLibraries 下存放着所有在系统启动时就需要加载的动态链接库,所以我们只需要将 Reveal 的动态链接库上传到该目录即可。
对于越狱的设备,我们可以在安装 OpenSSH 之后,用 scp 来上传该文件。具体步骤如下:
将 libReveal.dylib 上传到 /Library/MobileSubstrate/DynamicLibraries
如果 libReveal.dylib 没有执行权限,用 chmod +x libReveal.dylib 命令,给其增加执行权限
执行 killall SpringBoard 重启桌面
来源: http://lib.csdn.net/article/swift/44258