Reveal的三种安装方法
安装Reveal的三种方式
一、静态链接(最简单快捷地启用Reveal检视的方式)
警告: 不要将Reveal库文件随着正式应用一起发布。 下面的步骤将会展示如何通过构建配置,而把Reveal静态库文件,仅连接到调试构建的流程中。
1、启动Reveal并选择Help → Show Reveal Library in Finder,这将会打开Finder窗口,并显示一个名为iOS-Libraries的文件夹。Show Reveal Library in Finder(图1)
将 Reveal.framework 文件(图2)拖入你的项目中。
图1
图2
屏幕快照 2016-07-26 下午8.56.28.png
2、在下图所显示的Add to targets对话框中,选择所有您希望与Reveal集成的target。可选步骤:选中Copy items if needed,将会把 Reveal.framework 拷贝到工程中——如果您这么做了, 请记住,
当更新Reveal至新版本时,也依照上述步骤再次更新此库文件
。
屏幕快照 2016-07-26 下午8.59.21.png
3、在Xcode的Project Navigator中,选中您的工程,然后将以下步骤应用于所有您希望与Reveal集成的target之上:
1)选择Build Phases标签,如果在Link Binary With Libraries配置项中已有Reveal.framework,请将其移除。
2)选择Build Settings标签,在Other Linker Flags的Debug配置项中加入如下配置:
-ObjC -lz -framework Reveal
屏幕快照 2016-07-26 下午9.03.09.png
4、如果一切正常运行,请切换到Reveal应用,此时您的应用应会出现在应用选择器的下拉列表当中。选中您的应用,确认可以看到此时正在模拟器(或设备)中运行的应用界面截图。
屏幕快照 2016-07-26 下午9.04.21.png
成功链接项目:
屏幕快照 2016-07-26 下午9.04.30.png
TIP:再次运行您的应用,这一次,请选择基于**Release**的scheme。请确认此时,Reveal不再能连接上您的应用。如果应用仍然与Reveal保持连接,请确认 Reveal.framework 没有出现在**Build Phases**标签的**Link Binary With Libraries**配置项中
二、动态链接不添加库(推荐使用)
1、将Reveal加入您的Xcode工程
2、集成Reveal:不修改您的Xcode工程并加载Reveal(仅能运行在模拟器)
此方法的好处:通过不修改Xcode工程文件来加载Reveal的方式,您可以检视任何一个您正在开发的iOS应用,而不需要对这些应用的工程做任何修改。另一个好处就是,您不需要再担心,犯下一不小心将Reveal库连接到应用中发布了的错误。
1)打开您的iOS工程,选择 View → Navigators → Show Breakpoint Navigator。
2)在面板左下角,点击 + 按钮并选择Add Symbolic Breakpoint。
屏幕快照 2016-07-26 下午9.14.26.png3)在 Symbol 输入区内输入 UIApplicationMain(不可有空格)
4)点击 Add Action 按钮, 确认 Action 被设置为 Debugger Command
5)将以下内容拷贝到 Action 的输入区内:
expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0)
注意: 请确认Reveal.app的路径信息符合您Mac的实际位置。位置不正确不能正常使用Reveal。
6)选中 Automatically continue after evaluating actions 选项 屏幕快照 2016-07-26 下午9.14.38.png
7)右击刚才新创建的断点,选择 Move Breakpoint To → User
屏幕快照 2016-07-26 下午9.14.50.png您可以像其他断点一样,禁用或启用此断点。用户级别断点在所有的Xcode工程中都可以使用
8)在iOS模拟器上构建并运行您的应用
如果一切正常运行,请切换到Reveal应用,此时您的应用应会出现在应用选择器的下拉列表当中。选中您的应用,确认可以看到此时正在模拟器中运行的应用界面截图。
三、动态链接添加库
添加Reveal到你的Xcode项目允许你团队中所有的成员不用再配置Reveal就可以使用Reveal。
Warning:永远不要在你的发布版本中集成Reveal动态库。Apple不允许通过在APP store下载的APP含有动态库。
1、代开你Xcode中的iOS或者tvOS项目
2、打开Reveal点击导航栏的Help->Show Reveal Library in Finder选项选择iOS Library
或者tvOS Library
。这回打开一个带有相应的framework的文件管理窗口。
3、将libReveal.dylib(or libReveal-tvOS.dylib for tvOS apps)拖进你的Xcode项目中。
4、在拖入Xcode Library的对话框中,选择所有的targets。这样会确保Xcode在编译的时候不会链接动态库。选项Copy items if needed
是可选的,如果你选择了这一项你需要注意当Reveal更新的时候你要更新这个library。
5、点击finish
6、在Xcode的导航栏中,选择你想使用Reveal的target
- 选择
Copy Bundle Resource
这一项,添加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不应该在编译的时候被链接
2)添加如下的系统框架和库如果它们不存在的话libz.tbd, CFNetwork.framework, QuartzCore.framework, 和 CoreGraphics.framework
7、为了当一个应用运行在模拟器时动态加载这些库,你需要在libReveal.dylib添加一些代码当在程序构建的过程中。
在你的target
Bulid Phases
这一项选择Editor->Add Bulid Phase ->Add Run Script,编辑运行脚本:
屏幕快照 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.在你的项目中寻找一个合适的类添加下面的代码(eg:UIApplicationDelegate
),并且可以根据你的需求更改代码:
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:你应该确保在你的发布版本中不调用这个方法。你要确保仅在调试版本加载libReveal.dylib这个库。
9、你可以 -[UIApplicationDelegate applicationDidBecomeActive:]
方法中调用如下方法来确认这个库以被正确的加载。
Swift:
func applicationDidBecomeActive:(application: UIApplication) {
self.loadReveal()
}
Objective-C:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[self loadReveal];
}
NOTE:在-[UIApplicationDelegate applicationDidBecomeActive:返回值之前加载该库,Reveal 服务将会自动开始启动。
10、如果你不想自动启动Reveal服务在上一步,你想通过调试按钮或者其他的类似按钮。你只需要在app已经启动的时候调用loadReveal
这个方法,然后系统会发出一个IBARevealRequestStart
的通知:
Swift:
func startReveal() {
NSNotificationCenter.defaultCenter().postNotificationName("IBARevealRequestStart", object: nil)
}
Objective-C:
- (void)startReveal
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"IBARevealRequestStart" object:nil];
}
11、在Xcode中构建并运行你的项目,如果一切顺利,你应该可以切换你的iOS项目在Reveal的下拉列表中。选择你的app然后验证看一下是否可以看到和你的模拟器一样的画面。