iOSDC Japan 2021 day2 参加セッションの感想

# はじめに
ついに最終日になってしまいました。。。
昨日までに引き続き、今日も感想を書いていこうと思います。
悔いのないように全力で参加します！

[iOSDC Japan 2021 前夜祭をタイムシフトで追いかけて](https://qiita.com/Sab_swiftlin/items/27a50a4e0970866e1a0b)
[iOSDC Japan 2021 day1 参加セッションの感想](https://qiita.com/Sab_swiftlin/items/fd3b4f0626b087a1aef1)

# バックグラウンドでアプリがキルされても怖くない！アプリの状態を元に戻すリストア機能の全て
https://speakerdeck.com/coe/iosdc-2021-restore

リストアに関しては今までAndroidでは意識していたのに、iOSではなぜか意識していなかったことに気付き参加しました。

![スクリーンショット 2021-09-19 10.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/022bfbe7-3ee2-db7b-3397-53bb3793d653.png)
![スクリーンショット 2021-09-19 10.54.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/a97a0471-2f57-7cdf-703b-038e5c895edb.png)

たったこれだけでリストアできるようになるというのは知らなかったのでとても勉強になりました！

![スクリーンショット 2021-09-19 10.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/2f542c94-6b68-f64f-900e-cf05f2d586f0.png)
![スクリーンショット 2021-09-19 10.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/e6bd7386-23a7-dd9e-56c7-5ac4c023cc1b.png)

入力中データの復元は`NSCoder`にセットすればリストアできるというのも手軽で良いなぁと感心していたら...
`SceneDelegate`が入ると機能しないとの事で衝撃を受けました。笑
でも`SceneDelegate`での`NSUderActivity`を使った対応方法もしっかりご紹介いただき、`Storyboard`だけでなくSwiftUIでの対応もすぐに取り入れたいほど参考になりました。

スポットライト検索でアプリの機能がヒットするようになるというのも感動でした！

# 元ゲーム開発者が贈る描画パフォーマンス改善
https://github.com/sidepelican/iosdc2021/tree/main/Presentation

iOSの描画の仕組みにはあまり触れる機会がなかったので個人的に興味があり参加しました。
Flutterの描画をMetalDebuggerを使って描画の流れを追うという発想はなかったので目から鱗でした。

![スクリーンショット 2021-09-19 11.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/468fe2ab-95d5-eb10-f760-baef425274d9.png)
![スクリーンショット 2021-09-19 11.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/c7e66180-ab22-0647-c027-72a767fa4c16.png)

さらにライブデバッグのような事もされていて手順や見方がとてもわかりやすかったです。
テクスチャーの説明についても初めて聞く話でとても興味深かったです。

![スクリーンショット 2021-09-19 11.40.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/48371ac2-660b-e4a5-1f7e-1d57ad4fdc30.png)

UIKitに関してはオフスクリーンレンダリングが重くなる原因なんですね。

![スクリーンショット 2021-09-19 11.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/f0d9b8eb-63b3-72a1-7a12-0ef113d5ceac.png)

発表者さんのUIKitの描画の考察もとても納得感がありました。

![スクリーンショット 2021-09-19 11.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/e20e11bf-4dff-ad98-5c1d-778e07dc6e61.png)

昨日の発表でもありましたが、やはり改善をしたい場合はまず計測が大事なようです。
描画に関してはaAnimationHitchesというものを使って計測が可能との事でした。

![スクリーンショット 2021-09-19 11.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/7ded3c51-2cbb-5192-29c5-595392489cf4.png)

オフスクリーンレンダリングをなくす工夫もとても勉強になりました。
アルファブレンドについても意識していなかったので今後は気にしていこうと思います。

最後の発表スライドもSwiftUIで実装されていたという衝撃告白にめちゃくちゃ驚きました！
スライドのスクロール操作どうやってやっているんだろうとは思っていましたがまさかそんな方法があったとは！
技術力も素晴らしくとても楽しいセッションでした。

![スクリーンショット 2021-09-19 12.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/ea0025de-c0ec-4680-072d-186a8d78b8d7.png)

発表で使われた絵文字表示アプリは以下のリポジトリで確認できるようです。
https://github.com/sidepelican/iosdc2021/tree/main/EmojiMania

# WidgetKitで良い体験を作るには
https://speakerdeck.com/tattn/good-experience-with-widgetkit

現状ウィジェットを使ってはいないのですが、現職のアプリでも一部TodayExtensionを利用している部分があったり、今後の機能追加でウィジェットを採用する可能性も大いにあるかなと考えていたので、参考にしたくて聞きにいきました。

冒頭ではWidgetKitの注意点などを解説していただけてとても助かりました。
SwiftUIで実装する必要がある事はしていましたが、UIKitをSwiftUIでラップしても使えないという点は気をつけないといけないなと感じました。

![スクリーンショット 2021-09-19 13.34.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/aac649db-c786-5170-f746-1c24c9d5a184.png)

ビューの更新に関する考え方もアプリとは異なるので気を付けるポイントになりそうです。
予算という概念もこれまでのアプリにはなかったので覚えておきたいと思います。
メモリが30MBまでという制限があり、シミュレータではそれを超えても動くことがあって気付かないというのは普段開発されているからこそのTipsだなと感じました。

![スクリーンショット 2021-09-19 13.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/f45f78dc-142c-3e12-0a8e-f9d0524b687c.png)

セッション後半のより良いウィジェットを実装するための勘所についてもとても参考になりました。

![スクリーンショット 2021-09-19 13.40.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/57b84221-a256-b8fa-9cc0-e87b2af907e9.png)
![スクリーンショット 2021-09-19 13.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/3b5041bd-3345-3cc9-ac6c-2cf79c1b3250.png)
![スクリーンショット 2021-09-19 13.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/1a4b5325-c0c1-14e9-d523-ff84d6709f4a.png)

ウィジェットがクラッシュしたりなどで真っ黒になるというのは、普段使わない身としては初めて聞く話で勉強になりました。
最後のメッセージはウィジェットに限らずソフトウェアを開発する上では常に言えることだったので、身が引き締まりました。

![スクリーンショット 2021-09-19 13.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/74ccb3d1-cf3a-f210-3a50-071fecb6e62a.png)

# AVPlayerできちんとコンテンツ保護 
https://speakerdeck.com/ridwy/avplayerdekitintokontentubao-hu

現職でも動画再生を機能として持つアプリがあったり、これまでも動画関連のアプリに何度か関わったことがあったので気になって参加しました。

![スクリーンショット 2021-09-19 14.13.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/5256f332-f7a1-308d-9a73-7c29c26a2ad3.png)

このあたりのHLSの仕組みは改めて見てなるほどなぁとなりました。
コンテンツ保護をする必要性についてもとても納得感があると感じました。

![スクリーンショット 2021-09-19 14.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/39e4faf2-c968-033a-eb87-1b52732a6457.png)

また、コンテンツ保護の方法についてもあまり知識がなかったので、詳しく説明していただけて勉強になりました。

![スクリーンショット 2021-09-19 14.17.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/4d927d68-8532-14ab-8e81-4fea612183de.png)

さらに暗号化に関する知識まで紹介されていて、セッションのテーマからは想像していなかった知見まで得られてお得な気分になりました。笑

![スクリーンショット 2021-09-19 14.21.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/4fb439db-8437-351a-9068-ab670aeb72d6.png)

実際にAppleが用意しているFairPlayStreamingについても詳細に説明されていて、かなり実践的な内容だったと感じました。
余談ですが、FPSと略すと画面処理の方と混同しそうですよね...笑

![スクリーンショット 2021-09-19 14.26.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/0b0c83c8-ebf2-a638-c7c5-b1ea6371e6af.png)

最後にはiOSに限らずマルチプラットフォームでの対応についても紹介されていました。
セッションを通して、動画はやっぱり奥が深いなぁと感じました。
セッション開始前はクライアント側で録画やキャプチャを防ぐ方法などが紹介されるのかなと思っていたのですが、実際にはもっと本質的な内容になっていて非常に学びが多かったです！

![スクリーンショット 2021-09-19 14.30.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/e9bc8c24-077e-103c-f208-aa9d2a5608fc.png)

# オフライン編集もできる複雑なデータ構造を端末間で同期するために
https://speakerdeck.com/cc4966/offline-editor-and-online-data-sync-for-complex-structures

この時間は気になるセッションが盛り沢山でとても悩んだのですが、オフライン編集、端末間同期というパワーワード(？)に誘われて聞きにいくことにしました。

発表者の方は趣味で縦書きのテキストエディタを開発されているそうで、のっけからすごいなぁと感じました。
課題の背景をしっかり説明されているのも、聞く側がユースケースを想像しやすくて良かったです。

![スクリーンショット 2021-09-19 14.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/83948da6-2f85-600e-57d0-793757348c58.png)

オフライン編集も考慮した同期の話なのでどうやるのかなと気になっていたのですが、端末間通信は使わずに同期用のサーバーを置く方法だったので少し意外でした。
これをどうオフライン対応させるのか楽しみです。

![スクリーンショット 2021-09-19 14.55.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/12a855cf-ddda-0379-530a-4c1a0ee9f6c2.png)
![スクリーンショット 2021-09-19 14.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/b0dbeeae-6a11-ffae-594e-4d6489bb8c98.png)

冒頭では各利用パターン別の考慮ポイントを整理されていて、見ている側もとても理解しやすかったです。

ケース１|ケース2|ケース3|ケース4
:-:|:-:|:-:|:-:
![スクリーンショット 2021-09-19 15.26.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/6d929d58-d49f-763e-fafd-f1a0302f672f.png)|![スクリーンショット 2021-09-19 15.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/5c9723d2-4dda-50b6-87d8-5b5de242c354.png)|![スクリーンショット 2021-09-19 15.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/11f81fae-24d2-3720-1d65-13ba6365830c.png)|![スクリーンショット 2021-09-19 15.30.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/7d1485fc-7eab-1876-4cbc-da6667c19d60.png)
![スクリーンショット 2021-09-19 15.27.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/c4351c4f-655b-5833-55dd-a750ea9c4e05.png)|![スクリーンショット 2021-09-19 15.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/92565bba-aa8e-e80f-7efd-3d2067a503a2.png)|![スクリーンショット 2021-09-19 15.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/56d80df0-b7a0-2a92-c176-6006e3e09141.png)|![スクリーンショット 2021-09-19 15.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/a5007c4e-d236-bb44-12aa-589598773198.png)|


次に、同期を考えた際に課題となるコンフリクトやディレクトリ構造を持った複雑なデータの考え方について紹介されていました。
![スクリーンショット 2021-09-19 15.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/40608fdc-b23d-62bc-b31d-c647b096b9d6.png)
![スクリーンショット 2021-09-19 15.19.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/0a7ec2ac-b300-9682-9944-8c8e70e7226f.png)


データの並び順を保証するためにidを付与して絶対指定するのではなく、前のデータを指定して相対指定するという対応はなるほどなと感心しました！

最後に紹介されていた同期に関する5つのTipsについても非常に参考になる内容でした。

![スクリーンショット 2021-09-19 15.23.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/34601a6a-48e8-c26c-a0c9-8bae8027da95.png)

セッションを振り返って、オフライン対応データを端末間同期するためにどんな技術を使うか、という話ではなく、同期サーバーに対してどういうアプローチで同期をしていくかという考え方という内容でした。
話を聞きながら、gitの裏側もこんな感じになっているんだろうなぁと想像して楽しかったです。

# SceneKitを使ってアプリのクオリティを劇的に上げる
https://speakerdeck.com/ring/dramatically-improve-the-quality-of-your-apps-with-scenekit

アプリのクオリティが劇的に上がると言われたら、いち開発者として聞かないわけにはいきません。
これまで一部にSpriteKitを組み込んでアニメーションなどのクオリティを上げるという事はやったことありますが、その用途でSceneKitは使ったことがないのでとても楽しみです。

![スクリーンショット 2021-09-19 15.55.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/2825209c-7723-dae4-82fc-73cdd32d2503.png)

冒頭のこの悩みについては個人開発をやる身としてとても共感できました。
セッションではまずSceneKitが何者かという事を詳しく解説していただいてとても分かりやすかったです。

![スクリーンショット 2021-09-19 15.59.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/b585c70f-2469-b8a9-88a0-6ccc77791fd3.png)

SceneKitはARやゲームくらいしか用途を思いつかなかったので、アプリのクオリティを上げるために導入するというのは新しい発想でした。

特に画像に光の反射のようなアニメーションを適用するというのは用途も多そうで、是非身につけたいテクニックだと感じました！
少ないコードで実現できるのも素晴らしいですね。

![スクリーンショット 2021-09-19 16.09.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/0d8ce3e0-dfb4-6b9b-ea64-71e2c6482096.png)

シェーダーアニメーションの知識がほとんどなかったので、`shaderModifires`を使うのはハードルが高いと感じましたが、[GLSL Sandbox](https://glslsandbox.com/)というサイトでサンプルが多く公開されているとの事なので色々試してみたいなと思いました！

セッションで紹介されたアニメーションのサンプルコードは[こちらのリポジトリ](https://github.com/natoring/SceneKit-UI-Sample)から確認できるようです。

# LT前半
### ほんの一瞬だけでもConcurrencyの計算理論に触れてみませんか？
https://speakerdeck.com/banjun/lets-try-taking-a-quick-look-at-a-calculus-for-concurrency

SwiftConcurrencyを理解するための脳トレ的なお話でした。
触りの部分だけの紹介だったので調べていくとどんどん沼にハマっていきそうな気がしました。笑

### NDIとARKitを連動させた新しい映像表現 
https://speakerdeck.com/satoshi0212/nditoarkitwolian-dong-sasetaxin-siiying-xiang-biao-xian

無線で映像を転送する技術を使って、iPhoneをスタジオ機材にしてしまおうという大変野心的な内容でした。笑
苦労して実装されたであろう内容を惜しげもなく公開してくださるのはとてもありがたいです！

### Swiftのソートアルゴリズムの特徴を5分できちんと知る
https://speakerdeck.com/taka1068/swift-and-timsort

Swiftが採用しているTimsortというアルゴリズムについての紹介でした。
ソートのアルゴリズムについて今まで気にした事なかったのでとても勉強になりました。

### Using Eigen from Swift (via C) 
https://speakerdeck.com/taketo1024/using-eigen-from-swift-via-c

SwiftからEigenというC++製の行列計算ライブラリを使うお話でした。
SwiftからはC++を直接使えないので昨日聞いたセッションにもあったObjective-C++でラップするのかと思ったんですが、関数ポインタのような形で対応されていてすごいなと思いました。

### 5分でわかるIDFA / ATT
https://speakerdeck.com/koooootake/5min-idfa-att-skadnetwork

今世界的にホットな話題であるIDFA絡みのお話でした。
神武さんのトークやスライドはいつも面白くて楽しみにしています。

# TL後半
### アプリの終活
会社の統合によりアプリを終了することになってからの動きについての紹介でした。
エリアごとにクローズしていく運用にエンジニアの手が取られないように対応していったのは素晴らしいなと思いました。

### 今、改めて振りたいiPhone搭載のセンサとその使い道
iPhone端末に対する入出力に関するお話でした。
ユーザー体験に直接影響する部分なので大切なところですね！
iPhoneに搭載されているセンサーを改めて見直す事で新しいアプリのアイディアが生まれそうな予感がしました。

### Kyash iOSアプリのQAの歴史
https://speakerdeck.com/konifar/kyash-iosapurifalseqafalseli-shi

アプリのバグが出ないように4年半工夫されてきた事の紹介でした。
メンバーが少ない時期の施策から組織化されていく様子が追体験できて学びのあるTLでした。

### Hey Siri！マルチプラットフォームでのSiriショートカットの地雷を教えて
ご自身の経験によるSiriショートカット実装のTipsの紹介でした。
結論のSiriは完全にコントロールできないのでAppleにお祈りするしかないというのは笑ってしまいました。笑

### ２段階認証実装の勘所
多要素認証を用いた認証のお話でした。
途中接続が悪くてリテイクしたのはとても印象的でした。笑
TOTPを実装する際のTipsが紹介されていてとてもためになりました。

# おわりに
今年もあっという間の3日間でした。
毎年素晴らしいイベントを開催してくれる長谷川さんはじめ運営の皆様には感謝でいっぱいです。
今年からナレーターに立木文彦さんが加わり、スピーカーは立木さんに名前を読み上げてもらえるというご褒美が追加されました。

来年こそは立木さんに名前を呼んでもらって、ついでに素晴らしいコミュニティに少しでも貢献できるようにネタを探して登壇チャレンジしたいと思います！

みなさまお疲れ様でした！