Tag: 调试

将出色的日志带到您的iOS应用中📝

随着iOS SDK的每次迭代,应用程序变得越来越复杂。 几年前,标准应用程序只需要处理网络呼叫,也许还可以处理一些GPS或加速度计数据。 现在,它有望处理生物特征认证,增强现实,多种类型和大小的设备,并且清单还在继续。 在这种复杂的情况下,同样会出现复杂的问题,并且很难理解和调试。 因此,对于开发人员而言,提供尽可能多的日志记录信息变得至关重要,因为当出现问题时,这些日志将提供宝贵的帮助。 如果您仍在使用print()函数将消息记录到控制台,那么您会感到很惊讶:自iOS 10起,只有在将调试器附加到应用程序后,您的日志才可用。 如果您生成AdHoc或InHouse版本,并尝试使用Xcode的“设备”面板或macOS应用程序“控制台”查看日志,那么将找不到它们。 这是iOS 10引入了一组新的日志记录API的结果。 好消息是,这个新的API允许对日志进行更精确的控制,同时采用起来也相当简单。 首先,让我们看一下使用新API的等效print(“Hello World!”) : 很棒的是,在消息之前已添加了一个类别标签,这使得对特定消息进行过滤非常容易: 现在,假设您已经进行了一些AdHoc或InHouse构建以进行质量检查,并且您需要从中检索应用程序的日志,以便了解造成此问题的原因。 当您打开Console.app并开始与您的应用进行交互时,您会看到日志确实存在,但是它们却在非常密集的信息流中丢失了: 为了隔离它们,我们可以基于应用程序的名称来设置过滤器: 更进一步,可以为类别定义过滤器: 本文旨在对新的日志记录API进行介绍。 我已经介绍了最有可能为任何应用带来价值的功能,但是还有更多可用的功能,因此,我仅敦促您查看Apple提供的用于学习所有高级用例的资源: API的文档:https://developer.apple.com/documentation/os/logging 来自2016 WWDC的视频:https://developer.apple.com/videos/play/wwdc2016/721/ 演示项目:https://developer.apple.com/library/content/samplecode/Logging/Introduction/Intro.html 最初发布在 gist.github.com上 。

iOS Huddle#2

2016年10月26日星期三 iOS Huddle是我们每月在Black Pixel iOS团队的Slack频道中共享的最佳链接的摘要。 从BPXL Craft 如果您错过了它,这是BPXL Craft最近以iOS为中心的系列: iOS上的事件交付:第1部分,第2部分和第3部分 布兰登·亚历山大(Brandon Alexander)完善了活动交付方面的出色系列。 第1部分介绍了触摸事件,命中测试和手势识别器。 第2部分完成了UIResponder中定义的其余事件, 而第3部分则说明目标动作模式。 从水冷却器周围 调试魔术 有时,要找出错误的根本原因可能确实具有挑战性。 幸运的是,我们发现了一些隐藏的宝石,这些宝石可以简化此过程。 Apple提供了有关iOS和macOS的“秘密”调试的技术说明。 只需确保不要使用以下任何一种方法来发布您的应用,因为它们可能会被拒绝。 最近,Shaps出现了很多有用的推文。 使用私有API _viewControllerForAncestor爬上超级视图层次结构以查找父视图控制器。 还要了解如何转储打印功能以美化控制台输出。 可摘枚举 将可保存的选项列表映射到表或选择器视图是一件很麻烦的事情。 为什么不引导您的内部Tom Sawyer并让PickableEnum协议扩展代替您呢? iOS 9中的NSNotificationCenter更改 在对NSNotificationCenter的一个可喜的变化中,基于非块的观察者现在将弱引用归零,因此无需注销它们。 阅读有关这些更改以及调试通知的其他提示。 (要获得加分,请深入研究Mike Ash的记忆,以详细说明为何将弱引用归零很重要。) 先进的Swift运算符 鉴于Swift偏爱安全性,它的算术运算符默认情况下不会溢出,而是会引发错误,这也就不足为奇了。 我们发现Swift有第二套算术运算符,在极少数情况下需要此功能时,它们会溢出。 在Swift文档的Advanced Operators部分中获取详细信息。 应用启动时间慢 用户可能是善变的,而启动缓慢的应用是许多人的祸根。 速度慢的应用也可能会被“应用评论”拒绝。 使用DYLD_PRINT_STATISTICS环境变量可以获取有关加载,绑定,设置和初始化所花费的时间的非常详细的数据。 绘制细线 当视网膜显示器发布时,iOS开发人员和设计师不得不开始不同的想法。 从设计转到代码可能导致意外行为,因为系统将从点转换为像素。 了解如何在设计需要时调整Core Graphics以绘制细线。 一个真正的从不学习C的程序员 对于许多Objective-C开发人员而言,学习C是通过的权利。 威尔·希普利(Wil Shipley)分享了一个有趣的故事,讲述了一个真正的从未学习过C的程序员。 恢复到tvOS 由于焦点引擎的工作方式,为tvOS进行开发需要转变思维。 […]

