2022 iOSDC Day2感想
Xcode が遅い! とにかく遅い!! 遅い Xcode をなんとかする方法
https://fortee.jp/iosdc-japan-2022/proposal/9d542893-3c30-4077-a85a-1c7ec68caa9c
資料
内容
- XCBBuildSeviceがCPU 900%でとまる
- XCBBuildServiceはSPMのバグを踏み反応しなくなる->XcodeはXCBBuildServiceを反応まってXcodeも止まる
- 問題のある処理をとめたい
- XCBBUILDSERVICE_PATH環境変数を変更
- XCBuildServiceProxyKit
- Xcode 14 beta2からこのバグが直ったそう🎉 めでたい
- ロック機構の問題
- clang内部のllvmのロック機構でビルド遅くなる
- https://clang.llvm.org/docs/Modules.html
- llvmはモジュールをビルドするときキャッシュする
- .lockファイルをつくってプロセスごとにロックを取れる仕組み
- ロックが取れなかった解放されるまでまつ
- llvm::LockFileManager::waitForUnlock()
- Ethernetの衝突検出に似た敷くっ身
- まず 10ms * ある範囲の乱数待つ(最大500ms)
- ロックの取り合いで処理が一つずつしか進まない状況になる
- ロックしないようにする
- Xcodeの問題点
- 基本的にAppleのみが更新
- 大きなアプリをビルドするように作られていない
- Bazel
- ビルドツール
- 一貫性を重視したツールで、キャシュを多用
- 大きなプロジェクトのビルドで標準で使われる
- Xcodeビルド置き換え
- External Build System
感想
Xcodeのビルドシステム、初めて知ってすごく興味深い内容でした。
動画だけじゃない!iOS 15のピクチャ・イン・ピクチャを使って好きなUIを表示させよう!
資料
https://twitter.com/tsuzuki817/status/1569141240410808327
サンプルコード
https://github.com/tsuzukihashi/sample-pip
UIViewをCMSampleBufferに変換するExtensionのgist
https://gist.github.com/tsuzukihashi/97e379a42e32cc0647aa7a4770d2d9a6
内容
- CMSampleBufferを作れるとPiPに載せれる
- UIViewからCMSampleBufferを作れる
- どんなViewもPiP表示できる
- PiPは実機が必要。デバックは実機で表示。
- バックグランドでのオーディオ再生ができるようにする
session.setCategory(.playAndRecode)
の組み合わせが必要
感想
PiPの細かな実装と注意方法が解説されていて参考になりました。
シーンに応じた使いやすいQRコード読み取り機能を実装しよう
資料
fortee
https://fortee.jp/iosdc-japan-2022/proposal/3a466fb6-b445-4e44-8f5f-b57b7e5b44dc
サンプルコード
https://github.com/jollyjoester/QRReaderSample
内容
- QRコード
- 1994年に(株)デンソーが開発
- 20文字程度 -> 数千字
- 誤り修正で多少汚れても読み取れる
- iOS 11から標準のカメラでも読み取れる
- AVFoundationでカメラ機能実装
- QRを検知する、AVMetaDataObjectDelegateをセットする
- sessionはブロッキングキューなのでメインスレッドでは実行しないように注意
- 枠の中で読み取り
- UIViewの座標をrectOfInterestに渡す
- 座標の変換必要
- 検知したQRコードの枠を表示
- 音によるフィードバック
- シーン1:シェアサイクル
- 1つのQRコード、野外、夜間、QRコードの距離が20-30cm
- トーチ、Zoom、QRを画面の真ん中扱う
- 在庫管理システム
- 複数のQRコード、暗い倉庫、連続読み取り
- トーチ(常時点灯)、音と振動、読み取り範囲の制限
- 範囲制限しないと周りに複数のQRコードがあるので誤爆する
- コード決済
- 1つのQRコード、明るい店舗
感想
AVFoundationの実行おさらいよかった。
シーン別のQRコード読み取りに気をつける点、良かった。
LINE iOSのビルド環境の変遷
資料
https://fortee.jp/iosdc-japan-2022/proposal/ac7d5226-f64b-42ff-8d08-b8960d4021ca
内容
- LINEのビルド、1時間かかってた。
- Bazelを使う
- Preview,
- Debugが動かない、Indexがうまく動かない
- 学習コストが高い
- ドキュメントの資料が不足
- 勉強会やドキュメントの整備が必要
- BUILDファイルの設定が困難
- ライブラリー管理が大変
- 各依存ライブラリーのバージョンが予測しにくい
- 重複宣言のConflictを解決するResolerがない
- 直接及び間接依存をすべて宣言する必要がある
- キャッシュの管理が大変
- キャッシュを管理するツールがない
感想
Bazelに問題さまざまありますが、それでもビルド時間早くなるのは正義だなーっては思います。
CI上のunit testに1時間も待ってられない。。
ビルドシステムに興味が出てきたセッションでした。
今年の自分の研究テーマにしようかな?
Swift Concurrency時代のiOSアプリの作り方
資料
内容
- Swift Concurrencyをつかってログイン機能を作る
- Sendableは明示的にしたほうがいい
- DateはXcode 13はSendableじゃない
- Xcode14ではDateはSendable
- Xcode 13では
@unchecked Sendable
を書く
- Sendableにしても安全な型なら
@unchecked
をつける- 安全じゃないならつけない
- IBActionからTaskを呼ぶ
- Task.initのクロージャーはMainActorを引き継き、メインスレッドで実行
MainActor.run
とTask { @MainActor in }
の使い分け- Task内でメインスレッド以外を呼び出す方法
Task.detached
を使う- 後続処理がある場合は
Task.detached{}.value
で値を取る
- ファイル操作の型をactorでシングルトンにする
- ViewModelの導入
@MainActor
で保護する
- テスタブルにする
- コアレイヤーパターン
- AuthServiceの機能をDIできるようプロトコルで表現
- testメソッドは
async
で定義すればよい
Task.yield()
を使う
感想
いいなって思ったところ
- ファイル操作の型をactorでシングルトンにする
- actorのインスタンスごとに保護されるからインスタンスは一つでよい
Sendable
の適応条件を列挙しているところわかりやすかった。Task { @MainActor in }
とawait MainActor.run {}
の使い分けわかりやすかった。