■イベント 【iOSエンジニア向け勉強会】アプリ開発に強みを持つ3社がiOS14の開発事情を語る https://sansan.connpass.com/event/191775/
■登壇概要 タイトル:iOS 14 でのMetricKitの新機能について 登壇者:Sansan事業部 プロダクト開発部 多鹿 豊
▼Sansan Builders Blog https://buildersbox.corp-sansan.com/
iOS 14 でのMetricKitの新機能について1
View Slide
- Twitter- @Yut_Taji- GitHub- @taji-taji2
- これまでの MetricKit について理解する- iOS 14 で追加された MetricKit の新機能の概要を把握するゴール3
MetricKitとは?4
- 各ユーザ環境で実行されるアプリのパフォーマンスに関するデータを収集するフレームワークMetricKitとは?5
- 各ユーザ環境で実行されるアプリのパフォーマンスに関するデータを収集するフレームワーク- アプリのパフォーマンス向上を目指す上で役に立つフレームワークMetricKitとは?6
- 各ユーザ環境で実行されるアプリのパフォーマンスに関するデータを収集するフレームワーク- アプリのパフォーマンス向上を目指す上で役に立つフレームワーク- WWDC 2019 にて発表MetricKitとは?7
- 各ユーザ環境で実行されるアプリのパフォーマンスに関するデータを収集するフレームワーク- アプリのパフォーマンス向上を目指す上で役に立つフレームワーク- WWDC 2019 にて発表- iOS 13 以降で使用可能MetricKitとは?8
開発プロセスとツール9
開発プロセスとツール10
開発プロセスとツールDevelopmentandTestingBetaPublicRelease11
開発プロセスとツールDevelopmentandTestingBetaPublicReleaseInstrumentsXCTest Metrics MetricKitXcode MetricsOrganizer12
開発プロセスとツールDevelopmentandTestingBetaPublicReleaseMetricKitXCTest MetricsInstruments Xcode MetricsOrganizer実際のユーザ端末のデータを収集13
これまでの MetricKit のおさらい14
実装方法15
実装方法AppDelegate に実装する例16
実装方法17
実装方法18
実装方法19
実装方法20
データはいつ収集されるか?21
データはいつ収集されるか?最大で1日に1回、過去24時間のデータを MXMetricPayload に集約する22
実装方法23
どんなデータが取れるのか?24
- Batteryどんなデータが取れるのか?(iOS 13では)25- Performance
- Battery- ネットワークの接続状況> シグナルバーの本数- ディスプレイの輝度> Average pixel luminance: APL- CPU, GPUの使用状況- 位置情報追跡の使用状況- ネットワーク転送> セルラー, Wifiでのアップロード、ダウンロード量どんなデータが取れるのか?(iOS 13では)26- Performance- ハングが起こった時間- ディスクの書き込み総量- アプリ起動> 起動・復帰- メモリ使用量
どんなデータが取れるのか?(iOS 13では)- JSONにするとこんな感じ- 一部ですが、、27
どんなデータが取れるのか?(iOS 13では)参照:https://developer.apple.com/documentation/metrickit/mxmetricpayload28
もう少し実装について29
実装方法30
- 何を実装する?func didReceive(_ payloads: [MXMetricPayload])31
- 何を実装する?- リリース後の実際の収集データを参照できるようにしたいfunc didReceive(_ payloads: [MXMetricPayload])32
- 何を実装する?- リリース後の実際の収集データを参照できるようにしたい- 自社サーバーや3rdパーティ製ログ収集サービスに MXMetricPayload の内容を送信するfunc didReceive(_ payloads: [MXMetricPayload])33
- 何を実装する?- リリース後の実際の収集データを参照できるようにしたい- 自社サーバーや3rdパーティ製ログ収集サービスに MXMetricPayload の内容を送信する- 送信データの整形func didReceive(_ payloads: [MXMetricPayload])34
- 何を実装する?- リリース後の実際の収集データを参照できるようにしたい- 自社サーバーや3rdパーティ製ログ収集サービスに MXMetricPayload の内容を送信する- 送信データの整形- MXMetricPayload や MXMetric には func jsonRepresentation() -> Data というインスタンスメソッドが生えているfunc didReceive(_ payloads: [MXMetricPayload])35
- 何を実装する?- リリース後の実際の収集データを参照できるようにしたい- 自社サーバーや3rdパーティ製ログ収集サービスに MXMetricPayload の内容を送信する- 送信データの整形- MXMetricPayload や MXMetric には func jsonRepresentation() -> Data というインスタンスメソッドが生えている- これを使用するとサーバーに送る際のデータ整形が楽func didReceive(_ payloads: [MXMetricPayload])36
- 何を実装する?- リリース後の実際の収集データを参照できるようにしたい- 自社サーバーや3rdパーティ製ログ収集サービスに MXMetricPayload の内容を送信する- 送信データの整形- MXMetricPayload や MXMetric には func jsonRepresentation() -> Data というインスタンスメソッドが生えている- これを使用するとサーバーに送る際のデータ整形が楽func didReceive(_ payloads: [MXMetricPayload])37
- 何を実装する?- リリース後の実際の収集データを参照できるようにしたい- 自社サーバーや3rdパーティ製ログ収集サービスに MXMetricPayload の内容を送信する- 送信データの整形- MXMetricPayload や MXMetric には func jsonRepresentation() -> Data というインスタンスメソッドが生えている- これを使用するとサーバーに送る際のデータ整形が楽func didReceive(_ payloads: [MXMetricPayload])38
- デバッグfunc didReceive(_ payloads: [MXMetricPayload])39
- デバッグ- Xcodeの 「Debug > Simulate MetricKit Payloads」func didReceive(_ payloads: [MXMetricPayload])40
- デバッグ- Xcodeの 「Debug > Simulate MetricKit Payloads」- 実機をつないで Run する必要があるfunc didReceive(_ payloads: [MXMetricPayload])41
- デバッグ- Xcodeの 「Debug > Simulate MetricKit Payloads」- 実機をつないで Run する必要がある- 実行すると didReceive メソッドが呼ばれ、ダミーのデータを受け取れるfunc didReceive(_ payloads: [MXMetricPayload])42
iOS 14 での新機能43
新しいメトリクスの追加44
- Battery- ネットワークの接続状況> シグナルバーの本数- ディスプレイの輝度> Average pixel luminance: APL- CPU, GPUの使用状況- 位置情報追跡の使用状況- ネットワーク転送> セルラー, Wifiでのアップロード、ダウンロード量【再掲】どんなデータが取れるのか?(iOS 13では)45
- Performance- ハングが起こった時間- ディスクの書き込み総量- アプリ起動> 起動・復帰- メモリ使用量【再掲】どんなデータが取れるのか?(iOS 13では)46
CPU命令数47
- iOS 13 では CPU時間のみ集計されていたCPU命令数48
- iOS 13 では CPU時間のみ集計されていた- CPU時間はクロック周波数等に依存するデータなので、正確に状況を把握することが困難CPU命令数49
- iOS 13 では CPU時間のみ集計されていた- CPU時間はクロック周波数等に依存するデータなので、正確に状況を把握することが困難- それらに依存しないCPU命令数を追加CPU命令数50
- iOS 13 では CPU時間のみ集計されていた- CPU時間はクロック周波数等に依存するデータなので、正確に状況を把握することが困難- それらに依存しないCPU命令数を追加- より正確に状況を把握できるCPU命令数51
スクロールヒッチ率52
スクロールヒッチ率- スクロールヒッチ53
- スクロールヒッチ- スクロールが引っかかる- スクロール時のフレーム落ちスクロールヒッチ率参照:https://developer.apple.com/videos/play/wwdc2020/1007754
- スクロールヒッチ- スクロールが引っかかる- スクロール時のフレーム落ち- スクロールヒッチ時間- スクロールヒッチが発生した時間(ms)スクロールヒッチ率参照:https://developer.apple.com/videos/play/wwdc2020/1007755
- スクロールヒッチ- スクロールが引っかかる- スクロール時のフレーム落ち- スクロールヒッチ時間- スクロールヒッチが発生した時間(ms)- スクロールヒッチ率- 1秒あたりのスクロールヒッチ時間スクロールヒッチ率参照:https://developer.apple.com/videos/play/wwdc2020/1007756
- スクロールヒッチ- スクロールが引っかかる- スクロール時のフレーム落ち- スクロールヒッチ時間- スクロールヒッチが発生した時間(ms)- スクロールヒッチ率- 1秒あたりのスクロールヒッチ時間スクロールヒッチ率参照:https://developer.apple.com/videos/play/wwdc2020/1007757
アプリケーション終了・強制終了の理由と発生回数58
アプリケーション終了・強制終了の理由と発生回数参照:https://developer.apple.com/videos/play/wwdc2020/1007859
MetricKit Diagnostics診断APIの追加60
- 次の診断データを収集MetricKit Diagnostics61
- 次の診断データを収集- ハング> ハングが発生した時間MetricKit Diagnostics62
- 次の診断データを収集- ハング> ハングが発生した時間- クラッシュMetricKit Diagnostics63
- 次の診断データを収集- ハング> ハングが発生した時間- クラッシュ- ディスク書き込み例外処理> 書き込み量MetricKit Diagnostics64
- 次の診断データを収集- ハング> ハングが発生した時間- クラッシュ- ディスク書き込み例外処理> 書き込み量- CPU例外処理> CPU時間> 高いCPU使用率がサンプリングされた合計時間MetricKit Diagnostics65
- それぞれに backtrace がCallStackTree の形で提供されるMetricKit Diagnostics66
- それぞれに backtrace がCallStackTree の形で提供される- atos コマンド等を使ってシンボル化することで追跡できるようになるMetricKit Diagnostics67
- MXMetricManagerSubscriber に追加されたデリゲートメソッドを実装する- MXMetricPayload を受け取る時とほぼ同じMetricKit Diagnostics68
まとめ69
- MetricKit はリリース後のアプリのパフォーマンスに関して、実際のユーザー環境でのメトリクスを収集できるツールまとめ70
- MetricKit はリリース後のアプリのパフォーマンスに関して、実際のユーザー環境でのメトリクスを収集できるツール- 収集したデータは自社サーバーなどに送信して保存することで分析できるようになるまとめ71
- MetricKit はリリース後のアプリのパフォーマンスに関して、実際のユーザー環境でのメトリクスを収集できるツール- 収集したデータは自社サーバーなどに送信して保存することで分析できるようになる- iOS 14 では- MXMetricPayload に CPU命令数, スクロールヒッチ率, アプリケーション終了理由・回数 のメトリクスが追加まとめ72
- MetricKit はリリース後のアプリのパフォーマンスに関して、実際のユーザー環境でのメトリクスを収集できるツール- 収集したデータは自社サーバーなどに送信して保存することで分析できるようになる- iOS 14 では- MXMetricPayload に CPU命令数, スクロールヒッチ率, アプリケーション終了理由・回数 のメトリクスが追加- MXDiagnosticPayload が追加され、診断データとCallStackTreeも取得できるようにまとめ73
最後に74
- Sansanアプリではまだ導入していない最後に75
- Sansanアプリではまだ導入していない- 他のツールも含め、パフォーマンス向上のための1ツールとして活用方法を探っていきたい最後に76
- Sansanアプリではまだ導入していない- 他のツールも含め、パフォーマンス向上のための1ツールとして活用方法を探っていきたい- 実際に導入したら、分析〜改善に関する知見も溜めていきたい最後に77
- Sansanアプリではまだ導入していない- 他のツールも含め、パフォーマンス向上のための1ツールとして活用方法を探っていきたい- 実際に導入したら、分析〜改善に関する知見も溜めていきたい- 良いユーザー体験を目指してパフォーマンス改善しましょう最後に78
ご清聴ありがとうございました79
80
- WWDC 2020- What's new in MetricKit> https://developer.apple.com/videos/play/wwdc2020/10081- Eliminate animation hitches with XCTest> https://developer.apple.com/videos/play/wwdc2020/10077- Diagnose performance issues with the Xcode Organizer> https://developer.apple.com/videos/play/wwdc2020/10076- Why is my app getting killed?> https://developer.apple.com/videos/play/wwdc2020/10078参考資料(1)81
- WWDC 2019- Improving Battery Life and Performance> https://developer.apple.com/videos/play/wwdc2019/417/- Apple Developer Documentation- MetricKit> https://developer.apple.com/documentation/metrickit- JSONデータ- MXMetricPayloadのJSONデータ> https://gist.github.com/taji-taji/040be779c54dc54109704a77c772bf12- MXDiagnosticPayloadのJSONデータ> https://gist.github.com/taji-taji/7feff7106cdd014d865e080399b1a49f参考資料(2)82