ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Xcode OrganizerによるTestFlightクラッシュのトリアージ
Xcode Organizerを使用して、クラッシュのトリアージと修正をより簡単かつ迅速に行う方法を確認しましょう。クラッシュの発生直後に、クラッシュの情報やTestFlightテスターからのフィードバックにアクセスする方法を探ります。また、クラッシュを分析し、メトリクスを表示し、さらにチーム間でクラッシュ情報を共有する方法を紹介します。 クラッシュログの入門編として、WWDC18の「クラッシュとクラッシュログについて理解する」をご確認いただくことをお勧めします。
リソース
関連ビデオ
Tech Talks
WWDC21
WWDC20
WWDC18
-
ダウンロード
こんにちは "Xcode Organizerにおける TestFlightクラッシュの トリアージ" へようこそ Xcodeエンジニアの マットと申します このセッションでお見せするのは すべてのAppターゲットの クラッシュを トリアージするのに役立つ Xcode Organizerに 搭載された 新しいツールの一部と TestFlightユーザーからの フィードバックを活用して クラッシュ修正をより早く 反映させる方法です
そして 新しい Terminations Organizerと MetricKitの進化を ご紹介します
あなたのAppが ベータ版のテストに TestFlightを活用していれば テスターからのクラッシュ フィードバックが 非常に貴重であることを ご存知でしょう テスターが クラッシュを起こした後 フィードバックを書いた場合 App Store Connectでその フィードバックを確認したり クラッシュログをダウンロードし 何が起こったかの分析できます 後ほど このワークフローを 超高速化するために Xcodeで行った変更を 紹介します
まず Xcode 13以前の 機能を簡単にご紹介します
Crashes Organizerでは App StoreのAppと TestFlightの両方のクラッシュを サポートしています クラッシュはApp Clipや App Extensionを含め すべてのプラットフォームで 表示されます
Organizerは問題をランク付けして 優先度の高いクラッシュを表示し それらのクラッシュが異なる デバイスやOSバージョンに どのように分布しているかを 示します そしてクラッシュを 修正することに決めたら Xcodeプロジェクトで 直接開くことができます これらの優れた機能は 開発者アカウントで Xcodeにサインインするだけで すぐに利用できます 良いAppを作るための旅は 長く険しいものです というのも 一度公開すると ユーザーは開発者が 想像もしなかった方法で Appをクラッシュ させるからです Xcode 13では クラッシュを 起こさないという 目標に近づくため Crashes Organizerを さらに改良しました これによりクラッシュログの 配信をほぼ瞬時に行い クラッシュに関する より豊富なデータを提供 予想外の問題の解決に 役立つ情報を提供するという 使命を果たすことが できました Xcode 13に追加された Crashes Organizerの 素晴らしい新機能を皆さんに お見せできることを 嬉しく思います 皆さんに大きく分けて 6つの改良をお見せします 1つ目はTestFlightの クラッシュを即発見します テスターがTestFlightのビルドを クラッシュさせた場合 直後にオーガナイザーで そのクラッシュを 発見することができます このquick crash deliveryでは 過去1日に発生した TestFlightのクラッシュを すべて表示可能になりました 選択したクラッシュが いつ発生したかを示す 1時間ごとのグラフも 表示されます Xcode 13では 1年分のクラッシュ履歴が 利用可能になりました
過去1年間に発生した すべてのクラッシュを 確認するため 期間別のフィルタリングも 可能です 1年分のクラッシュが 表示可能になり インスペクタの グラフエリアには 月ごとの クラッシュ発生率を示す 時間分布が表示されます 私たちはAppの 状態を隅々まで 把握するためのツールを 提供したいと考えました そこで今年はCrashes Organizerに フィルタを追加 Appの特定の部分に フォーカス可能になりました
クラッシュリスト 全バージョンと ビルドでのフィルタリングや 過去のリリースを個別に ドリルダウンも 可能になりました またWatch Appや Share Extensionなど Appに同梱されている Extensionで フィルタリングも可能です Apple Silicon Mac上で あなたのiOS Appの 動作確認も可能です Appの問題を トリアージするためには 特定のクラッシュの 影響を受けるのは何か クラッシュはさまざまな カテゴリに分散しているか などの全体像の 把握が必要です
そこで今年はクラッシュが Appのバージョン間 TestFlightとApp Store間で どのように分布しているかを 確認できる機能を 追加しました 皆さんは一人であるいは 大きなチームで あるいはその中間で Appを発表してきました Xcode 13ではOrganizerから 直接クラッシュレポートを 共有できる機能を追加し コラボレーションのための 新しい方法を導入しています ツールバーの新しい 共有ボタンを使えば チームのメンバーと 直接クラッシュを共有したり 単にToDoリストに 追加することができます
これらのリンクを クリックすると Organizerが問題を ダウンロードし このクラッシュにゼロインし 調査を開始します TestFlightは開発者が 新機能や修正プログラムを 迅速にテスターの手に渡し 新たなクラッシュや バグの発見に 役立ててもらうための 貴重なツールです TestFlightでAppを ベータテストすることで 開発者はApp Storeに 自信持ってアップデートを 配信できます Xcode 13では TestFlightの クラッシュフィードバックを Crashes Organizerに直接 取り込むことが できるようになりました
App Store Connectでは フィードバックを含む TestFlightの全フィードバックが 表示されます フィードバックや クラッシュログは 引き続きApp Store Connectから 直接ダウンロード可能 また今年は新たに Open in Xcodeボタンが追加され 関連するクラッシュを Organizerで確認できます
クラッシュフィードバックの 閲覧がより簡単になり Crashes OrganizerにTestFlightの フィードバック専用の 新しいインスペクタを追加 インスペクタを開くと 選択したクラッシュを 実行したテスターから 寄せられた フィードバックが すべて表示されます これにより クラッシュレポートと共に 統一された フィードバックリストが 表示されクラッシュを 修正するために 必要な情報を すぐに探し出すことが できます 予想外の問題を 解決するためには このような情報が 必要だと考えています 必ず役に立つでしょう 早速新しい Crashes Organizerで クラッシュのトリアージを してみましょう
私はFrutaという名前の チームAppを開発中です 最近新バージョンを App Storeにアップしましたが Xcode Cloudを使って TestFlightにも 継続的に新バージョンを デプロイしています 今日はApp Clipで最近 クラッシュがあったか否か 確認したいので Organizerを開いて 何が起こっているのかを 見てみましょう メニューバーの ウィンドウを選択し オーガナイザを選択します
左側のサイドバーで Xcodeが 私のiOS App Frutaの Crashes Organizerを 開いたことがわかります ウィンドウ上部の ツールバーには 今年新たに加わった フィルタオプションが すべて表示されています フィルタバーの下には クラッシュリストがあり バージョン ビルド 製品を問わず 過去2週間のすべての クラッシュが表示されます このリストをざっと見ると さまざまな種類の問題が あることがわかります リストに表示される クラッシュは App Clipから来たのか Watch Appからか それともExtensionからかを 示すバッジが表示されます
これによりクラッシュが Appのどの領域に 影響しているかを迅速に 特定することができます
リストの右側には ログビューが表示されます これはリストで 選択したクラッシュの シンプルな確認ビューを 表示します 最後に ログビューの右側には インスペクタがあり 選択したクラッシュに関する 様々な興味深い情報が 表示されています Organizerに 慣れたところで App Clipの 最近の問題点を すべて見ていきたいと 思います ツールバーの 製品フィルタを開くと Watch App App Clip App Extensionなど 同梱されているすべての 製品が一覧表示されます ここでApp Clipを 選択してみます
App Clipを選択すると クラッシュリストが フィルタリングされ 過去2週間に発生した App Clipのクラッシュのみが 表示されます リストの最初のクラッシュが トップクラッシュです このクラッシュが 過去2週間で21台 1日で7台のデバイスに 影響を及ぼしていることを Organizerが レポートしています コードを調べ始める前に 調査の指針となるような 質問を自分に投げかけ 文脈の手がかりを 得るようにしています まず 問題がどの程度の期間 起きているのか ウィンドウの右側にある インスペクタの グラフ領域に移動すると グラフの凡例から このクラッシュが バージョン2.0で初めて発生し 最新のTestFlight ビルド2.0.1に 影響を与えていることが わかります 次の質問ですが これは 実際Appに影響するのか それともTestFlightだけに 影響するのでしょうか フィルタを Release に 変更すると TestFlight と App Store ビルドの 両方に影響があることが わかります この問題は非常に重要です なぜならユーザーが この問題を経験しており 最新のApp Storeリリースに 影響しているからです
次はログビューに 焦点を当てます ログビューではクラッシュの 正確なフレームが ハイライトされるので 便利です またバックトレースの上に あるスレッド番号を見て バックグラウンドのスレッドで 起こったことがわかります
お気に入りの同期中に クラッシュしているのは わかりますが 私が頻繁に扱う コード領域ではないので 再現方法がよくわかりません このクラッシュについての 疑問がこれ以上 思い浮かばないので もう少し状況が分かると 助かります 幸いなことにリストの このクラッシュの横には フィードバックの アイコンがあるので テスターの1人が このクラッシュを経験して フィードバックを 提出したことがわかります これがクラッシュ解決に 必要な情報かもしれません インスペクタエリアに 移動して 新しいフィードバック インスペクタを開くと フィードバックを 見ることができます
数名同じクラッシュに 遭遇しているようですが その中には1分前に アクセスした人もいます
インスペクタでは 各フィードバックレポートの プレビューを見ることができ レポートをクリックすると ポップオーバーで 詳細を見ることができます この最新のフィードバックを クリックすると ポップオーバーが表示され インストールしたバージョン ビルド デバイスのモデル バッテリー残量 使用可能なディスク容量など このテスターの クラッシュに関する 豊富な情報が表示されます これらはすべてクラッシュを 診断する際のヒントです このケースでは テスターがセルラー通信を 使用していたことがわかり そのコメントには "トンネルを抜け お気に入り ボタンを押し 数秒後に-- クラッシュした"とあります トンネルを通ったのなら 回線が悪かったことが 想像できます これらの情報があれば お気に入りボタンを押した ことが何らかの引き金となり クラッシュが起きたという 背景が把握できます コードを読み解くのに十分な 情報が得られたと思います Open in Projectボタンを使って このクラッシュを Fruta Xcodeプロジェクトで 直接開くことにします
さてXcodeが開き 左のDebug Navigatorに バックトレースが表示され エディタにソースファイルと クラッシュしたコードの 正確な箇所が ハイライトされています なぜこのクラッシュが 起きたんでしょうか? わざと決定的なエラーで クラッシュさせているように 見えますが これはこれで 面白い選択だと思います syncFavorites関数が 何をしようとしているのかを 理解するために 簡単に説明します
まずバックグラウンドの スレッドへアクセスし 次に このスムージーを お気に入りとしてディスクに 保存しているように見えます 次にバックエンドを 更新し この操作を同期させるため DispatchGroupを使用します
これらの操作を 10秒のタイムアウトで待ち それ以上かかると クラッシュしてしまいます これは不親切ですね フェードバックを振り返ると トンネルを抜けて お気に入りを登録したら クラッシュしたとありました トンネルを通っていたと いうことは ネットワークの質が 悪かったのでしょう つまりバックエンドとの 同期に10秒以上かかった 可能性がある ということです クラッシュの原因が はっきりしました タイムアウトの時間が 短すぎて適切に処理 できないことがわかったので これを修正しましょう 最近Combineのスキルの 練習をしているので それを使って 修正したいと思います
完璧です そして タイムアウトした場合 "現在は30秒修正済み" その処理を クラッシュではなく 完了ハンドラを 呼び出します Organizerに戻ってこの問題を 解決したことにしましょう ボスからのメッセージだ
ああ クレイグのデモで クラッシュだ ありがたいことに彼は Organizerの新共有機能を使って クレイグがヒットした正確な クラッシュを報告したので 私が探し回る 必要はありません ここをクリックすると Organizerはリンクに埋め込まれた 単一のクラッシュに焦点を 当てたビューを作成します このクラッシュは 過去にもありました 先日 この件を修正し 解決済みとしました また根本的な問題を 思い出せるように クラッシュに親しみやすい 名前をつけました 修正完了の報告を ボスにします
Organizerの新しい フィルタを使って App Clipのクラッシュを トリアージする方法でした インスペクタの新しい 分布グラフの使い方や TestFlightのフィードバックを 利用して 再現が困難な問題を 修正する方法などを ご紹介しました それでは 新しい Terminations Organizerと MetricKitの改良点を ご紹介します 新しい Terminations Organizer は ユーザーに影響を与えている 可能性のあるApp終了の 傾向を表示します Crashes Organizerに 表示されるクラッシュは プログラミングの失敗に よるものですが Appのプロセスが 終了する方法は 他にもあります
終了は"起動時の タイミングアウト"や "システムのメモリ 制限にかかった "などの 理由で分類されます Appの終了イベントの これらのカテゴリを 以前のバージョンと比較して リグレッションを 見つけることができます
これらの終了はバック グラウンドで発生する ものもありますが 場合によっては 画面上に表示されている間に 発生することもあります Terminations Organizerは その違いを理解することで それらを解決するための 計画を立てることができます リグレッションについて 深く知りたい方は 今年のセッション "究極のAppパフォーマンスサバイバルガイド" ターミネーションについて 詳しく知りたい方は 2020年のセッション "Appが強制終了される理由"を チェックすることを お勧めします 馴染みがない場合 Appleのフレームワークである MetricKitを使って コード内のクラッシュログを 収集することができます MetricKitを インポートするだけです MetricKit Managerの リスニングを開始します MetricKit Diagnostic Payloadsを 受信したら crashDiagnostics プロパティを使用します
今年の新機能として クラッシュ診断は 従来の1日1回の 集計・配信ではなく 次回のApp起動時に 配信されるようになったため より早くクラッシュログに アクセス可能になりました また嬉しいことに この度macOSにも対応しました MetricKitの使い方については 2020年のセッション "MetricKitの新機能"が おすすめです クラッシュを追跡する方法は 他にもたくさんあります 接続されているデバイスの クラッシュには デバイスウィンドウから アクセスできるほか デバイスから直接ログを 共有することもできます 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. } } } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。