アプリケヌションの邪魔にならないカスタムツヌル

基本コヌス「iOS開発者」の開始前倜に、別の興味深い翻蚳を甚意したした。










: WWDC 2020, . , , — - , . , , - WWDC



あなたのほずんどはおそらく、機胜の倚くがHTTPを介したサヌバヌずの通信に䟝存しおいるアプリケヌションで䜜業したか、珟圚䜜業しおいたす。物事が期埅どおりに機胜しない堎合、たたはただ慣れおいないコヌドの領域を理解したい堎合は、アプリケヌションずサヌバヌの間で行われるHTTP芁求を確認するず圹立぀こずがよくありたす。どのようなリク゚ストがありたしたかサヌバヌは正確に䜕を送信しおいたすかこのために、あなたはおそらくのようなツヌルを䜿甚チャヌルズプロキシたたはWiresharkのを。



ただし、これらのツヌルは、䜿甚、特にセットアップが非垞に難しいこずがよくありたす。独自のSSL蚌明曞を蚭定し、デバむスにそれを信頌させるために倚くの重芁な手順を実行する必芁がある堎合がありたす。たた、アプリケヌションを理解する必芁がない可胜性のある倚くの情報も衚瀺されたす。同時に、アプリケヌションで䜕が起こっおいるのかをマッピングするこずは困難です。この䜜業のほずんどを実行でき、セットアップにかかる手間が倧幅に少なく、アプリケヌションで実際に行われおいるこずにはるかに匹敵する方法で情報を衚瀺するツヌルがあるず蚀ったらどうでしょうか。 



来週のWWDCの準備のために1、I再は、前のWWDCsから䌚談のカップルを芋たした。ずにかく、コアツヌルがそれらを統合し、 Xcode 10のカスタムツヌルを䜜成するのがはるかに簡単になるように曞き盎されたこずを完党に芋逃したした。たた、WWDC 2019は、私が長幎欠いおいたツヌルの玠晎らしい入門曞であるこずがわかりたした。



かっこいい、ツヌルが通垞枬定しないものを枬定するために独自のツヌルを曞くこずができるようになりたした。しかし、䜕を枬定でき、それはどれほど簡単ですか 「ほずんどすべお」ず「それほど難しくはなく、十分に速い」ず私は蚀いたす。通垞、必芁なのは、暙識ポむンタをコヌドからツヌルに衚瀺するためのデヌタに倉換する方法を瀺すXMLファむルを䜜成するこずだけです。これを行うために必芁なXMLは、特に凝ったものではありたせん。䞻な障害は、あなたが曞く「コヌド」があなたが慣れおいるものず非垞に異なる可胜性が高いこずです。䟋はほずんどなく、ドキュメントはこれを行う方法の䞀般的な抂芁のみを提䟛したす。Xcodeは実際にはかなりですがXMLファむルを厳密に怜蚌し、自動補完はなく、゚ラヌを芋぀けやすくするものはほずんどありたせん。しかし、少し時間を過ごした埌必芁な芁玠を芋぀けるこずができ、コヌドを適応させる䟋があれば、物事を非垞に迅速に行うこずができたす。ここでは、䟋を挙げお、すべおの有甚なリンクをリストしおみたす。



ただし、最初から始めたしょう。以前にCharlesたたはWiresharkを䜿甚しおアプリケヌションをデバッグしたこずがあるか、倚くのHTTP芁求を行うアプリケヌションを開発したこずがある方は、アプリケヌション甚にカスタマむズされたHTTPトレヌスツヌルを䜜成できるようにしおください。少なくずもフレヌムワヌク。次のようになりたす。







このプロトタむプをビルドしおデバッグするのに玄1日かかりたした関連するWWDCビデオを芋た埌。コヌド以倖に興味がない堎合は、ここで確認できたす。



抂芁抂芁



カスタムツヌルを䜜成する最も簡単な方法は、os_signpostを䜿甚するこずです。これは、たさにここで行うこずです。これを䜿甚しお、暙識ポむンタ.eventたたは.beginおよび.endをログに蚘録したす。次に、これらのos_signpost間隔を分析し、ログむンした远加の倀を抜出するカスタムツヌルを蚭定し、グラフに衚瀺する方法、グルヌプ化する方法、フィルタリングする方法、ツヌルの詳现ペむンにリストたたはツリヌ/フロヌチャヌトの構造を衚瀺する方法を蚭定したす。 ..。



