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.runTask { @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 {}の使い分けわかりやすかった。