使用DBDebugToolkit调试iOS应用

“从CI获得的构建数量让我们有点不知所措。 我们安装了很多版本,过了一会儿我们不太确定我们当前在设备上安装了哪个版本。 您可以在应用程序中的某个位置添加版本并生成编号吗?” 我将永远记得在nomtek的那一刻,我们的一名测试员告诉我这个问题。 那是一个大项目的开始,所以我知道迅速解决它会在将来对他们有很大帮助。 当然,这没什么大不了的,有很多方法可以实现:咨询设计师后,可以将其添加到一个屏幕中,将其添加到“设置捆绑包”甚至是应用程序图标中。 暂时,我们将其添加到了应用主屏幕上的标签之一。 但是,在此之前,我问了一个使一切与众不同的问题:“ Android团队的朋友如何解决这个问题?”。 事实证明,他们使用的库使他们可以轻松访问许多调试工具。 您只需在屏幕上向左滑动即可显示菜单。 我真的很喜欢这个主意。 我立即开始搜索现有的库,这将有助于在iOS上实现类似的功能。 令我惊讶的是,我找不到任何类似的东西。 我一直对开放源码着迷。 当时我正在等待一个值得花些空闲时间来思考的想法,所以我很兴奋并且有动力开始在自己的图书馆工作。 当我回到家时,我打开了一个空文档,并开始写下我想在那里看到的所有功能。 在许多漫长的夜晚之后,我发布了DBDebugToolkit的第一个版本。 我的目标是提供尽可能多的有用功能,同时保持安装过程的顺利。 本文将研究DBDebugToolkit可以帮助您解决的iOS开发中常见的三个常见问题。 使用服务器 如今,绝大多数应用程序都依赖于服务器提供的数据。 通常情况下,核心业务逻辑是远程执行的,但有时在测试中可以忽略它,部分原因是后端API调用的异步特性。 此外,如果服务器端与您的应用程序同时开发,则应为一些初始问题做好准备。 DBDebugToolkit提供了您的应用程序执行的所有HTTP请求的列表,甚至包括尚未收到响应的HTTP请求。 如果响应中包含图像,则可以看到持续时间,HTTP代码甚至是缩略图。 还可以过滤列表以仅包含URL中具有指定子字符串的请求。 每个请求都可以进行彻底检查。 您可以看到所有HTTP标头和主体详细信息。 正文详细信息屏幕支持文本和图像。 如果请求以错误结尾,您还将看到所有详细信息。 作为经常使用DBDebugToolkit的人,我认为请求列表是最有用的功能之一。 它使我更仔细地了解了应用程序中至关重要但又隐藏的部分,节省了检查后端API文档所需的时间,甚至还帮助发现了琐碎的问题,例如两次发送请求。 有很多工具可以向您显示应用程序发送的请求,例如Charles Proxy。 使用DBDebugToolkit进行网络调试的独特之处在于始终启用它。 当您最终重现您担心的错误并意识到即使没有连接调试器或未启用代理时,也已经为您记录了所有请求,您一定会感激不尽。 此外,一旦从服务器获取数据,DBDebugToolkit可以帮助您验证数据到底发生了什么。 它允许您浏览文件,钥匙串, UserDefaults ,Cookie甚至是Core Data。 验证布局 我将永远记住的与DBDebugToolkit有关的另一种情况是我们的设计师Michał问我是否可以帮助他使用我的库时。 设计评审通常是开发过程的一部分,尤其是在您追求像素完美的时候。 但是,在iOS上进行操作比在Android上麻烦得多,在Android上,您可以使用单独的应用在应用顶部绘制网格并查看是否正确对齐。 iOS上的沙箱无法实现。 相反,可以使用DBDebugToolkit将负责绘制网格的代码注入到您的应用程序中。 我必须承认,我感到as愧的是,起初我只是在考虑开发人员和测试人员,而没有意识到iOS环境对设计师也很苛刻。 感谢Michał在(沙)盒子外面思考! DBDebugToolkit允许您在应用程序顶部绘制高度可定制的网格覆盖。 您可以指定覆盖图的大小,不透明度和颜色,以适合应用程序的边距和配色方案。 网格覆盖将在应用程序的开发和设计审查期间为您提供很多帮助。 它背后的故事是我最喜欢的开源方面之一的完美示例-它根据用户的需求而发展。 除了网格覆盖之外,DBDebugToolkit中还包含一项附加功能,在设计审查期间可能会有所帮助。 […]