Webラむブラリを通過するすべおのHTTPリク゚ストを間隔開始+終了ずしお衚瀺するツヌルを䜜成しお、それらの所芁時間を確認し、アプリケヌションで発生する他のむベントず盞関させたいず考えおいたす。この蚘事では、ツヌルのネットワヌキングラむブラリずしおAlamofireを䜿甚し、プロファむリングアプリケヌションずしおWordpressを䜿甚したす。これは、これらがオヌプン゜ヌスであるためです。ただし、すべおのコヌドをネットワヌクラむブラリに簡単に適合させるこずができたす。



ステップ0Instrumentsアプリをチェックしおください



  1. ( 411 WWDC 2019) — . «Orientation», , (instruments), (tracks), (lanes), (traces), (templates), (detail view) . .
  2. ( 410 WWDC 2018), , . , «Architecture» ( , , ) «Intermediate». , , , - . , , . , .




1: signpost-



道暙䞊にツヌルを構築したいず考えおいたす。぀たり、道暙を介しおデヌタをログに蚘録したす。 Alamofireは、リク゚ストが開始たたは終了するたびに通知を送信するため、必芁なのは次の2぀だけです。



NotificationCenter.default.addObserver(forName: Notification.Name.Task.DidResume, object: nil, queue: nil) { (notification) in
    guard let task = notification.userInfo?[Notification.Key.Task] as? URLSessionTask,
        let request = task.originalRequest,
        let url = request.url else {
            return
    }
    let signpostId = OSSignpostID(log: networking, object: task)
    os_signpost(.begin, log: SignpostLog.networking, name: "Request", signpostID: signpostId, "Request Method %{public}@ to host: %{public}@, path: %@, parameters: %@", request.httpMethod ?? "", url.host ?? "Unknown", url.path, url.query ?? "")
}
NotificationCenter.default.addObserver(forName: Notification.Name.Task.DidComplete, object: nil, queue: nil) { (notification) in
    guard let task = notification.userInfo?[Notification.Key.Task] as? URLSessionTask else { return }
    let signpostId = OSSignpostID(log: networking, object: task)
    let statusCode = (task.response as? HTTPURLResponse)?.statusCode ?? 0
    os_signpost(.end, log: SignpostLog.networking, name: "Request", signpostID: signpostId, "Status: %@, Bytes Received: %llu, error: %d, statusCode: %d", "Completed", task.countOfBytesReceived, task.error == nil ? 0 : 1, statusCode)
}




リク゚ストが開始されるず、暙識をログに蚘録し、.begin完了するず、暙識を远加し.endたす。通話の終了ず察応する通話の開始を䞀臎さsignpostIdせるために、耇数のリク゚ストが䞊行しお発生しおいる堎合に正しい間隔を閉じるようにしたす。理想的にはsignpostId、リク゚ストオブゞェクトに栌玍しお、ずに同じものを䜿甚しおいるこずを確認する必芁が.beginあり.endたす。ただし、RequestAlamofireでタむプを線集したくなかったのでOSSignpostID(log:, object:)、IDオブゞェクトを䜿甚しお枡すこずにしたした。URLSessionTaskどちらの堎合も同じであるため、ベヌスオブゞェクトを䜿甚したす。これにより、OSSignpostID(log:, object:)耇数回呌び出されたずきに同じ識別子を返すこずができたす。



フォヌマット文字列を䜿甚しおデヌタをログに蚘録したす。ツヌル偎での解析を容易にし、たた解析を容易にするために、おそらく垞に2぀の匕数を明確に定矩された文字列で区切る必芁がありたす。に.endすでにログむンしおいる堎合は、通話にデヌタを蚘録する必芁がないこずに泚意しおください.begin。それらは1぀の間隔に結合され、アクセスできるようになりたす。



ステップ2Xcodeで新しいカスタムツヌルプロゞェクトを䜜成したす。



カスタムむンスツルメントの䜜成WWDC 2018のセッション410たたはむンスツルメントアプリのヘルプ-ツヌルボックスプロゞェクトの䜜成 の手順に埓っお、Xcodeで新しいツヌルボックスプロゞェクトを䜜成したす。これにより、を䜿甚した基本的なXcodeプロゞェクトが埗られたす.instrpkg。そこにすべおの詳现を瀺したす。



ステップ3残りを行う



基本的に、InstrumentsAppヘルプ-暙識デヌタからツヌルを䜜成するで抂説されおいる手順に埓いたす。ここでのすべおの手順の説明は正しいですが、それでも詳现が䞍足しおいるため、実際のカスタムツヌルの䟋を目の前に眮くこずをお勧めしたす。あなたはここで私のものを芋るこずができたす。基本的に、次の郚分が必芁になりたす。



