开发过程中通过command +R的启动的APP,我们都可以用打断点的方法调试,但是有时候我们运行app的方式并非command+R的方式的。
这样的情景大致可以分为
1)通过点击通知打开APP (包括远程通知和本地通知)
2)通过URL 打开APP (配置URL scheme , 从外部打开APP)
如果接受到上面情景打开使用app的时候,备注:(如果你的APP 未完全退出,处于后台挂起状态,那么你在Xcode中的断点也会触发,从而进行调试)。
但是如果你的app已经完全退出,这时候你的Xcode和APP看似已经完全失去链接。这时候你通过以上两种方式打开APP你的XCode左上角的方标是灰色的,
在Xcode中的断点也就没了响应。
这种情况下的调试我们应该如何进行,别着急Xcode早就为我们想好了,而且步骤也非常简单。
你还是如往常一样把测试机和Xcode链接起来,然后找到Xcode功能栏,Product->Scheme->Edit Scheme ,在出来的页面中选中Run选项,将 Launch 默认的 Automatically 换成Wait for executable to be launched (也就是将Run的 Launch模式 从自动变成 等待开始可执行方式 ) 。
这时候你再运行程序,你会发现程序并没有启动,而是处于一个等待启动的状态,(这就是我们刚刚设置的那个Launch状态)。
你再以上面的两种方式打开的时候,你就会发现你设置在 didFinishLaunchingWithOptions 里的断点被触发了,这时候你就可以按照自己的需求调试代码了~ bingo!
通常情况下,点击程序启动(command+R)启动程序,在didFinishLaunchingWithOptions的launchOptions是nil,其他方式打开的时候launchOptions是有值的。不为空时,要根据相应的key是否存在来判断是通过哪种方式启动的。
系统里给launchOptions的一些key 值 我就不全部粘贴了,有兴趣的可以自己去UIApplication的声明文件里自己去看,这里就简单说下常用的判断方法.
/用户自己点击启动
if(!launchOptions) {
NSLog(@"用户点击app启动");
} else {
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey]; //app 通过urlscheme启动
if (url) {
NSLog(@"app 通过urlscheme启动 url = %@",url);
}
UILocalNotification *localNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
//通过本地通知启动
if(localNotification) {
NSLog(@"app 通过本地通知启动 localNotification = %@",localNotification);
}
NSDictionary *remoteCotificationDic = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
//远程通知启动
if(remoteCotificationDic) {
NSLog(@"app 通过远程推送通知启动 remoteCotificationDic = %@",remoteCotificationDic);
}
}
好的,就说这么多~
解决我的问题,也希望可以解决你的问题并给我一个大大的喜欢,如有不对,欢迎指正...
end!