使用播放/暂停应用程序跳舞,让您的生活更轻松…

DispatchSource使调试变得容易,在运行时分析视图更改,对象状态更改。 在这里,我将描述一种随时随地(运行时)更改对象状态的方法。 我们可以使用断点从调试器更改对象状态。 但是,断点仅在应用于要执行的代码时才能停止执行。 但是,如果我们必须随时随地进行此操作,那么我们就不能依赖于自定义代码的断点。 解决此问题的方法之一就是使用DispatchSourceSignal 我们大多数人都知道DispatchQueue,Qos类,使用DispatchGroup等。 但是我们并不十分了解DispatchSource提供的api和功能。 从Apple Doc: DispatchSource提供了一个接口,用于监视低级系统对象(例如Mach端口,Unix描述符,Unix信号和VFS节点)的活动,并在发生此类活动时提交事件处理程序以分派队列以进行异步处理。 因此,让我们看一下这种信号监视如何使我们能够随时随地更改对象状态,这在调试过程中会非常方便。 该信号应在应用程序的调试模式下使用,以阻止您的应用程序在生产环境中的洞察力,并保护您的应用程序免受攻击者的侵害。 该代码将很快,所以我假设所有人都知道迅速的基本语法,尽管ObjectiveC中也提供了相同的api,所以让我知道是否需要知道。 让我们添加一个全局属性声明以在传递的对象上启动信令。 对于我的用例。 我在类声明上方添加此属性。 通过viewDidLoad设置信号,如下所示: _ = setupSignalHandlerFor(自己) 方法说明逐步 如前所述,我们将仅在调试模式下进行此设置。 我们声明一个可选的源信号参数。 启动信号以监视主队列上的SIGSTOP Unix信号。 当收到信号时会添加事件处理程序。 源以挂起状态开始,因此可以通过调用resume来启动 现在,我们为Unix Signal设置了信令,可以用来更改对象状态,正确.. 您是否在问同样的问题,如何用于更新对象状态? 让我们解开谜团 现在,以调试模式运行您的应用,并设置信号发送。 使用此处提供的控件暂停应用,然后再次播放。 再次播放它将击中您的信号,并且您的日志语句将被打印。 现在,如果将断点放在打印语句上,则可以通过暂停和播放来拦截应用程序中任何位置的执行。 现在看看我如何用它来更改对象状态。 在调试器中编写: 宝物 将打印“ ”” 因此,这意味着对象是我们的控制器实例,并且其属性可以更改。 例如,切换按钮的隐藏状态。 expr object.searchButton.isHidden = false Xcode调试器有时可能无法直接对对象实例进行更改。 在这种情况下,我们必须声明一个指向对象的调试变量,如下所示: expr let $ vc = unsafeBitCast(0x7fb43d40fbf0,to:YourModule.ControllerName.self) […]

WWDC 2018 —使用Xcode和LLDB进行高级调试— 412

简介:我们应该避免在进行每个修复后重新运行代码,并继续进行调试。 今天我们将讨论以下几点: 更改/注入代码 打印汇编代码值 通过lldb命令添加符号断点 跳过代码行 自定义调试说明 观察点 在目标C模式下运行命令 创建命令别名 在LLDB中使用python脚本 从调试器更新动画 约束调试 更改/注入代码 要在断点处编辑值,请使用以下lldb命令 表达式variable_name =值 您还可以配置断点以自动完成此操作。 单击断点>编辑断点 注入代码:假设您忘记设置委托,现在不用重新运行,而使用相同的表达式来注入并继续调试。 打印汇编代码值 假设您已经为UIlabel setText方法设置了符号断点 现在,当遇到断点时,如何在汇编代码中看到调试点时如何打印值 在这一点上尝试这些命令并观察值 po $ arg1 po(SEL)$ arg2 po $ arg3 通过lldb命令添加符号断点 假设我们要在另一个断点被击中后激活一个符号断点。 然后,我们可以使用以下调试器命令创建一个断点。 断点集-一键式true –name“-[UILabel setText:]” 跳过代码行 为要跳过的行设置一个断点,然后只需将包含两行的按钮拖动到下一行即可。 我们想在每次点击时跳过此行,让我们为其配置断点 跳线-1 自定义调试说明 对于自定义类,我们可以实现此协议以在LLDB中获取描述 观察点 监视点就像一个断点,每次更改属性时都会暂停。 可以使用调试器的变量部分中的上下文菜单进行设置。 在目标C模式下运行命令 有一些客观的C库,您想以ObjC方式发送命令或发送命令,而无需进行swift的严格类型检查。 为此,您可以使用下面的expression命令 表达式-l objc -o-[`self.view` recursiveDescription] […]