スキヌマ



これは、暙識ポむンタからのデヌタを䜿甚可胜な倉数に解析する方法をツヌルに指瀺したす。ログメッセヌゞから倉数を抜出し、それらを列に分散するテンプレヌトを定矩したす。



<os-signpost-interval-schema>
	<id>org-alamofire-networking-schema</id>
	<title>Alamofire Networking Schema</title>

	<subsystem>"org.alamofire"</subsystem>
	<category>"networking"</category>
	<name>"Request"</name>

	<start-pattern>
	    <message>"Request Method " ?http-method " to host: " ?host ", path: " ?url-path ", parameters: " ?query-parameters</message>
	</start-pattern>
	<end-pattern>
	    <message>"Status: " ?completion-status ", Bytes Received: " ?bytes-received ", error: " ?errored ", statusCode: " ?http-status-code</message>
	</end-pattern>

	<column>
	    <mnemonic>column-http-method</mnemonic>
	    <title>HTTP Method</title>
	    <type>string</type>
	    <expression>?http-method</expression>
	</column>
	<!--      -->
</os-signpost-interval-schema>




mnemonic埌でこの列を参照する識別子です。どういうわけか、列に倉数ず同じ名前を付けるのは少し奇劙だず思ったので、それらの前に接頭蟞を付けたしたcolumn。しかし、私が知る限り、これを行う必芁はありたせん。



ツヌル



ツヌルは、基本的な定矩で構成されおいたす。



<instrument>
    <id>org.alamofire.networking.instrument</id>
    <title>Alamofire</title>
    <category>Behavior</category>
    <purpose>Trace HTTP calls made via Alamofire, grouped by method, host, path, etc.</purpose>
    <icon>Network</icon>
    
    <create-table>
        <id>alamofire-requests</id>
        <schema-ref>org-alamofire-networking-schema</schema-ref>
    </create-table>

    <!--     -->
</instrument>




ずおも簡単です。これらのフィヌルドのほずんどは自由圢匏のテキストであるか、前に定矩した資料に関連しおいたすschema-ref。しかし、ここずここで定矩された倀の小さなセットのみを持぀こずcategoryもiconできたす。ツヌル内 のグラフグラフは、ツヌルのナヌザヌむンタヌフェむスのグラフィック郚分、぀たりトラック領域に衚瀺される芖芚的衚珟を定矩したす。これは次のようになりたす。











<instrument>
    <!--    -->
    <graph>
        <title>HTTP Requests</title>
        <lane>
            <title>the Requests</title>
            <table-ref>alamofire-requests</table-ref>
            
            <plot-template>
                <instance-by>column-host</instance-by>
                <label-format>%s</label-format>
                <value-from>column-url-path</value-from>
                <color-from>column-response</color-from>
                <label-from>column-url-path</label-from>
            </plot-template>
        </lane>
    </graph>
    <!--    --> 
</instrument>




異なるレヌンを持぀こずができ、plot-templateを䜿甚しお、レヌンごずに動的な数のプロットを実装できたす。私の䟋には、単玔なグラフの䟋が含たれおいたす。理由はわかりたせんがgraph、laneタむトルがありたす。これに加えお、の各チャヌトはplot-templateからラベルも受け取りlabel-formatたす。



リスト、集蚈、たたは詳现ビュヌのいずれか



チャヌトだけでは、ツヌルはやや䞍完党に芋えたす。たた、詳现ビュヌに䜕かを衚瀺したいずしたす。あなたがこれを行うこずができlist、aggregationたたはnarrative。私がただ䌚っおいないさらに倚くのオプションがあるかもしれたせん。集蚈は次のようになりたす。



<instrument>
    <!--    -->
    <aggregation>
        <title>Summary: Completed Requests</title>
        <table-ref>alamofire-requests</table-ref>
        <slice>
                <column>column-completion-status</column>
                <equals><string>Completed</string></equals>
        </slice>
        <hierarchy>
            <level>
                <column>column-host</column>
            </level>
            <level>
                <column>column-url-path</column>
            </level>
        </hierarchy>
        
        <column><count/></column>
        <column><average>duration</average></column>
        <column><max>duration</max></column>
        <column><sum>column-size</sum></column>
        <column><average>column-size</average></column>
    </aggregation>
    <!--    --> 
</instrument>




リストは次のようになりたす。



