iOS调试通过UILocalNotification或RemoteNotification启动的app

相信很多同学都为调试苹果的通知烦恼过,特别是通过通知启动app这个功能,简直让人欲哭无泪!!!

然而我们都遇到的问题,苹果怎么可能没有想到,原来早就有了官方的解决办法,只是我们不知道而已。。。

这次又是从stackOverFlow上找到了答案,必须记录一下!!!

iOS10以后,通知框架被完全重构了,可以参考喵神的博客:https://onevcat.com/2016/08/notification/

这里因为要兼容iOS8,所以先说说iOS10之前的处理方法

UILocalNotification和APNS怎么发就不说了,首先先说一下苹果的通知响应;

只要用户开启了通知权限,那么app就可以收到通知,收到的场景分两种:

一种是app还没有启动,那这时候系统会根据通知的权限设置有弹窗,声音,标记等出现,这时候点击弹窗,app就会启动,

并且启动的时候,在方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions里的launchOptions字典中,就会包含通知的内容,可以通过UIApplicationLaunchOptionsLocalNotificationKey或者UIApplicationLaunchOptionsRemoteNotificationKey来获取其中的内容;

其中,通过UIApplicationLaunchOptionsLocalNotificationKey取到的是一个UILocalNotification,

而通过UIApplicationLaunchOptionsRemoteNotificationKey取到的是remoteNotification的userInfo;

需要在这里进行处理

注意,这时候app还没有启动完成,所以跳转页面什么的是做不了的,倒是可以根据这个来设置rootViewController;或者在这里设置一个标记,在rootViewController didAppear之后执行

注意,这个场景iOS10也是一样的,获取到的数据类型也一样!

另一种是app已经启动,这时候又要区分app是否在前台

如果在前台,那系统会直接调用

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;

或者
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;

两个方法

如果不在前台,那系统还是会根据权限设置出现弹窗,声音,标记等,这时候点击标记,才会调用上面的这两个方法

注意:这个场景iOS10以后又了新的方法,处理方法跟这两个不一样,请参考喵神博客!

好,切入正题

我们在调试的时候,肯定是连着手机断点调试最方便,但是对于通过通知启动的这种场景,怎么调试???

有问到过可以通过xcode的device查看手机log来看,但这种也没有直接断点来的方便呐!

问题就是:可以在启动之前就直接断点吗???

答案是:可以!!!

这个东西既然是苹果设计的,苹果当然就想到了这个问题,也给出了解决方案:

在xcode的工具条上选择 product—Scheme—edit scheme 到编辑scheme界面

左侧选择选择Run,右侧选择info,然后在下面的launch选项上选择:Wait for executable to be launched ;如图

然后close,跟原来一样run 就可以了

这时候你会发现,app并没有启动,而是“卡”在了那里,

如果你在didLaunch方法里打个断点,然后点击通知启动app,就能直接断点到didLaunch方法里了~~然后想怎么调试都随你了~~

大功告成~~

可以参考:http://stackoverflow.com/questions/1239000/debugging-app-when-launched-by-push-notification

时间: 2024-10-12 19:08:40

iOS调试通过UILocalNotification或RemoteNotification启动的app的相关文章

使用Fiddler搭建Asp.net webapi与Android/IOS调试环境

最近在自己在做Android+Asp.net WebApi的练习,发现用visual studio debug模式启动Asp.net之后,没法响应Android发送过来的http请求,设置好的断点没有起作用,google很久发现下面两个解决方案 http://www.codefromjames.com/wordpress/?p=97#comment-18526 http://encosia.com/using-an-iphone-with-the-visual-studio-developmen

iOS调试奇巧淫技(一)

你以为,你以为的就是你以为的吗? 你以为你代码写的很OK啦? 你以为你的是大牛啦? 你以为的就是你以为的吗? 你的代码经得起考验吗?(PS:爱经得起考验吗) iOS调试的技巧很多,通过调试我们不仅可以迅速找到Bug的所在,更能优化代码,让你的你以为不再是你以为! 一.断点 普通断点 当运行时遇到断点会停止下来供程序员调试 我们清晰的看到此时的i依旧等于0,该函数在一个名为ViewController中 上图中有五个可选按钮 分别是取消断点按钮.继续执行一步按钮.步入按钮.步出按钮 条件断点 点击

IOS 本地通知UILocalNotification

//发送通知    UILocalNotification *notification=[[UILocalNotification alloc] init];       if (notification!=nil) {         NSDate *now=[NSDate new];         notification.fireDate=[now dateByAddingTimeInterval:10];//10秒后通知        notification.repeatInterv

iOS调试

iOS高效调试 写代码难免出现bug.储备些调试技能绝对能够提高你的工作效率,让bug无所遁形.下面就和大家分享一些我在工作中常用的iOS调试小技能. 1. 打印 最简单,基础的调试方法就是打印日志了.贴出封装好的日志打印代码: #ifdef DEBUG #define DLog(fmt, ...) NSLog((@"<%s : %d> %s  " fmt), [[[NSString stringWithUTF8String:__FILE__] lastPathCompon

iOS调试-LLDB

LLDB是LLVM下的调试器.Xcode从4.0开始编译器开始改用LLVM,相应的调试器也从gdb改为LLDB.而从 Xcode5.0开始所有工程也被自动设置为使用LLDB. 记录一些LLDB中常用的命令,举个简单的例子,这段代码在运行的时候程序会崩溃 1.查看地址的信息,可以找出出错代码的行数,怀疑是0x00001b91这个内存地址发生错误 image lookup --address 0x00001b91 2.输出视图的继承关系 po [[self view] recursiveDescri

iOS SDK:iOS调试的技巧

iOS SDK:iOS调试的技巧 为什么你的数组包含3个项目而不是5个?为什么你的游戏运行缓慢?这些都跟调试有关,调试是开发过程中必不可少的一部分.本文所列举了一些重要的调试功能(当然并不全面)可以帮你用更少的时间来解决bug问题. 本文内容主要包括3个方面: 使用console检查app状态 进行日志记录,并熟练的驾驭NSLog 使用对象的生命周期来跟踪内存的使用. 使用Console检查app状态 Xcode底部的小黑盒是我们调试时的好朋友,它可以输出日志信息.错误信息以及其他有用的东西来帮

提高Android和iOS调试编译速度

如果您使用Delphi开发App,就会遇到:Android和iOS的编译实现是太慢了,尤其是debug.这个小技巧使得编译Debug能快不少. 可能你已经知道了这个方法,如果这样设置,那一定为之开心. 您认为Release版本比Debug版本编译需要更长时间,因为它必须执行一堆代码优化阶段,告诉你,实际情况与此相反,在Debug模式下构建适用于iOS或Android的我的应用程序大概需要7.5 分钟,在Release模式下构建相同的应用程序不到1分钟.(当然,与建立相同的Windows应用程序相

Windows服务调试状态下用Console启动

最近一直在用服务,发现服务也没有那么难调试. Windows服务调试状态下用Console启动:步骤分两步 第一步改Program,启动代码 static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> static void Main(string[] args) { if (Environment.UserInteractive) { //交互模式下执行 var test = new MyChatServi

【原】ios打包ipa的两种实用方法(.app转.ipa)

总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏->Product->Archive->三选一,一般选后两个. 局限性:个人开发一般采用这种方法,但是当一个证书多人使用时就稍显麻烦.一般多人开发时都是采用provisioning profile+P12文件来进行真机调试.上述方法在最后导出ipa包时需要输入appleID,这时还要向团队的其他人要.采用provisioning profile+P12