配置Charles para iOS和MacOS。

布宜诺斯艾利斯! 西班牙语的内部翻译是由内部的查尔斯·帕拉·德普拉尔·德·马纳拉·阿瓦扎达·拉斯·皮蒂科内斯撰写的,是由操作系统,模拟iOS或分布式软件,iOS或简单的应用程序查询的。米内特拉-埃斯塔莫斯实用车队 MacOS High Sierra 10.13.4,XCode 9.3和Charles 4.2.1 vergo de Pago的附加说明。 本地HHTP,HTTPS,HTTP / 2和活动TCP的Charles es的应用程序。 可以在JSON上使用通用的调试工具,在JSON上使用类似的JSON,在JSON上可以使用类似的JSON格式,在使用JSON时可以使用SAR。 您可以通过一些有趣的事情来使用自己的音乐。 可以在Mac OS上以一种典型的通用配置来激活Charles capcapar。 整个程序在查尔斯Para descargar的网页上都可以看到。 笛卡尔·查尔斯 Una vez descargado lo instalaremosyacontinaciónlo abriremos。 查尔斯·埃斯塔截获的红十字会的通知书。 SSL证书和证书的证明书,请在电子邮件中注明。 无法确定SSL证书的情况:Las siglas SSL响应一个安全套接字层(Secure Socket Layer)的问题,请使用安全协议进行加密,以确保安全。 ,您使用服务网站的传输,复制和更新代码。 不适用证书的SSL证书,需对证书进行必要的修改。 获取信息的证书不存在,请通过以下方式获取信息:证书,证书和密码。 设置和配置中的信任的信任关系将由abaáa irir una nuevapestañaen la que deberemos selecciona信任。 可以同时在iOS和EAS上运行的证书安装程序,也可以在DES上激活。 在SSL模拟器中安装SSL证书,在pulse sobre帮助中使用SSL代理,在iOS模拟器中安装Charles Root证书。 在Mac OS和iOS上非常活跃的用户可以轻松地在Charles的单人活动中进行激活,并在Mac OS上的活动被激活,而在Mac OS上运行的所有工具都无法使用macOS代理服务器。 […]

调试iOS-给初学者的小技巧

错误在每个人的生活中都是正常的。 但是,如果您是一名开发人员,那么它是日常生活,每小时生活的一部分。 当我开始编程时,我完全不顾为我们的工作提供的一些更重要的工具。 我的意思是:遇到了PHP错误? 让我们逐行阅读代码,直到弄清楚到底出现了什么不良值。 然后向我介绍了Codebug,尽管我很难弄清楚如何入门,但它开始成为我的开发环境的一部分。 好了,然后我决定再次练习iOS,这种新闻习惯使我意识到XCode调试器的功能多么强大。 如果您完全不熟悉,请给它一个机会! 转到代码的某一行,并通过单击左侧装订线设置断点。 这将创建一个蓝色标记,如下所示: 现在,还记得人们何时告诉您打印变量以发现其值吗? 这就是本文的重点。 您可以使用de LLDB(代表低级调试器)来简化此值! 只需在变量前输入“ po” , Code Sense将会帮助您: 选择一个变量,然后: 另外,请确保在底部选择正确的选项: 希望这可以为您节省大量时间,因为运行和仅捕获某些值的iOS可能需要几分钟。 干杯!

Mockear和JSON的修改版本。

Hoy vamos voy a exploiar al que que me me resulta muyútilen midíaadíaen el trabajo y que nos ahorra mucho tiempo cuando estamos desarrollando。 网络服务和网络应用服务,从JSON到网络的任何形式的更改,都可以通过应用程序获取。 整个教程的学习过程,请在查尔斯·梅阿尤达·恩·迪亚和迪埃斯·迪埃塔皮亚斯进行。 MacOS High Sierra 10.13.4,XCode 9.3和Charles 4.2.1 vergo de pago。 Vamos是必需的,可以在Charles en un Ordenador上安装,配置在任何前面的面板上,也可以在查验后的位置上使用。 西娅·蒂内斯·埃尔·恩特尔诺·诺瓦莫斯·埃斯帕拉·马斯·瓦莫斯·达琳·卡尼亚! 初级访问者查尔斯和本地化终端响应者间拦截器对模型的修改。 Pulsamosbotónderecho sobre la URL deseada y en laúltimaopciónde la ventana紧急情况查尔斯no aparece 地图本地 esto es […]