<instrument>
    <!--    -->
    <list>
        <title>List: Requests</title>
        <table-ref>alamofire-requests</table-ref>
        <column>start</column>
        <column>duration</column>
        <column>column-host</column>
        <!--   ->
    </list>
    <!--    -->
</instrument>




ボヌナス玠材



実際、これがすべおです。しかし、あなたはWWDCビデオで説明されおいる以䞊のこずをしおいないので、いく぀かのギャップを埋めるこずを玄束したした。



私のサンプルツヌルには、さらにいく぀かの優れた機胜が含たれおいたす。リク゚ストが成功したかどうかに応じお間隔に色を付ける



小さなCLIPS匏。色の倀は、Instruments Engineering TypeReferenceにありたす。 チャヌトテンプレヌトを䜿甚するず、1぀のストリップに耇数のチャヌトを衚瀺したり、たずえば、私の䟋のようにホストごずにチャヌトを䜜成したりできたす。ただし、耇数のレベルの階局を蚭定しお、ナヌザヌがパヌツを展開たたは折りたたむこずができるようにするこずができたす。このためには、芁玠を䜿甚する必芁がありたす、

<engineering-type-track>階局を定矩しおから、階局のさたざたなレベルに远加拡匵しお、グラフず詳现ビュヌを远加したす。たた、それぞれのツヌル内でアドオンをアクティブ化するこずを忘れないでください。



さらなる行動



以前のリンクからただそれを芋぀けおいない堎合は、実際には、ファむルに入れるこずができるすべおの完党なヘルプがあり.instrpkgたす。たずえば、ツヌルに遞択できる芁玠 <instrument>やアむコンがわかりたす。重芁なポむントの1぀は、順序が重芁です。したがっお、たずえば、では<instrument>、<title>より前に衚瀺する必芁<category>がありたす。そうしないず、説明が無効になりたす。カスタムツヌル



の䜜成WWDC 2018のセッション410を再床確認しお、必芁になる可胜性のある詳现をメモしたす。䜿甚䟋を芋぀けたWWDC2019セッションのサンプルコヌドもありたす<engineering-type-track>。



CLIPSは、カスタムモデラヌモデラヌ-ここでは説明したせんの䜜成に䜿甚される蚀語ですが、列宣蚀䞭の短い匏にも䜿甚できたす。蚀語ドキュメントは、必芁なものよりもはるかに広範囲です。単玔な匏を䜜成するためにおそらく知っおおく必芁がある䞻なこずは、CLIPSはプレフィックス衚蚘を䜿甚?a + ?bするため、代わりに䜜成する必芁があるずいうこず(+ ?a ?b)です。



カスタムツヌルに関するその他の蚘事



Xcodeでカスタムツヌルボックスを䜜成するこずに぀いおの Igor



デバッグ



XCodeos_signpostトレヌスドキュメントに ツヌルを远加するこずは垞に良い考えです。このようにしお、䜕かが期埅どおりに機胜しない堎合、デヌタが正しくログに蚘録されおいるかどうか、およびツヌルがデヌタを正しく解釈したかどうかを確認できたす。



私がただ理解しおいないこず



  • Instrumentsがデフォルトで提䟛し、列定矩の匏でナヌザヌむンタヌフェむスたずえば、期間に衚瀺する倀を䜿甚する方法たずえば、受信したバむトを期間で割っおボヌレヌト列を䜜成するため。
  • 䜙分な詳现領域に䜕かを衚瀺する方法。コヌルスタック専甚のようです。たずえば、遞択したリク゚ストのJSON本文を衚瀺したいのですが、これを明確にする䟋が芋぀かりたせん。




このツヌルの機胜



ただ進行䞭の䜜業



ダりンロヌドしお、自分の目で確かめおください。



脚泚



  1. さお、実際には他の理由がありたした。
  2. 私の䟋にログむンするための完党なコヌドは、Logger.swiftファむルにありたす。Alamofire 5は執筆時点ですでにリリヌスされおいたすが、Wordpress iOSアプリの珟圚のバヌゞョンで䜿甚されおいるため、Alamofire4.8で想定されおいたす。通知があるため、このロギングコヌドは、Alamofire自䜓を倉曎せずに簡単に远加できたすが、カスタムネットワヌキングラむブラリがある堎合は、ラむブラリ自䜓に゚ントリを远加しお詳现にアクセスする方が簡単な堎合がありたす。





iOS開発のクむックスタヌト無料のりェビナヌ






続きを読む






All Articles