iOSDC2022 Day1 & Day2 参加記録
Day0に引き続きDay1&2のiwillblog Day0の記事はこちらから
全体の感想
2019年から連続4回目の参加となりました! 新卒でiOSエンジニアとなった自分が会社の先輩におすすめされて初めて参加したカンファレンスでした! 初めてのLTで岸川さんの発表を見て難しいけどとても感動したのを覚えています。 そんな自分もスピーカーとして参加できる日が来て感動しております(。•́ωก̀。)…グス 立木さん自分の名前を読んでいただきありがとうございます! 来年は現地参加したい
以下はそれぞれのセッションと感想
Swift Concurrency Next Step
おさらい
Structured Concurrency - Task間で階層構造を作って同時処理を実行
Unstructured Concurrency - 独立している
Actor - データ競合を防ぐ
最近のUpdate情報
non-isolated Actorに守られていない エグゼキュータ asyncコードを実行する
実行エグゼキュータの明確化
Sendableチェックのルール変更 全てのasyncコードの引数と戻り値は全てSendable ただし同じActorの場合は問題ない
Clock, InstantProtocol, DurationProtocol 時計、瞬間、期間 iOS16以降のみ
Strict Concurrency Checking - 将来エラーになるコードをワーニングとして検知できる Build Settingsからチェック 三つのモードがある
実装上の注意
MainActorブロッキング MainThreadを抽象化した特別なActor UIがフリーズしてしまう現象 可能な限りバックグランドで処理をする
Actor競合 並列処理中で共有したActor jounosyorigahairutosyo処理まちが協業 Actor上での競合を減らす
強調スレッドプールの枯渇 「スレッドは常に動き続けることができる」を意識する
Task内でブロックを避ける ブロックする場合は最小の範囲で デバッグ方法で強調スレッドプールのサイズを1にできる
- Continuationの誤用 既存のコールバックをasyncに変換するために使う
ルール 全ての実行パスで必ず1回ずつ呼ぶ
CheckedContinuationを使って開発時にチェックできる
Actorとリエントラント
Actorは他の処理を実行できる
注意!「リエントラント中に内部状態が変わることがある」
Actor処理の実行順序
Priorityを尊重する 呼び出した順に実行されるとは限らない
Task.initなどのクロージャ内は順番に実行される
強調キャンセル
タスクの階層構造内の下層にあるTaskがエラーをスローしたり上層のTaskがキャンセルされた場合に他もキャンセルになる
メモリリーク
Task.initにはselfが不要 スコープ内に参照が閉じている
画面が閉じるタイミングでキャンセルすれば問題ない
インスタンスの解放遅延
弱参照されたものは保持されないことに注意 強参照すれば保持される
MainActor.run Task { @MainActor }の違い
どちらもスコープ内はメインスレッドで処理される
MainActor - 即座に処理が実行 - asyncコンテキストで実行
Task - 次のRunLoopで処理 - Sync
Sendableクロージャの誤解
Sendable以外はキャプチャできない 可変変数はキャプチャできない
Swift Async Algorithm Package
非同期に連続で流れてくる値を分かりやすく処理できる
SequenceからAsyncSequenceの生成 AsyncSequence の結合 zipで結合してタプルで出力
感想
Swift Concurrencyはまだまだ移行期なので挙動をちゃんと確認して導入していく必要があると感じました! Swift ForumsやSwiftのリポジトリ、テストコードなどをチェック Swift6で破壊的変更があるので備えておきたい
CoreGraphicsでドット絵を描こう
interpolation(.none)で画像自体のリサイズができるがメモリを多く表示するため注意
楕円のアルゴリズム Bresenhams line algorithm noppefoxwolf/swift-line-algorithm
塗りつぶし Flood Fillというアルゴリズム Swiftなら型安全にメモリを直接・書き込みして高速化できる
noppefoxwolf/PixelArtKit
感想
ドット絵のアプリを作って見たくなった! 大体大変なところはnoppeさんが解決してくれてそうw PiPでの話でも出てきたCGContext周りが詳しく解説してくれてそちらの理解も深まった! CoreGraphicsはSwiftUI時代においても強力
Day2
モバイルアプリのオブザーバビリティを向上させるプラクティス
モバイルアプリの信頼性はむずい
プラクティス
- レポート システム全体の状態、ユーザー体験
定期的なメトリクス確認 → マイリリースごとにメトリクス指標の確認 → 確認したものをレポートとして共有
全体 ・DAU バックエンド ・APM ・各種インフラのステータス
ネイティブ ・Firebase Crashlytics ・Firebase Performance ・Xcode Metrics ・アプリサイズ
データを一回で集める
サンプルで試せる
「ここに確認するだけでなく相互に起きうる影響に関するコミュニケーションをとる」
SLI/SLO SLI : サービスの可用性、品質を計測する指標 SLO: 核SLI
モバイルアプリの可用性
アプリケーションが利用可能でない状態の例
ユーザーのUXへの期待値
メッセージの読み込み速度 フリックできるまでの時間
カスタムキーの設定
トレース
パースエラーの検知
ユーザー問合せ調査のトレーサビリティ向上 ダイアログにエラーコードを記載
感想
オブザーバビリティの向上と聞くと一見難しそうに思えたが、実際はユーザーのことを考え一つ一つ指標を立てて継続的に改善していくということで自分でも少しずつできることがありそうだと思えた! FirebasePerformanceをまずは使いこなせるようにしたい
iOSDC 2022 Day0 にオンライン参加してきました
今年もiOSDC2022に参加してきましたのでiwillblogしたいと思います。 Day0の内容になりますmm
ディープリンク
友達招待キャンペーンなどにも使える!
アプリへユーザーを連れてくるための仕組み → ディープリンク
概念
アプリの特定のコンテンツをURIで表現 対象のURIをリクエウスとした際にアプリの特定のコンテンツにアクセスするためのもの
アプリの特定の画面をURIで表現し、踏むとそこに遷移させること
Universal Links
特定のウェブサイトに関連づけられたアプリがインストールされている場合ウェブサイトURLから直接アプリ内のコンテンツを開けるようになるもの
カスタムURLスキームとは?
https, http以外の独自のスキームを識別して対応するアプリを開くことができる機能 悪用される危険性がある
インストールされていないアプリを対象としたディープリンク
ディファードディープリンク
アプリインストール後に起動された後、目的のコンテンツへ誘導することができる iOS → クリップボードを使う Android → 公式の機能がある
ディープリンクを手軽に利用できるようにするためのサービス - Firebase Dynamic Links - Adjust
ユーザー状態や複数経路 Crossroadというライブラリで複数のリンクからの流入を一つ乗るウーと定義で多様な経路からの流入に対応できる
Firebase Dynamic links builderで招待リンクなどに使うURLの短縮URLを作ることができる
感想
Androidにはディファードディープリンクの仕組みが公式であるのにiOSにはなく、クリップボードを使って頑張っているのは辛い さらにiOS16からはクリップボード周りの権限が厳しくなるのでApple様にはそろそろ公式のディファードディープリンクの仕組みを用意していただきたいなと思った、あとFirebase便利
PiPを応用した配信コメントバー機能の開発秘話と技術の詳解
ミラティブは配信アプリ → 視聴者がいる 配信者は基本的にミラティブアプリを開いていない → これまではPush通知でコメントを表示していた
R&Dチームが試作品を作り、技術的に何ができるのかできないのか PMやデザイナーに伝えていた
画面共有中のPush通知がiOS15.1からデフォルトオフになったため事故 → PiPの後押しとなった
更新頻度は1秒に一回
Unityのアバター描画とPiPの更新がメインスレットで走るため処理を軽くしないと画面がチラついてしまう 更新頻度が低いものをあらかじめ画像として用意して、更新するものを画像の上に置いていく方式で解決
感想
開発ストーリーが完璧だった PiPの新機能に最初から目をつけていたR&Dチームの人たちもすごい 未知の領域を開拓していく技術力に感動しました
MLOps for CoreML
機械学習を実践投入する際にいい感じに運用していくための諸々
- モデルの継続的トレーニング 学習パイプラインの自動化をするのが大事 実験を多く回せるようにする
パイプラインの実行を自動化 → 時間と共にモデルの推論制度が劣化するため 精度を監視してトリガー実行 モデルの継続的トレーニング Continuous Training (CT)
CoreML → オンデバイス上で推論・学習を行う機械学習フレームワーク Appleのデバイスの性能を最も活かせるのはCoreML
TensorFlowモデルをCoreMLモデルに変換するだけで、300%の高速化する場合もある
MLflow ローカル環境で軽量に利用できる
GitHub - mlflow/mlflow: Open source platform for the machine learning lifecycle
iCloudの機能でモデルだけ更新できる
感想
CTという概念を初めて知った 基本的に自分は一度作ったモデルはそのままにしてしまっていたので、とりあえず更新するところから初めて、ひとつひとつ自動化していきたいなと思いました CoreMLに変換することでAppleデバイスの真の性能を引き出せる
個人開発したアプリ紹介「流れるメモ帳」
2021年12月にリリースしたアプリです!
iOSのピクチャーインピクチャーという機能を利用して、動画ではなく自分の書いたメモが流れます。
一度流せば、メモがどのアプリを開いていても表示され続けるので強制的にメモが目に入るため、忘れ物の防止・学習用途などに使われています。
iOS14からPicture In Picture自体は可能だったのですが、基本的には動画しか利用することはできませんでした。
iOS15でPicture in Pictureに新しいAPIが追加され、任意のUIViewを利用することが可能となり、今回のアプリが生まれました。
(以下の記事をTwitterで見つけて知りました)
配信コメントバー 〜 iOS15 で実現する新しい PiP 体験 - Mirrativ Tech Blog
詳しい実装方法などについては今年のiOSDC2022で話す予定ですので、お楽しみに!