iOSDC 2022 に参加した
会社では普段は web フロントエンド (たまにバックエンド) をやっているけれど、そのうち iOS もやっていきたいという話をしていて、モチベ上げるためにも良さそうということで参加してきた。
自分用メモと感想。メモは理解できた部分の要約。
/icons/hr.icon
0日目
試作基盤としてのディープリンク
「アプリへユーザーを連れてくるための仕組み」としてのディープリンク
URL 開くとアプリ (の特定のコンテンツ) が開くやつ
Custom URL Scheme (chrome:// とかで始まる) と Universal Links (https://, http:// で始まる) がある deferred deep link: アプリがインストールされていてもいなくてもいい感じに遷移させられる
インストールされている場合: そのまま遷移する
されていない場合: App Store に遷移し、初回ダウンロード後に
クリップボードにディープリンクのパラメータを保持 → 次のアプリ起動時に読み出し、とかをしている
【 ブラウザからアプリを開いた時に「Safari からコピー」って言われるのはこれか! ずっと何だろうと思ってた
ディープリンクを手軽に利用できるサービスがある (Firebase Dynamic Links とか)
チュートリアルが完了してから deferred deep link の遷移を実行させるみたいなこともできる
コンテキストを理解したまま、 App Store への遷移 → インストール までしてもらうために
Firebase Dynamic Links のプレビュー画面をカスタマイズする
AppStore で特定の URL で開かれた場合に表示するスクリーンショット等を変える
これは最近入った
PiPを応用した配信コメントバー機能の開発秘話と技術の詳解
配信に対するコメントを picture in picture で表示している
アプリがバックグルアンドになっても表示されて嬉しい
世の中にまだ無い実装だったので技術の検証をしながら進めていた
吹き出しの画像の裏側にめちゃくちゃ小さい動画を再生している
UIView で描画した内容を CVPixelBuffer (動画を表示するやつ?) に書き込む
描画コストとの戦い
コメントバーの描画が重すぎてモデルがチラついたりしてしまう
このへんはさっぱり理解できなかったけど工夫したら改善したらしい
描画の回数: 更新頻度の高い要素と低い要素を分けて、更新頻度の低い要素を1枚画像として生成 → 高い要素はその上にスタンプを押すように画像を置いていく
プロトタイプをつくる → 描画コストなどの改善 → リリース の流れ
【感想】動画変換まわりの話は難しくて分からなかったけど、リリースに漕ぎ着けるまでの話とか含めて面白かった
PWAの今とこれから、iOSでの対応状況
PWA という言葉ができたのは2015年
【感想】 意外と遅い
serviceworker に js 等をキャッシュしておいてもらうことで、オフラインでも起動できる
iOS では共有メニューから「ホーム画面に追加」を押してもらうしかないが、 iOS 以外 (Android など) ではブラウザの下部にプロモーションを出せる
通知: Push API を serviceworker から叩く
PWA をネイティブアプリでくるんでストアで配信することもできる
【感想】 WebView 使うのとどっちが良いんだろう
iOS におけるサポート
Safari 11.3 〜 ServiceWorker
通知は Safari 16 から、iPad OS が先なので iOS は 2023〜
日本は PWA が盛り上がりにくい土壌
ネットワーク環境が整っているのでオフラインになることが少ない → web で良いのでは? となる
【感想】 非 iOS エンジニア目線だと web と同じようなコードで iOS アプリっぽいものがつくれる (特に、通知を送れる) というのが一番のメリットなので、まずは通知がきてくれないと始まらないという印象 Safari 16 …
広まれSafari Web Extensions!Safari Web Extensions の始め方
基本的には Chrome 拡張とかとほぼ同じように実装できる
発表内容は拡張機能のつくり方がメインだったので、 Chrome 拡張とか作ったことあったらだいたい知ってそうな感じだった
【感想】 リリースするためには通常の iOS アプリと同じように App Store で配布するしかないのかな 手元でビルドして端末で動かすだけならできる?
1日目
アニメーションAPIのすべて
UIView と CALayer というものがある
UIView でできないような高度な描画をしたいときに CALayer を使う
角丸、影、枠線、 3D 変形など
暗黙的アニメーション: CALayer のほとんどのプロパティは、デフォルトでアニメーションをともなって変化する
ただし、 UIView によって管理されている CALayer の場合はデフォルトでこれが無効化されている
React NativeからNativeアプリへ スタートアップ企業における「機能開発と保守性担保」の両立への挑戦
移行理由
iOS の update への追従が遅れる
iOS ネイティブの機能を使いたくてもライブラリ越しに触る形になってしまう
ビルドが遅い
Android は後追いでよかった
React Native Bridge
CoreGraphicsでドット絵を描こう
ドット絵というのは、解像度などの制約がある環境で使われてきた
制約をつけた環境を用意する
ドット絵エディタ: CGContext を用意 → タップされた位置のポイントを塗りつぶす → 画像を生成して表示
楕円を描く
組み込みの楕円関数を使うだけだとアンチエイリアスがかかって不自然な感じになる
Bresenham’s line algorithm を使う
塗りつぶす
ポイントの色を調べる必要がある
メモリレイアウトを調べて CGContext の data から取り出す
XCode にはメモリを確認する機能がある
Debug > Debug Workflow > View Memory
色をつける
インデックスカラー: メモリ上では256色のグレースケールと同じように扱い、対応する色のインデックスを持っておく
メモリを節約できる反面、色数が制限できることによるデメリットもある
【感想】 レトロゲームで使われていた技術が今も使えるというのが面白い
入門 SwiftUI Alignment Guide
【感想】 初心者向けのトークがあるの嬉しい
【感想】 と思ったけど結局ほぼ分からなかった……
詳解 Core NFC - NFC を用いた iOS App 開発のてびき
NFC は Near Field Communication
標準化団体がある
Apple Watch には NFC が搭載されているけれど Core NFC は watchOS では使用できない、NFC を使ったアプリを開発できるのは iOS 11 以降の iPhone のみ
Core NFC でできること
NFC タグからのデータ読み取り・書き込み
できないこと
カードエミュレーション: Passkit
ピアー・ツー・ピア
ワイヤレス充電
iPhone の NFC は端末の上側
LT 大会
神速iOSDC
過去のトークを全部分類していてすごい
Apple Watch
Apple Watch の歴史はセンサ搭載の歴史
SF Symbols アートの世界
SF Symbols の SF は San Fransisco (フォント)
LEGO
LEGO の Bluetooth 通信プロトコルは公開されている
Server-side Swift で ISUCON
Server-side Swift にフルスクラッチで移植
移植自体は4時間くらいでいったけど色々ハマりどころがあり、結局ベンチが通らなかった
【感想】 フルスクラッチ移植が完了したのすごい
アカウント削除
「リジェクトされないラインを予測して用件を決める」
ENPA Architecture
COVID-19 の濃厚接触者が近くにいるときに通知してくれる
COCOA で使われているやつっぽい
バックポート
特定バージョン以降の iOS にしか提供されていない API をそれ以前のバージョンでも使えるようにする
UiStackView
【感想】 逆引きレシピ1: HTML + CSS Grid 使ってスペーシングするときと同じ感じだ
spacer 要素を入れるよりは意味ごとにグループをつくってスペーシングしたほうが良いよねというの、わかる
【感想】 逆引きレシピ2: CSS media query 使ってレスポンシブデザインつくるときと同じ感じだ
手で触れずに
音声認識
顔認識
文字認識
気圧
2日目
Xcode が遅い! とにかく遅い!! 遅い Xcode をなんとかする方法
XCode を立ち上げてすぐに indexing がハングアップして動かなくなることがある
XCBBuildService が途中でバグを踏んで止まるらしい
XCBBuildService を呼ぶ前に、バグを踏む可能性のあるリクエストをプロキシする
XCBBuildService のバグ自体は Xcode 14 Beta 2 で直っている
たまに普段よりビルドが遅くなる
swift-frontend プロセスが複数立ち上がっているのに1つしか働いていないみたいな状態になる
clang 内部にある llvm のロック機構が原因
モジュールのビルドのロックを取り合い続ける
BuildingImplicitModuleUsesLock という、ロックを使わなくするオプションがあり、それで回避できる
Xcode 以外のビルドツールもある
メジャーなのは Bazel
即時通知を導入する際に考えるべきこと
通知要約という機能がある
届いた通知を指定した時間にまとめて配信できる、要約に含めるアプリはユーザーが指定する
【感想】 この機能初めて知った
即時通知はユーザーの設定によらずすぐに配信される
通知の interruption level
Passive, Active, TimeSensitive, Critical
TimeSensitive にすると即時通知になる
即時通知を使うべき場所
位置情報に応じて通知されるもの
スケジュールの通知
【感想】 Android にも同じように通知の種類があるのかな
【感想】 pixiv だと使う場面少なそう
【感想】 どの通知を即時通知にするべきか、どちらかというとエンジニアというより PM (またはデザイナー) が判断すべき領域な気もする
サーバーと同期してリアルタイムに更新する画面を実装する
リアルタイム更新の通知を受信する方法
1. polling
2. サイレント push 通知
通知の content-available プロパティを設定するとサイレントにできる
ユーザー設定で通知オフにされていると使えない
【感想】 通知の本来の目的から外れた使い方なので難しそうな印象
3. Firetime Realtime Database / Cloud Firestore
なんか Firebase がいい感じにしてくれるやつ
デメリット: Firebase に DB が依存する
4. WebSocket
ライブラリもある
【感想】 WebSocket は通常のブラウザでも対応できるから他プラットフォームでも使い回せるし、少し大きめのプロダクトならほぼこれ一択になりそう
Cluster アプリではこれを採用
LINE iOSのビルド環境の変遷
【感想】 ビルドエンジニアという職業があるんだ
Fast, Correct: ビルド時間と再現性 (冪等性) に優れている
パフォーマンスは圧倒的に改善された
メンテコストが課題
XCode の新機能が Bazel 未対応な場合があるので、それを使うためには xcodebuild と両方使う必要がある
デバッグ機能が上手く動かないなど、ローカル環境での開発者体験の悪化
ビルドの速さを支えるのはキャッシュとインクリメンタルビルド
CI の場合はキャッシュが嬉しい、ローカルの場合はインクリメンタルビルドが嬉しい
M1 Max は xcodebuild のほうがインクリメンタルビルドが速かった → ローカルでのビルドは xcodebuild でビルドするように
The state of Swift for WebAssembly in 2022
【感想】 この発表めっちゃ面白かった
swift を書いてビルドすると .wasm が生成される
実際にプロダクションでも使われている
GoodNotes でノートをシェアする web viewer: 既存の Swift コードをつけるメリットがある
Luminal: 新規開発の web サービスだけどどうしても Swift を使いたかったらしい
ブラウザで動かす以外のこともできる
各種 OS へのポータビリティを持つバイナリ形式として期待されている
jvm と比べてランタイムが軽い
VSCode Extensions, Fastly
Slackbot を動かすデモ
【感想】 実用レベルなことに驚いた
【感想】 発表内容と発言の端々から Swift の書き心地の良さが伝わってくる
目からビームでヴィランをやっつける 〜ARKitの知られざる並走機能〜
ARKit
2017年からある
並走機能: フェイストラッキング (フロントカメラ) とワールドトラッキング (バックカメラ) を同時に動かす
この呼び方は公式ではないらしい
HCI の研究分野で注目を集めている
WorldGaze
フェイストラッキングでユーザーの視線方向を、ワールドトラッキングでその方向にある建物などを認識して注目対象を推定
HandyGaze
【感想】 スマホが邪魔そう AR グラスが出て、それでアイトラッキングができたら革命っぽい
ミダスタッチ効果: 探索のための視線移動なのか、選択のための視線移動なのかの判別が難しい
キャッシュによる状態管理のアーキテクチャ
データを防ぐためには、グローバルな state を single source of truth として維持していく必要がある
でも View がネストしているとバケツリレーがつらい
Redux は過剰だよね → React Query, SWR: リクエスト単位でキャッシュ
Swift で同じようにリクエスト単位のキャッシュを実現する話
複数のデータに影響するようなプロパティの変更があった場合に、影響するすべてのデータをもれなく更新するのは難しい → キャッシュの正規化
CoreData
インメモリで状態が変化するような Client State を管理する場合は、リクエスト単位のキャッシュよりも TCA のほうが向いていたりする
LT
CarPlay向けのアプリ
UiKit 使えない、自由度が低い
用意された Template を使う
シミュレータでデバッグできる
jailbreak
jailbreak を行う方法
どうやって・どこまで対応するかみたいな話
鉄道
線路には電流が流れているが、鉄道が上を走っているときだけ流れないので走行位置がわかる
その情報は運輸司令所に集約される
混雑状況の予測
車両ごとに重さを測るセンサーがついている
他社路線は加重データが取れない
Navitime の経路検索履歴
カメラでスマホの保持台数を認識
Flutter
VisionKit クレジットカードスキャナー
サッカースタジアムをスキャン
VPS: Visual Positioning System
技術選定
Immersal SDK
スタジアムを撮影して回ってデータを取得 → 位置あわせ
【感想】 デモがすごくてわくわくした これスマホ1台でできるんだな
サポートiosバージョン
OS じゃなくてデバイスを基準にしたほうが良い
出席管理アプリ
BLE ビーコンを教室に設置して、教室にいるかどうかを検知できるように
不正打刻の防止: NTP
【感想】 学生でこんなにしっかりアプリの開発体制つくってるのすごい
GDPR
UIKit で型パラメータのインジェクト
SceneKit and SwiftUI
SceneKit とは: 3D グラフィックフレームワーク
iPadOSDC
Swift Playground の話
iPad で Swift 開発ができる
XCode との違い
Playground が違う
.xcodeproj がない
良い点: プレビューが爆速
悪い点: いっぱい
ネットワークチームシークレットLT
音声プラットフォーム「Voicy」のiOS開発について
開発体制 (チーム編成) を変えたという話
機能追加ごとに受け入れ要件を定義して受け入れテストを行っている、通ったものだけ release ブランチに入れる
/icons/hr.icon
その他感想
部屋によって温度が違ったりするので羽織りものがあると良い
名札の、本来は名前・ハンドルネームが表示される場所に会社名が大きく入っていてちょっと恥ずかしかった (どこかで入力間違えたかな……)
ノベルティがめちゃくちゃ多くてちょっと戸惑った
スライドの上にコメント流れるの楽しい、やっぱりこういうイベントはニコ生がいいなあ
オフラインで発表を聞くのは数年ぶりだったけれど、スライドの文字が思ったより読めず、視力の低下を実感した
踏み込んだ実装の話とかはやっぱり理解できなかったけど、「こういうこともできるんだな〜」というのをたくさん知れて面白かった
あと、たまに web フロントエンドと近い話があったりもして (リアルタイム更新の話とか状態管理のアーキテクチャが輸入されていたりとか) 、そのあたりの意外な共通点が見つかったのも面白かった