ハイライト
Xcode 13 は、TestFlight クラッシュの迅速な配信、テスターのフィードバック、分布マップ、クラッシュ共有、Terminations Organizer および MetricKit のより高速な診断配信を開発者のトラブルシューティング プロセスに統合し、チームがオンラインでの発見とベータ版のクラッシュの迅速化を支援します。
主要内容
一般的なクラッシュのトラブルシューティング プロセスは複雑です。
テスターは TestFlight でクラッシュに遭遇し、フィードバックを書きました。開発者は、App Store Connect にアクセスしてフィードバックを読み、クラッシュ ログをダウンロードしてから、Xcode に戻ってコール スタックを分析する必要があります。問題が特定のネットワーク、デバイス、またはバージョンでのみ発生する場合、多くの場合、クラッシュ ログだけでは十分ではありません。
Xcode 13 ではこのリンクが変更されました。 TestFlight ビルドがクラッシュすると、オーガナイザーは数分後にクラッシュを受け取ります。 Crashes Organizer は、最新の日の TestFlight クラッシュ、時間別チャート、1 年間の履歴、バージョンおよび製品フィルターも 1 つのインターフェイスにまとめています。
これにより、調査は「まず資料を集める」ことから「文脈を直接見る」へと変わります。まず、App Clip、ウォッチアプリ、または拡張機能にフィルタリングしてから、影響を受けるデバイスの数、表示され始めたバージョン、および App Store バージョンに入っているかどうかを確認できます。
TestFlight のフィードバックが Xcode に送信されます
以前は、テスターのテキスト フィードバックとクラッシュ コール スタックはさまざまな場所に散在していました。 Xcode 13 では、同じクラッシュに遭遇したテスターのフィードバックをクラッシュ レポートの隣に配置する新しいフィードバック インスペクターが追加されています。
Session の Fruta の例は非常に具体的です。開発者は App Clip のクラッシュを確認し、コール スタックはバックグラウンド スレッドのお気に入りの同期ロジックで発生していることを示します。コードを見ただけではトリガー条件を知るのは困難です。 Feedback Inspector は、テスターがトンネル内でセルラー ネットワークを使用しており、お気に入りボタンを押した数秒後にクラッシュしたことを示しています。
これらの手がかりをまとめると、問題が明らかになります。ネットワーク品質が低いため、バックエンドの同期に 10 秒以上かかり、コードではfatalErrorアクティブ崩壊。修正の方向はタイムアウトの処理にもなるため、開発者は再現する手順を推測し続ける必要がありません。
クラッシュはチームと直接共有できます
チームで作業するときによくあるもう 1 つの煩わしさは、「このクラッシュを見てください」ということです。相手はスクリーンショットや説明を提供し、受信者はそれを Organizer で検索する必要があります。
Xcode 13 では、クラッシュ オーガナイザーに [共有] ボタンが追加されます。共有リンクは特定のクラッシュをポイントしている可能性があります。受信者がリンクをクリックすると、オーガナイザーはダウンロードし、再フィルタリングすることなくそのクラッシュに焦点を当てます。
Terminations Organizer が別のタイプの終了を追加
Crashes Organizer は、プログラミング エラーによって引き起こされるクラッシュに焦点を当てています。アプリケーション プロセスの終了には他にも、起動タイムアウト、システム メモリ制限の到達、システムによるバックグラウンド終了などの種類があります。
Xcode 13 では、理由ごとに終了傾向を表示し、古いバージョンとの比較をサポートする新しい Terminations Organizer が追加されています。これは、開発者が特定の種類の終了が新しいバージョンで導入された回帰であるかどうかを判断するのに役立ち、また、終了がバックグラウンドで発生したのかアプリケーションのフォアグラウンドで発生したのかを区別することもできます。
MetricKit はクラッシュ診断を迅速に提供します
MetricKit (メトリクス フレームワーク) は、アプリケーション コードで診断データを受信できます。 Xcode 13 では、クラッシュ診断は集約されて 1 日に 1 回配信されなくなりましたが、次回アプリケーションが起動されたときに配信されます。 MetricKit は macOS もサポートします。
これは、独自のクラッシュ バックエンドを作成するのに適しています。アプリ起動後に定期購読者として登録して受け取ることができます。MXDiagnosticPayload後で読むcrashDiagnosticsを選択し、診断データを既存の分析システムに接続します。
詳細
TestFlight の高速配信とフィルタリングがクラッシュする
(02:17) Xcode 13 は、TestFlight ビルドがクラッシュした直後にクラッシュをオーガナイザーに送信します。 Crashes Organizer では、最近の TestFlight クラッシュを表示し、選択したクラッシュの時間分布を示す時間別グラフを表示できます。
Session はまた、1 年間のクラッシュ履歴が利用可能になったことにも言及しました。開発者は時間範囲でフィルタリングして、過去 1 年以内に発生したクラッシュを表示できます。インスペクターのグラフには、月ごとのクラッシュの発生率が表示されます。
鍵の入り口:
Window → Organizer → Crashes
Filter: Time Period → Last Day / Last Two Weeks / Last Year
Filter: Versions and Builds → All Versions and Builds / Individual Release
Filter: Products → iOS App / App Clip / watch app / app extensions
Distribution: Versions / TestFlight / App Store
キーポイント:
Window → Organizer → CrashesXcode のクラッシュ オーガナイザーを開きます。Time Period時間範囲を絞り込むために使用されるセッションには、過去 1 日、過去 2 週間、および年間の履歴が表示されます。Versions and Buildsクラッシュが発生し始めたバージョン、または特定のビルドにのみ影響するかどうかを判断するために使用されます。ProductsApp Clip、Watch App、拡張機能、およびアプリケーションとともにリリースされたその他の製品をフィルタリングするために使用されます。DistributionTestFlight と App Store のバージョン間の同じクラッシュの分布を表示するために使用されます。
(06:13) デモの Fruta アプリは、最初にオーガナイザーを開き、次に製品フィルターを使用して App Clip を選択します。リスト内のクラッシュには、App Clip、Watch アプリ、または拡張機能から発生したものであることを示すバッジが表示されます。これにより、開発者は影響を受けるアプリケーション領域を最初に特定できます。
鍵の入り口:
Crashes Organizer
Products Filter → App Clip
Crashes List → Top Crash
Inspector Graph → First appeared in version 2.0
Release Filter → TestFlight and App Store
キーポイント:
Products Filter → App ClipApp Clip のクラッシュのみを表示します。Top Crash過去 2 週間および過去 1 日に影響を受けたデバイスの数を表示します。Inspector Graphクラッシュの最も古いバージョンを表示します。Release Filter問題が App Store ユーザーに影響を与えているかどうかを確認するのに役立ちます。
フィードバック インスペクターはクラッシュの隣に再発の手がかりを配置します
(04:44) Xcode 13 では、TestFlight クラッシュ フィードバックが Crashes Organizer に提供されます。開発者は引き続き、App Store Connect で生のフィードバックとクラッシュ ログをダウンロードしたり、新しい [Xcode で開く] ボタンを使用して関連するクラッシュを直接開くことができます。
鍵の入り口:
App Store Connect → TestFlight Feedback → Open in Xcode
Xcode Organizer → Crashes → Feedback Inspector
Feedback Report → version, build, device model, battery level, available disk space, tester comment
キーポイント:
Open in XcodeApp Store Connect から Organizer にジャンプすると、リンクがクラッシュします。Feedback Inspector選択したクラッシュに遭遇したすべてのテスターからのフィードバックを表示します。versionそしてbuildテスターによってインストールされた特定のバージョンを示します。device model、battery level、available disk spaceデバイスのステータスを提供します。tester commentそれは再発の直接の原因です。セッションの例の重要な手がかりは、トンネル、携帯電話ネットワーク、お気に入りボタンです。
(09:24) Fruta の例では、フィードバック レポートにテスターがセルラー ネットワークでトンネリングしていることが示されています。開発者は、コール スタックのバックグラウンド同期ロジックと組み合わせると、ネットワーク品質が低いとバックエンド同期に 10 秒を超え、コードのクラッシュが発生する可能性があると結論付けました。
主なトラブルシューティング パス:
Feedback: "I was going through a tunnel and I hit the favorite button. A few seconds later, it crashed."
Backtrace: background thread, syncing favorites
Code path: save favorite to disk → update backend → wait with 10-second timeout → fatal error
Fix direction: increase timeout and call completion handler on timeout
キーポイント:
- テスターのフィードバックにより、「トンネル」と「セルラー ネットワーク」という 2 つの環境条件が与えられました。
- バックトレースは、クラッシュがお気に入りと同期しているバックグラウンド スレッドで発生したことを示します。
- コード パスには、ディスクの保存、バックエンドの更新、およびディスパッチ グループの待機が含まれます。
- 10 秒のタイムアウトによりクラッシュが発生します。修正は、タイムアウトを処理可能な結果として扱うことです。
プロジェクトで開いて共有すると、チームのコラボレーションが短縮されます
(10:19) 開発者がクラッシュを修正する準備ができたら、[プロジェクトで開く] ボタンを使用してプロジェクトを開くことができます。 Xcode はデバッグ ナビゲーターにバックトレースを表示し、エディターでクラッシュしたコード行を強調表示します。
鍵の入り口:
Crashes Organizer → Selected Crash → Open in Project
Xcode Project → Debug Navigator → Backtrace
Editor → Highlighted crashing line
キーポイント:
Open in ProjectOrganizer から対応する Xcode プロジェクトを入力します。Debug Navigatorクラッシュのバックトレースを表示します。- エディターはクラッシュ行を直接強調表示し、手動でファイルと行番号を見つける手順を減らします。
(04:01) Xcode 13 では、クラッシュ レポートをオーガナイザーから直接共有することもできます。ツールバーの [共有] ボタンを使用すると、クラッシュ リンクをチーム メンバーに送信したり、ToDo リストに追加したりできます。
鍵の入り口:
Crashes Organizer → Toolbar → Share
Shared Link → Organizer downloads and focuses on the issue
Resolved Crash → Friendly Name
キーポイント:
Share特定のクラッシュへのリンクを生成します。- 主催者は、チーム メンバーがリンクを開いた後のクラッシュに焦点を当てます。
- 解決されたクラッシュには解決済みのマークを付け、より簡単に識別できる名前を付けることができます。
終了オーガナイザー クラッシュせずに終了することに重点を置く
(12:59) 終了オーガナイザーには、アプリの終了傾向が表示されます。セッションでは、クラッシュと終了が明確に区別されます。前者はプログラミングの失敗が原因であり、後者は起動タイムアウトやシステム メモリの制限などが原因である可能性があります。
鍵の入り口:
Xcode Organizer → Terminations
Termination Categories:
- Timing out on launch
- Hitting the system memory limit
Compare: current version vs previous versions
Context: background vs onscreen
キーポイント:
Terminationsオーガナイザーの新しいビューです。Timing out on launchアプリケーションの起動時間がシステムの許容範囲を超えていることを示します。Hitting the system memory limitプロセスがシステム メモリの制限に達したことを示します。Compare古いバージョンと比較した新しいバージョンの終了回帰を見つけるために使用されます。background vs onscreen終了がユーザー エクスペリエンスに与える直接的な影響を判断するのに役立ちます。
MetricKit は次回の起動時にクラッシュ診断を提供します
(13:56) MetricKit はアプリケーション コードのクラッシュ ログを収集できます。 Xcode 13 の変更点は、クラッシュ診断が 1 日に 1 回集約されて配信されなくなり、次回アプリケーションが起動されたときに配信されることです。 Session はまた、macOS に対する 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.
}
}
}
}
キーポイント:
import MetricKitMetricKit フレームワークの紹介。Subscriber: NSObjectObjective-C ランタイム互換のサブスクリプション オブジェクトを定義します。override init()サブスクライバは、オブジェクトの作成時に登録されます。MXMetricManager.shared.add(self)MetricKit ペイロードのリッスンを開始します。deinitオブジェクトがリリースされたらサブスクライブを解除します。MXMetricManager.shared.remove(self)加入者がコールバックを受信し続けるのを防ぎます。MXMetricManagerSubscriberMetricKit ペイロードを受信するためのプロトコルです。didReceive(_ payloads: [MXDiagnosticPayload])診断ペイロードが到着すると呼び出されます。payloads.forEach今回受信したすべての診断ペイロードを調べます。$0.crashDiagnosticsクラッシュ診断を読んでください。値がある場合は分析プロセスに入ります。
重要ポイント
1. TestFlight クラッシュに対する毎日のトラブルシューティング キューを作成する
- 対処法: 毎日クラッシュ オーガナイザーを開き、前日の TestFlight クラッシュのみを表示し、影響を受けるデバイスの数で並べ替えます。
- 価値がある理由: Xcode 13 は TestFlight がクラッシュした直後に配信され、最終日の表示と時間別のグラフは、新しいビルドで問題が発生するかどうかをすぐに確認するのに役立ちます。
- 開始方法:から
Window → Organizer → Crashes入力、設定Time Period → Last Day次に、バージョン フィルターと製品フィルターを使用して、現在のテスト ビルドをターゲットにします。
2. App Clip、Watch App、および拡張機能の安定性を個別に確認します。
- 対処法: メイン アプリ、App Clip、Watch アプリ、および共有拡張機能のクラッシュをそれぞれフィルターして表示します。
- 実行する価値がある理由: セッション内のクラッシュ リストでは、バッジを使用してクラッシュの原因をマークし、製品フィルターはアプリケーションとともにリリースされた製品に直接焦点を当てることができます。
- 開始方法: クラッシュ オーガナイザーで開きます
Products Filter、App Clip、watch app、またはターゲット拡張機能を選択して、各製品のトップクラッシュを記録します。
3. テスターのフィードバックを複製手順のソースとして使用する
- 対処方法: TestFlight のクラッシュを修正する前に、フィードバック インスペクターでテスターのコメントとデバイスのステータスを読んでください。
- 実行する価値がある理由: Fruta の例は、脆弱なネットワーク、デバイスのステータス、ユーザーのアクションなど、コール スタックの背後にある環境条件をテスターの言葉で説明できることを証明しています。
- 開始方法: クラッシュ リストでフィードバック アイコンを探して開きます
Feedback Inspector、バージョン、ビルド、デバイス モデル、バッテリー容量、利用可能なディスク容量、レビューに重点を置いています。
4. 共有リンクを使用してチームのトラブルシューティングのコストを削減する
- 対処方法: 同僚が対処する必要があるクラッシュが発生した場合は、オーガナイザーからクラッシュ リンクを直接共有します。
- 実行する価値がある理由: 受信者がリンクを開いた後、オーガナイザーはダウンロードして同じクラッシュに焦点を当て、スクリーンショットや口頭での説明によって生じる曖昧さを回避します。
- 開始方法: クラッシュレポートを選択し、ツールバーの をクリックします
Share、モジュールを担当する同僚にリンクを送信するか、タスク システムにリンクを追加します。
5. アプリケーションで MetricKit クラッシュ診断にアクセスする
- 内容: アプリケーションの起動パスに MetricKit サブスクライバーを作成し、収集します
crashDiagnostics次に、自分の診断背景にアクセスします。 - 実行する価値がある理由: Xcode 13 では、次回の起動時にクラッシュ診断を提供できます。これは、1 日に 1 回集計するよりもクラッシュを迅速に特定するのに適しています。
- 開始方法: はじめに
MetricKit、実装を作成しますMXMetricManagerSubscriberオブジェクト、使用MXMetricManager.shared.add(self)に登録してくださいdidReceive(_:)読み込むMXDiagnosticPayload.crashDiagnostics。
関連セッション
- 究極のアプリケーション パフォーマンス サバイバル ガイド - パフォーマンス最適化のための指標、ツール、MetricKit の使用法について説明します。
- メモリ問題の検出と診断 - Terminations Organizer のシステム メモリ制限シナリオに関連するメモリ問題のトラブルシューティングに重点を置いています。
- アプリのハングを理解して排除する - スタックと遅延のトラブルシューティングについて説明し、アプリケーションの安定性診断ツール チェーンを補足します。
- テストの繰り返しで信頼性の低いコードを診断する - テストを繰り返して、不安定なコード、クラッシュ、不安定な動作を再現します。
- Mac 上の TestFlight について — Mac 上の TestFlight、フィードバック収集、およびテスト配布プロセスについて紹介します。
コメント
GitHub Issues · utterances