HackerQuest

No app, no life

趣味と実益を兼ねてプログラマをやっている者👨‍💻

iOSDC2022 Day1 & Day2 参加記録

Day0に引き続きDay1&2のiwillblog Day0の記事はこちらから

pasokatu.hateblo.jp

全体の感想

2019年から連続4回目の参加となりました! 新卒でiOSエンジニアとなった自分が会社の先輩におすすめされて初めて参加したカンファレンスでした! 初めてのLTで岸川さんの発表を見て難しいけどとても感動したのを覚えています。 そんな自分もスピーカーとして参加できる日が来て感動しております(。•́ωก̀。)…グス 立木さん自分の名前を読んでいただきありがとうございます! 来年は現地参加したい

以下はそれぞれのセッションと感想

Swift Concurrency Next Step

fortee.jp

おさらい

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でドット絵を描こう

fortee.jp

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

ディープリンク

fortee.jp

友達招待キャンペーンなどにも使える!

アプリへユーザーを連れてくるための仕組み → ディープリンク

概念

アプリの特定のコンテンツをURIで表現 対象のURIをリクエウスとした際にアプリの特定のコンテンツにアクセスするためのもの

アプリの特定の画面をURIで表現し、踏むとそこに遷移させること

特定のウェブサイトに関連づけられたアプリがインストールされている場合ウェブサイトURLから直接アプリ内のコンテンツを開けるようになるもの

カスタムURLスキームとは?

https, http以外の独自のスキームを識別して対応するアプリを開くことができる機能 悪用される危険性がある

インストールされていないアプリを対象としたディープリンク

ディファードディープリンク

アプリインストール後に起動された後、目的のコンテンツへ誘導することができる iOSクリップボードを使う Android → 公式の機能がある

ディープリンクを手軽に利用できるようにするためのサービス - Firebase Dynamic Links - Adjust

ユーザー状態や複数経路 Crossroadというライブラリで複数のリンクからの流入を一つ乗るウーと定義で多様な経路からの流入に対応できる

Firebase Dynamic links builderで招待リンクなどに使うURLの短縮URLを作ることができる

感想

Androidにはディファードディープリンクの仕組みが公式であるのにiOSにはなく、クリップボードを使って頑張っているのは辛い さらにiOS16からはクリップボード周りの権限が厳しくなるのでApple様にはそろそろ公式のディファードディープリンクの仕組みを用意していただきたいなと思った、あとFirebase便利

PiPを応用した配信コメントバー機能の開発秘話と技術の詳解

fortee.jp

ミラティブは配信アプリ → 視聴者がいる 配信者は基本的にミラティブアプリを開いていない → これまではPush通知でコメントを表示していた

R&Dチームが試作品を作り、技術的に何ができるのかできないのか PMやデザイナーに伝えていた

画面共有中のPush通知がiOS15.1からデフォルトオフになったため事故 → PiPの後押しとなった

更新頻度は1秒に一回

Unityのアバター描画とPiPの更新がメインスレットで走るため処理を軽くしないと画面がチラついてしまう 更新頻度が低いものをあらかじめ画像として用意して、更新するものを画像の上に置いていく方式で解決

感想

開発ストーリーが完璧だった PiPの新機能に最初から目をつけていたR&Dチームの人たちもすごい 未知の領域を開拓していく技術力に感動しました

MLOps for CoreML

fortee.jp

機械学習を実践投入する際にいい感じに運用していくための諸々

  • モデルの継続的トレーニング 学習パイプラインの自動化をするのが大事 実験を多く回せるようにする

パイプラインの実行を自動化 → 時間と共にモデルの推論制度が劣化するため 精度を監視してトリガー実行 モデルの継続的トレーニング 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のピクチャーインピクチャーという機能を利用して、動画ではなく自分の書いたメモが流れます。

一度流せば、メモがどのアプリを開いていても表示され続けるので強制的にメモが目に入るため、忘れ物の防止・学習用途などに使われています。

流れるメモ帳

流れるメモ帳

  • Ryo Tsudukihashi
  • 仕事効率化
  • 無料
apps.apple.com

iOS14からPicture In Picture自体は可能だったのですが、基本的には動画しか利用することはできませんでした。

iOS15でPicture in Pictureに新しいAPIが追加され、任意のUIViewを利用することが可能となり、今回のアプリが生まれました。

(以下の記事をTwitterで見つけて知りました)

配信コメントバー 〜 iOS15 で実現する新しい PiP 体験 - Mirrativ Tech Blog

詳しい実装方法などについては今年のiOSDC2022で話す予定ですので、お楽しみに!

fortee.jp

Ryo Tsuzukihashi