Xcode中的酷调试功能

当我刚开始学习iOS时,我曾经用打印语句填充代码,以查看代码执行各个部分的情况,但是它变得凌乱不堪,执行速度变慢,以后清理起来很痛苦。 有更好的方法。 断点 您经常会在StackOverflow上看到在代码的特定位置“在其中插入断点并查看发生了什么”的帖子。 断点不仅对停止执行以了解lldb中变量的作用很有用。 您可以右键单击它们并做一些非常有用的事情。 我要核对该打印声明,因为稍后将要清理它。 相反,我将添加一个断点并将其配置为通过右键单击它来打印出所需的信息。 接下来,我们将配置断点以将我想要的信息记录到控制台。 从那里,我只输入count = @ count @ (变量用@字符包围)并选中“评估动作后自动继续”,它将打印到控制台,如下所示: 完成后,您无需删除断点。 您只需点击它即可启用/禁用。 您还可以对它们执行其他操作,例如添加lldb命令等。我将留给您自己修改。

iOS开发人员的Charles技巧和窍门:简介

注意:本文的几乎所有内容都适用于iOS,Android,Web或您使用的任何技术平台。 几年前,作为iOS Developer,如果遇到与某些奇怪的网络请求/响应有关的错误,我会陷入困境。 说实话。 Xcode中没有合适的工具来可视化或调试网络调用,因此我过去常常通过在各处添加断点,在各处进行硬编码和打印响应来对其进行调试,并最终找到错误后,我开始回滚我在我所做的所有这些讨厌的更改网络层。 我曾经认为,如果像我以前使用Chrome Dev Tools时(我以前是一名Web开发人员)那样,已经有了一种可视化网络请求的简单方法,就可以避免所有这些麻烦。 多亏了飞扬的意大利面条怪物,一些同事向我介绍了Charles Proxy,它是一款超赞的工具,可让我的应用程序中的所有网络活动都成为“黑魔法”,因此我将其纳入了我的日常堆叠工具。 这篇文章是我日常使用的最有用的Charles功能的简单汇编。 我希望这可以帮助某人摆脱网络调试的麻烦。 查尔斯是什么,为什么如此神奇? ✨ Charles Proxy是一个Java程序,它充当您的应用程序与Internet之间的中间人,侦听所有网络请求和响应,使您可以可视化和操纵响应/请求数据,从而使用某些特定响应mock模拟您的应用程序。 作为世界上所有美好的事物,Charles Proxy并非免费free。 但是您可以获得30天的试用期。 试用结束后,Charles在关机前只会运行30分钟,因此您可以重新启动它,然后再等待30分钟或付款。 我真的建议您说服您的团队购买或自己获得许可证。 安装 查尔斯准备好了,这只是个小孩子,只需下载最新版本即可 。 Charles支持macOS,Windows和Linux。 在本文中,我仅介绍了macOS的安装,但对于Windows或Linux,应该类似。 下载完成后,双击.dmg文件并将Charles图标拖到Applications文件夹中,然后启动它。 第一次,Charles会请求权限来配置网络设置并检查与您的计算机之间的所有网络事件。 只需Grant Privileges和Charles,它就快准备好了。 此时,Charles可以记录您的计算机发出的任何请求,但无权查看HTTPS下安全通信的内容。 请记住,HTTPS加密并保护我们的敏感数据不受代理服务器和其他中间件的侵害。 但是在这种情况下,我们希望Charles监听我们的消息,因此我们需要配置一些SSL证书。 设置模拟器的SSL证书 首先,退出您的iOS模拟器。 启动Charles并转到帮助>选择SSL代理>在iOS Simulators中安装Charles Root证书 。 当您再次启动时,iOS Simulator将安装在所有模拟器中。 在设备中设置SSL证书并连接到Charles 这有点棘手: 转到“ 代理”>“代理设置” ,选择一个端口,启用“ 透明HTTP代理” ,然后按“ 确定” 。 转到“ 帮助”>“ SSL代理”>“在移动设备或远程浏览器上安装Charles Root证书” ,选择此选项,将显示如下所示的弹出窗口,并带有您在上一步中选择的本地IP和端口。 […]