大多数浏览器和
Developer App 均支持流媒体播放。
-
Xcode Organizer 中的 Triage TestFlight 故障
了解如何通过 Xcode Organizer 更容易、更快速地分类和修复故障。我们将探索如何在发生后立即访问故障信息和 TestFlight 测试程序反馈。同时,我们还将向您展示如何分析故障,检视指标,甚至在您的团队中分享故障信息。关于故障日志的入门信息,我们建议观看 WWDC18 的“了解故障和故障日志”。
资源
相关视频
Tech Talks
WWDC21
WWDC20
WWDC18
-
下载
你好 欢迎来到Xcode Organizer中的 Triaging TestFlight 我是麦特 是位Xcode工程师 今天我要向各位展示 一些内建在Xcode Organizer的新工具 这些工具能帮助你分类 所有app目标 以及如何利用 来自TestFlight的用户反馈 让你能够更快速地修复崩溃
那么我将向你展示 全新的Terminations Organizer 以及我们在MetricKit里的更新
如果你的beta版本app 是使用TestFlight测试的 你会很清楚知道 来自测试员的崩溃反馈 是非常有价值的 当测试员遇到崩溃 然后写了些反馈 你就可以在App Store Connect里 看到那些反馈 并且下载崩溃日志 开始分析发生了什么事情 接着 我将要向你展示 Xcode里的更新 它将会大幅加快这项工作流
首先 我想要快速总览 在Xcode 13之前就已经有的功能
在Crashes Organizer里 我们支持 App Store和TestFlight上的 app的崩溃情况 我们会显示你在我们所有平台上 app的崩溃情况 包含来自你的轻app和app扩展
Crashes Organizer会对你的问题 进行分级 显示最高优先级的崩溃 并显示这些崩溃是如何分布在 不同的设备及OS系统版本 而一旦你开始决定 要修复那个崩溃情况时 你可以直接在你的Xcode项目里开启 所有这些强大的功能 只要登录你的Xcode开发者账户 即可使用 制作一个优秀app的过程 有时可能漫长又坎坷 因为一旦你发布了 客户总会以你意想不到的方式摧毁它 在Xcode 13版本中 我们想要让Crashes Organizer更好 让各位可以继续朝着 没有崩溃情况的目标前进 因此我们肩负重责大任 要几乎实时地传递崩溃日志 提供关于你的崩溃情况 更丰富的数据 而且提供更多背景信息 协助你解决这些难以重现的问题 我非常开心地向各位展示 所有我们在Crashes Organizer里 新增到Xcode 13版本中的 优秀新功能 我将要与你分享 本次的六大项更新 第一 快速传送你的TestFlight崩溃 现在当任何测试人员 让TestFlight架构崩溃 我们会即刻传送那次崩溃 到Organizer 这个快速的崩溃传送 让你能够查看 从前一天开始的 所有TestFlight崩溃情况 而且会有张图表 以每小时的方式显示 选定的崩溃什么时候发生 在Xcode 13版本里 有一年份的崩溃历史纪录 供你使用
你现在可以依照时间过滤器 查看所有发生在去年的 崩溃情况 因为我们现在可以向你展示 一年份的崩溃情况 你将在Inspector的图表区中 看到一个时间分布表 向你显示每月发生崩溃情况的发生率 我们想要提供更多的工具 好让你了解app的所有健康程度 所以今年 我们在Crashes Organizer 新增了更多的过滤器 让你更能集中处理app的特定部分
这个Organizer现在还可以按照 所有版本和架构过滤崩溃列表 或深入到任何单独的过往版本 你也可以依照任何 随着app一起发送的 扩展程序过滤 像是你的watch app 轻app或分享扩展 甚至可以检查 你的iOS app在那些强大的 Apple Silicon Macs上的运行表现 对你的app问题进行分诊的其中一步 是要对哪些人受到特定的崩溃影响 以及该崩溃分布在不同的类别中 进行全面性的了解
所以我们今年新增了一个功能 能查看特定的崩溃 是如何在你的app版本 以及TestFlight和App Store中分布的 你们可能是以单打独斗、大型团队 或这两者之间的任何形式 发布过一些厉害的app 在Xcode 13版本中 我们引入了一种全新的协作方式 通过添加功能 让你能直接从Organizer分享崩溃报告 使用工具栏中的全新分享按钮 你就可以直接将崩溃报告 分享给你的团队成员 也能轻松地加入到你的任务列表上
而当你点击其中一个连结时 Organizer会开始下载并集中这些问题 让你对这个崩溃从头开始 并展开调查 TestFlight是开发人员的一大利器 能快速地将新功能和修复 交到测试人员手中 让他们能协助找到新的崩溃和错误 用TestFlight测试Beta版app 将一个完美的更新档 发布到App Store 有助于建立开发者的信心 我很开心地宣布 在Xcode 13版本中 我们将TestFlight的崩溃反馈 直接带入到Crashes Organizer
App Store Connect会向各位展示 所有的TestFlight反馈 包含崩溃反馈 你们可以从App Store Connect 继续下载原始反馈和崩溃日志 或者用今年全新的方式 直接在Organizer中 选择“在Xcode里打开” 相关的崩溃情况
查看你的崩溃反馈 从没如此简单过 在Crashes Organizer里 有个新的Inspector 是专门对应到 TestFlight Crash Feedback 打开这个Inspector 你会看到所有的反馈 是遇到 你选取的崩溃的测试员所提交的 这可以让你和崩溃报告一起 看到一份统一的反馈清单 让你可以快速筛选 找到一些额外能帮助你 修复崩溃的信息 当追查难以重现的问题时 这项新增的背景信息是无价的 的确有许多新奇酷炫的玩意 接着让我们在新的 Crashes Organizer里开始深入探究 为崩溃情况进行分诊吧
我一直持续开发团队的app Fruta 而且我们最近在App Store 发布了一个新版本 但也同时持续用Xcode Cloud 部署新版本到TestFlight 今天我想要看看 最近有没有任何崩溃情况发生 在我们的轻app里 打开Organizer 看看会发生什么事 我可以通过选取菜单栏选项 并选取Organizer这么做
从左侧的侧边栏 我可以清楚知道Xcode 已经为我的iOS app Fruta 打开了Crashes Organizer 在窗口顶端的工具栏中 你会注意到所有今年推出的 新过滤器选项 而在过滤器下方的是崩溃情况清单 展示过去这两周内 所有的版本、架构、产品中 所有的崩溃情况 快速地浏览这份清单后 我可以看到一些不同情况的问题 这份清单中的崩溃情况 显示各式各样的图示 标示着它们可能来自于我们的轻app watch app或是app扩展
这使我们能够快速地 识别出崩溃正在影响 app的哪个区块
在崩溃情况清单的右侧 可以看见崩溃日志 用平易近人和精简的方式呈现 我在崩溃情况清单中 所选取的崩溃情况 最后 在崩溃日志的右侧 可以看到Inspector展示出各式各样 有关选取的崩溃情况的有趣信息 现在我们已经熟悉了Organizer的操作 我想要看一下所有我们最近 轻app发生的问题 我可以打开工具栏里的产品过滤器 它列出了所有 随着我的app发送的产品 像是watch app、轻app或者app扩展 接着我会进行下一步 并选取此处的轻app
选取轻app时 会过滤崩溃情况清单 只显示出最近这两周内的 轻app崩溃情况 最严重的崩溃情况 会排在列表中的第一个 在标题的下方 Organizer会让我们知道 这次的崩溃在这两周内 影响了21台设备 最后一天影响了七台 现在 在我开始深入探究代码以前 我喜欢自问一些问题 这样有助于引导我的调查 并指引我找到背景信息线索 首先 这个问题已经持续多久了? 如果我们直接到窗口右侧的 Inspector图表区 我们可以从图例中知道 这个崩溃情况第一次 出现在2.0版本中 而且还继续影响到我们 TestFlight最新的2.0.1.版本架构 下一个问题 它是否正在影响我的制作app 还是只有TestFlight而已? 我可以更改过滤器到Release 以找出它同时正在影响 TestFlight和App Store架构 所以这个问题还挺重要的 因为我们的客户正在经历这个崩溃 而且看起来似乎已经影响到 我们最新发布到App Store的版本了
现在让我们来看看崩溃日志 崩溃日志方便地标注出 崩溃的确切框架 而且通过查看回溯上面的 线程数号Thread 6 让我知道这也发生在后台线程
可以看到这个崩溃 是发生在同步收藏夹时 但这不是我会频繁使用的代码区域 所以我摸不太着头绪 要怎么重现这个问题 对于洞察这些崩溃情况 我已经想不到更多的问题了 所以如果可以获得更多的背景信息 是真的很有帮助 幸运的是 在这个崩溃情况列表旁边 有个反馈图示 所以我知道我们的测试员之一 经历过这次崩溃 而且也提交了反馈 这或许是我能开始着手处理崩溃 所需的最后一块拼图 我可以到Inspector区域查看 他们所提交的反馈 并开启全新的Feedback Inspector
我看到有许多的测试员 曾碰到一样的崩溃 其中一个几分钟前才又遇到
在这个Inspector里 我可以看到各个反馈报告的预览 或者我直接打开其中一个弹出窗口 就会有更多的细节信息 我点击这个最新的反馈 将会打开一个弹跳窗口 窗口内会显示 这位测试员所遇到的所有背景信息 像是他们安装的确切版本和架构 设备、电量 以及可用的硬盘容量 这些都能够是诊断崩溃时有用的线索 在这个情况下 测试员是使用行动数据 然后他们评论 “我当时正在过隧道 然后点击了收藏按钮 过了几秒后 它就崩溃了” 如果他们正在过隧道的话 可能网络连线不稳 现在我们可以综合所有的线索 知道按下收藏按钮的时候 会触发一些背景任务 最终导致崩溃 我认为我们足以开始深入探究代码了 我将使用Open in Project按钮 直接到Fruta Xcode项目里 来打开这个崩溃
好 Xcode已经打开了 并在左边的Debug Navigator中 显示回溯 以及我们源文件的编辑者 确切的崩溃代码也标注出来了 那么为什么这段代码会崩溃呢? 这个嘛 看起来我们是故意 在一个致命的错误上崩溃的 这看起来满有趣的 我们一起快速地看一下 同步收藏的功能来了解 它原本想做什么
首先 我们跳到后台线程 接下来 收藏这个冰沙 到我们的收藏夹里 然后将后端更新 并使用DispatchGroup 来同步这所有的操作
然后就等待这些操作 并设定十秒钟的时间 如果超过十秒就会崩溃 这还挺不合理的 还记得我们测试员的反馈是说 他们当时要收藏冰沙的时候 正在过隧道 如果他们当时正在过隧道 那他们的网络连线质量可能会很差 这意味着 与我们的后端同步 所需要的时间 肯定是会超过十秒钟的 现在这个崩溃完全合理 既然我们知道时间设定得太短了 而且处理不当 那么就来解决这个问题吧 最近我一直在练习合并技能 所以我想我就用Combine来解决吧
太好了 所以我们现在将两个publishers 合并在一起 所以时间到的时候 也就是30秒 我们把崩溃取代成完成程序 问题解决了 让我们回到Organizer 并将问题标注为已解决吧 噢 我们的老板刚刚传信息给我
噢 克莱格在他的demo版里 遇到崩溃了 谢天谢地 我的老板使用了 Organizer新的Sharing功能 发送他发生的确切崩溃情况给我 所以我就不用再去找 当我点击这个连结时 Organizer会建立该连结中的 单一崩溃聚焦视图 我其实之前看过这个崩溃 我前几天刚修好这个 并将它标记为已解决 我也给了崩溃一个更亲切的名字 好让我记得潜在的问题 我要继续进行 并让我的老板知道 我已经解决了这个问题
所以我们刚刚学到了 如何用Organizer里 新的过滤器分诊轻app崩溃情况 如何用Inspector里的新分布表 和如何运用TestFlight反馈 来解决一个有可能 难以重现的问题 现在让我们来看看 新的Terminations Organizer 以及我们为MetricKit做的改善 新的Terminations Organizer 显示有可能影响你的客户的 app终止趋势 你在Crashes Organizer里看到的崩溃 都是编程的失败结果 但还有其他方式 可以终止你的app处理
Terminations会按原因分类 像是“启动超时” 或者“碰到系统内存限制” 你可以将app的这些终止事件类别 与你之前的app版本进行比较 以找出回归
这些终止事件有些是在后台发生的 但在某些特定情况下 当你的app在前台时就可能会发生 Terminations Organizer 可以帮助你理解差异 好让你可以计划来修复它们 如果你想深入探究回归 那就看看 今年的Application Performance Survival Guide课程 若要学习更多终止的相关信息 我推荐查看2020年的 《为什么我的 app 被终止了?》 如果你不熟悉 可以使用Apple framework MetricKit 去收集代码中的崩溃日志 你所要做的就是导入MetricKit 开始MetricKit Manager 并在他们收到时 使用在 MetricKit Diagnostic Payloads上的 crashDiagnostics属性
今年将不再合计崩溃诊断 而且每天只传送一次 但现在会在你下次启动app时传送 因此你可以更快速地存取崩溃日志 我也要很开心地宣布 MetricKit现在也支持macOS 要了解更多MetricKit相关信息 我推荐查看2020年的课程 《MetricKit 中的新增功能》 里面有许多追踪 和查看崩溃情况的其他方式 你可以从Devices窗口存取 已连结设备上的崩溃情况 或直接从你的设备中分享日志 XCTest将收集运行测试时发生的崩溃 你可以使用Console app 从你的Mac和Simulator查看崩溃 有关这些附加工具的更多信息 请查看2018年的课程 《理解崩溃和崩溃日志》 今天我们看到了一些很棒的新功能 希望新的快速崩溃日志传送 TestFlight反馈整合和分布指标 将显著改善你的崩溃修复体验 最终能改善你的app健康状况 以及你的使用者体验 感谢你的收看 记得 通往成功之路 是没有尽头的 [打击音乐声]
-
-
14:02 - Using MetricKit
// Capture crash logs in your code import MetricKit class Subscriber: NSObject { override init() { super.init() MXMetricManager.shared.add(self) } deinit { MXMetricManager.shared.remove(self) } } extension Subscriber: MXMetricManagerSubscriber { func didReceive(_ payloads: [MXDiagnosticPayload]) { payloads.forEach { if let crashDiagnostics = $0.crashDiagnostics { // Begin analyzing crash diagnostic payload. } } } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。