iOSDC 2021 印象に残ったトークまとめ🎉

# はじめに
今年も参加しました！iOSDC！:tada:
https://iosdc.jp/2021/
話題のSwift Concurrency、そして昨年に引き続きSwiftUI・Combine関連のトークも多く、とても学びの深いイベントでした。

どれも素晴らしいトークだったのですが、なかでも印象に残ったものをまとめていきたいと思います。
スライド画像多めに載せているので、ざーっと流し見するも良し、気になるものがあればURLから飛んで詳細を見るも良しです。

この記事が、少しでも誰かのお役に立てば幸いです:grin:
![スクリーンショット 2021-09-17 17.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/3a8a18fb-8480-0647-f092-ced43f251cc0.png)

## 掲載トーク一覧
* [大規模リファクタリングの極意](https://qiita.com/orimomo/items/215adedf6d3ef38b3157#%E5%A4%A7%E8%A6%8F%E6%A8%A1%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E6%A5%B5%E6%84%8F)
* [agoraを使ってライブ配信機能を1ヶ月半でリリースした話](https://qiita.com/orimomo/items/215adedf6d3ef38b3157#agora%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A9%E3%82%A4%E3%83%96%E9%85%8D%E4%BF%A1%E6%A9%9F%E8%83%BD%E3%82%921%E3%83%B6%E6%9C%88%E5%8D%8A%E3%81%A7%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%9F%E8%A9%B1)
* [振り返りながら学ぶPackage Manager](https://qiita.com/orimomo/items/215adedf6d3ef38b3157#%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6package-manager)
* [初めてのハードウェア対応](https://qiita.com/orimomo/items/215adedf6d3ef38b3157#%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%AF%BE%E5%BF%9C)
* [Appleプライバシー保護の最新事情と適応戦略](https://qiita.com/orimomo/items/215adedf6d3ef38b3157#apple%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E4%BF%9D%E8%AD%B7%E3%81%AE%E6%9C%80%E6%96%B0%E4%BA%8B%E6%83%85%E3%81%A8%E9%81%A9%E5%BF%9C%E6%88%A6%E7%95%A5)
* [noteのiOSアプリで実装したアクセシビリティの全て](https://qiita.com/orimomo/items/215adedf6d3ef38b3157#note%E3%81%AEios%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B7%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E5%85%A8%E3%81%A6)
* [Hello, Swift Concurrency world.](https://qiita.com/orimomo/items/215adedf6d3ef38b3157#hello-swift-concurrency-world)
* [ケースに応じたUICollectionViewのレイアウト実装パターン](https://qiita.com/orimomo/items/215adedf6d3ef38b3157#%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%9Fuicollectionview%E3%81%AE%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E5%AE%9F%E8%A3%85%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
* [iOSアプリのセキュリティ基礎](https://qiita.com/orimomo/items/215adedf6d3ef38b3157#ios%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%9F%BA%E7%A4%8E)

# Day0

## 大規模リファクタリングの極意
### 概要
* スライド：[大規模リファクタリングの極意 - Speaker Deck](https://speakerdeck.com/imairi/da-gui-mo-rihuakutaringufalseji-yi)
* プロポーザル：[大規模リファクタリングの極意 by Yosuke Imairi | トーク | iOSDC Japan 2021 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2021/proposal/589c4329-022b-47c9-b8ea-b913eacf831b)
* Youtube動画：公開待ち

### 内容（抜粋）
![スクリーンショット 2021-09-18 9.25.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/c3522c00-50ad-98a6-a606-629e04ae5c2f.png)

既存設計の限界や、技術的負債の返済に時間がとれないことが課題となっていた。
目的を明確にしたうえで、大規模リファクタリングに取り組むことにした。

![スクリーンショット 2021-09-18 9.26.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/22923b41-5e41-806f-0db9-0a7a7a810e4f.png)
ルーティング部分だけにRIBsアーキテクチャを適用することで、技術的負債の解消を目指した。

![スクリーンショット 2021-09-18 9.26.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/be0ebbf7-59dc-ade4-ba20-e265ba95972b.png)
チームを分割して、専門チーム発足。
事業案件が忙しいときでも、なるべく駆り出されないように調整した。

![スクリーンショット 2021-09-18 9.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/013a15bf-9778-81a1-448f-49549c628553.png)
リリースブロッカーにならないように注意した。
事業案件のロードマップ進捗に常に気を配り、PDMやQAと日頃からコミュニケーションを取ることで、リリースタイミングの調整をしやすくした。

![スクリーンショット 2021-09-18 9.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/8ca86d2c-f8bc-4778-322c-3c3ab552c0da.png)
![スクリーンショット 2021-09-18 9.26.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/ab844f14-4ebc-b6f6-0413-c2b0ec0f55a8.png)
リファクタリングのためのリファクタリングをおこなった。
その他、既存仕様や設計の理解を深めるためのコードリーディングなど、下準備を2ヶ月以上おこなったことで、本作業は滞りなく進んだ。

![スクリーンショット 2021-09-18 9.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/7c753a71-24c2-fc8e-8cac-3940e0fa9233.png)
実装時間を増やすために、どんどん自動化を進めた。

* 自動的に指定したバージョンのXcodeが開けるようにした
* CIによるベースブランチの自動マージ
* ボイラープレートの自動生成

![スクリーンショット 2021-09-18 9.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/eb910e7e-bf28-f532-3c8e-94c429b47a6b.png)
技術的負債に打ち勝ち、安心安全な開発を取り戻した👏

### ひとこと所感
情報のたくさん詰まった密度の濃い発表でした！自動化ツールを自作しちゃうのすごい…。
事業案件とは別に専門チームを作るあたりも納得感が強かったです。


## agoraを使ってライブ配信機能を1ヶ月半でリリースした話
### 概要
* スライド：[Game On – プレゼンテーション（16:9）、作成者：maiko morisaki](https://www.canva.com/design/DAEk5AdyDCI/9NBe_8in_Vo7M_e11RkdWA/view?utm_content=DAEk5AdyDCI&utm_campaign=designshare&utm_medium=link&utm_source=publishsharelink#1)
* プロポーザル：[agoraを使ってライブ配信機能を1ヶ月半でリリースした話 by asa08 | トーク | iOSDC Japan 2021 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2021/proposal/9524f878-8c76-423a-810c-da0e185eb545)
* Youtube動画：公開待ち

### 内容（抜粋）
![スクリーンショット 2021-09-18 22.24.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/badfd87f-e5f6-8ac6-e9af-345014b9eeaa.png)
Agoraとは、モバイル・PCアプリやWebサイトに、カスタマイズしたビデオ・音声通話やライブ配信を簡単に実装できるSDK。
Agoraをなぜ使う理由は以下2つ。（なるべくリソースをかけずにライブ配信機能を作りたかった）

* 早くリリースしてユーザーの反応・数字を見たかった（実験的機能だった）
* 人手不足

![スクリーンショット 2021-09-18 22.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/6688665a-a54a-c251-7bd7-3027d418ee5c.png)
提供されているは機能9つあり、その中でもライブ配信機能には`Interactive Live Streaming`を使う。

![スクリーンショット 2021-09-18 22.25.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/b9c06d81-62fd-fc87-b634-d027a0d541dc.png)
クライアントはAgoraに認証するためのトークンを取得するため、自社サーバーからAgoraのAPIを叩く必要がある。
そのトークンを用いてagoraに接続する。
RTN = Real Time Network
RTC = Real Time Communication

![スクリーンショット 2021-09-18 22.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/e0828636-5814-9a4e-e38f-a63aec5db8d7.png)
ライブ配信を開始するにはチャンネルをまず作成する必要がある。
チャンネルとは配信の単位で、配信者はチャンネルを作成し、視聴者は各チャンネルに参加する形。

チャンネルを作成するために必要な情報は以下4つ。この情報をもとにRTCサーバーに認証して、チャンネルの作成・参加などをおこなう。

* `appId`
* `channelName`
* `uid`
* `token`

![スクリーンショット 2021-09-18 22.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/794a5eb8-bc74-da9f-4159-91329dee8448.png)
RTCサーバーに接続するために、`appId`を使って、Engineの初期化をまずおこなう。
`joinChannel`メソッドはチャンネルに参加するときに使う関数。
チャンネルに参加したときデリゲートメソッドに通知される。

チャンネルに参加すると、配信者は映像や音声を共有できて、リスナーは受け取ることができる。

### ひとこと所感
個人的に気になっていたライブ配信を中心にまとめましたが、コメント機能や投げ銭機能についての説明もあって盛りだくさんのトークでした。
丁寧な解説のもと、Agoraを使ったライブ配信の実現方法について学ぶことができました！


## 振り返りながら学ぶPackage Manager

### 概要
* スライド：[振り返りながら学ぶPackage Manager - Speaker Deck](https://speakerdeck.com/jollyjoester/zhen-rifan-rinakaraxue-hupackage-manager)
* プロポーザル：[振り返りながら学ぶPackage Manager by jollyjoester | トーク | iOSDC Japan 2021 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2021/proposal/1d9f4c94-21c2-4e38-a440-fcd01b3a5826)
* Youtube動画：公開待ち

### 内容（抜粋）
![スクリーンショット 2021-09-18 10.24.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/a1285418-5273-a982-7cc8-1a6a53b66600.png)
CocoaPodsの概要。
ライブラリをバイナリで配布するのではなく、ソースコードで配布して、プロジェクトでビルドするという発想。
ライブラリはアプリのビルド時に一緒にビルドする。
Centralizedとは、Specsで中央管理してライブラリを探しやすくすること。
GitHubがそれほど浸透していなかった時代の名残かもしれない。

![スクリーンショット 2021-09-18 10.25.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/db2c6467-e004-8f34-f943-70706808a43b.png)
Carthageの概要。
Swiftが登場して間もなくの2014年に登場。CocoaPodsへのアンチテーゼが基本発想としてある。
アプリに組み込む前にビルドして使う or ビルド済みバイナリをダウンロードしてきて使う。
中央管理の仕組みはなく、各GitHubのリポジトリを使う（= Decentralized）。

![スクリーンショット 2021-09-18 10.25.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/cd799ac0-8243-ba7b-9172-9c9302b71dbf.png)
Swift PMの概要。
Xcodeと統合されているので、マニュアルでの作業は不要。
標準なので「PackageManagerの対応待ち…」という事態がなくなる。

![スクリーンショット 2021-09-18 10.41.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/9bc1c9e7-4fa5-9487-8c68-622458515913.png)
CocoaPodsの仕組み。
`Pod install`されたら、podfileにしたがってSpecsを見に行く。
Specの記述からライブラリの置き場所（GitHubなど）を把握し、ソースをダウンロードして`Pods`ディレクトリを生成。
どのライブラリのどのバージョンをダウンロードしたのかをPodfile.lockに記載（環境再現のために重要）。
`Pods`ディレクトリ内のファイルはPods.xcodeprojで管理され、アプリ本体のプロジェクトと紐付けられる。
Xcworkspaceで2つのプロジェクトをまとめて完成！

ライブラリをソースコードとして取り込むため、アプリのビルド時にライブラリもビルドされる。
一度ビルドされたものはキャッシュされるが、クリーンビルドなどでは再度ビルドされる。
アプリの規模が大きくなると、ビルド時間が長くなるという問題を引き起こす。

![スクリーンショット 2021-09-18 12.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/c0bafa21-faf2-4504-3d00-3808265d6dd6.png)
Carthageの仕組み。
Cartfileを書いてコマンド叩くとライブラリが生成されるので、そのファイルをマニュアルでXcodeprojに紐付ける。

（裏でやっていること）
コマンドを叩くとソースコードのある場所（GitHubなど）からソースコードがダウンロードされ、`Carthage`ディレクトリ配下の`checkouts`ディレクトリに格納される。
同時にCartfile.resolvedが生成される。
ソースコードをもとにライブラリがビルドされ、`Build`ディレクトリに格納される。
`Build`ディレクトリ以下に生成されたファイルをプロジェクトにマニュアルで紐付ける。

最初にライブラリをビルドするのは時間がかかるが、その分アプリのビルドは早くなる。
シンプルな分、理解がないと適切な運用が難しい。
* `--platform iOS` を指定しないと、他のプラットフォーム向けのビルドも作成されてしまうので時間がかかる
* `--use-xcframeworks` を指定しないと、マニュアルでやらないといけないことが増えてしまう

![スクリーンショット 2021-09-18 12.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/eda5d86f-098d-8f34-c6e6-37f2c8ad7ca0.png)
Swift PMの仕組み。
Xcodeのプロジェクトに`Swift Packages`という項目があるので、リポジトリのURLとバージョンを指定するとダウンロードされて使えるようになる。

動きはCarthageと似ていて、ライブラリの置き場（GitHubなど）からソースコードがダウンロードされ、すぐビルドされる。
`DerivedData`配下の`Build`や`SourcePackage`ディレクトリに格納される。
マニュアルな作業なしにプロジェクトに自動でリンクされる。標準バンザーイ！


### ひとこと所感
3つとも使ってはいたけれど、裏側まで詳しく理解できていなかったので勉強になりました。
易しい説明のもと、それぞれを比較しながら見ていくことができて大変わかりやすかったです！

# Day1
## 初めてのハードウェア対応
### 概要
* スライド：[初めてのハードウェア対応 - Speaker Deck](https://speakerdeck.com/ykkc/chu-metefalsehadoueadui-ying)
* プロポーザル：[初めてのハードウェア対応 by Takeshi Yokokoji | トーク | iOSDC Japan 2021 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2021/proposal/6fbe3926-91d2-4b33-b77c-d167710adecd)
* Youtube動画：公開待ち

### 内容（抜粋）

![スクリーンショット 2021-09-18 13.14.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/05fcdb89-1af1-2ec8-f1d6-8f1376ee73b6.png)
実店舗での会計の流れには様々なハードウェアが必要で、たくさんのハードウェア対応をおこなった。
Bluetoothの規格によって実装が異なっている。

![スクリーンショット 2021-09-18 14.08.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/46fb5f07-fa56-4ebb-ff1a-637ccffcd399.png)
`Bluetooth Low Energy`（BLE）は、3系以前に比べて省電力の通信ができるのが特徴。
`Core Bluetooth Framework`を利用して実装する。

![スクリーンショット 2021-09-18 14.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/17d43369-001b-1553-88ff-29344cf76c03.png)
BLEの規格では、以下2つの概念に分かれていて、`Core Bluetooth Framework`を使う上で大事になってくる。
* peripheralの情報をスキャンして接続する`Central`（iPhone）
* 自分のデータをブロードキャストする`Peripheral`（プリンターなど）
Peripheralの中には`Service`（機能）と、`Characteristic`（特徴）という概念が含まれている。

![スクリーンショット 2021-09-18 17.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/09cdb714-9a9d-ae29-6289-bf820b5d7369.png)
デバイスの仕様に関する情報を、静的情報として持っておく。

![スクリーンショット 2021-09-18 17.56.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/54d0966b-23d9-39f2-508f-29036d2367da.png)
検出されたPerifheral情報を取得 → デバイスに接続 → デバイスにデータ送信、という流れで実装。

![スクリーンショット 2021-09-18 18.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/5c4bbfc8-d8ee-b140-84e0-d9de205ade70.png)
`Bluetooth Classic`は、Bluetooth 3.0以前の規格で、`External Accessory Framework`を使って実装する。
Info.plistをいじったり、MFi申請する必要もあってちょっと面倒。
（MFi登録申請とは、メーカーがiOSに対応したハードウェアを製造するときにAppleからの認証を通過する必要があり、その申請のこと）

![スクリーンショット 2021-09-19 10.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/0cd0f7d7-d297-985f-aa98-873f66d9355f.png)
苦労した点としては、同じメーカーでも一部の端末で挙動が異なる場合があり、調査が難しかったこと。
また、リモートワークでハードウェア対応しようとしたところ、自宅にハードウェアブース（+レシートの山）ができてしまったりもした。

### ひとこと所感
Bluetooth系のFrameworkは全く触ったことがないので新鮮でした（こういう新しい世界を気軽に垣間見ることができるのもiOSDCの楽しみの一つですよね〜）。
Bluetooth接続してるデバイスがどういう仕組みで動いているのかがなんとなくイメージできるようになりました！


## Appleプライバシー保護の最新事情と適応戦略
### 概要
* スライド：[Appleプライバシー保護の最新事情と適応戦略/Apple privacy - Speaker Deck](https://speakerdeck.com/kichiemon/apple-privacy)
* プロポーザル：[Appleプライバシー保護の最新事情と適応戦略 by Terasaka | トーク | iOSDC Japan 2021 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2021/proposal/475a40ce-125e-472e-8d21-98a279a42541)
* Youtube動画：公開待ち

### 内容（抜粋）
![スクリーンショット 2021-09-18 18.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/3780c7e2-82b8-0003-5412-fb4f5d7990a1.png)
近年のプライバシー関連アップデート。なかでもATTは今年適用されて話題になった。

![スクリーンショット 2021-09-18 18.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/16b7a1f2-c7e2-35b0-d9c2-21b19512c8a7.png)
WWDC2021のプライバシー関連アップデートの中から、業界に対して影響の大きそうな2つ。
トラッキング規制が強まる中で、ユーザーのリテラシーが上がり、プライバシーの重要性が増してきている。
プライバシーに配慮できているかが、サービスの信頼性の基準になっていく。

![スクリーンショット 2021-09-18 18.39.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/e6b94eb2-1519-2316-fb9f-35c55daede62.png)
Appleは「プライバシーは、基本的人権です」と言い切っており、プライバシーはAppleの中心にある理念の一つ。
大事なことを大事だと言い切る姿勢に、彼らの覚悟を感じる。

![スクリーンショット 2021-09-18 18.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/6f59b4cd-2b74-a6d3-5397-85040411e111.png)
そんなAppleはプライバシーをどう保護しているのか。
今年のWWDCでも発表のあった「プライバシー保護の4原則」がある。

![スクリーンショット 2021-09-18 18.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/c4c46fb8-b702-f11f-cacb-5a6d069be8ba.png)
1つめは「データ最小化」。
データが増えれば増えるほどユーザーの輪郭が見えてきて、攻撃されやすくもなる。
データを持つことはリスク。目的に応じて最小限だけ取得すること。

![スクリーンショット 2021-09-18 18.45.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/11d9e507-1f2d-0daa-36f0-937a44a57e73.png)
2つめは「オンデバイス処理」。
データは動かせば動かすほどリクスが上がるので、なるべく端末の中で処理して、外に持ち出さないようにすること。
もし持ち出す場合は、端末の中でデータを要約処理してから持ち出すこと。

![スクリーンショット 2021-09-18 18.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/80b00f2e-0cfe-52d6-961f-da5b4260782b.png)
3つめは「透明性とコントロール」。
見えないところで情報を収集するのはNGで、理由を明示してユーザーに選択肢を与えること。
伝わらなければ意味がないので、わかりやすい言葉で。
当然、サードパーティ製ツールが利用するデータも把握する必要ある。

![スクリーンショット 2021-09-18 18.45.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/1e4f830f-db48-641f-a778-c77216028533.png)
最後は「セキュリティ保護」。
預かったデータは安全に取り扱う責任がある。通信の暗号化や保存データの暗号化も大事。

### ひとこと所感
普段はどうしても目新しい機能に目が行きがちで、（大事であるとはわかっていながらも）セキュリティについてじっくり向き合うタイミングがなかったので、有り難いトークでした。
「プライバシー保護の4原則」、意識していきたいです。

## noteのiOSアプリで実装したアクセシビリティの全て
### 概要
* 資料：[noteのiOSアプリで実装したアクセシビリティの全て（文字起こし） #iosdc #a｜かっくん / iOS Developer](https://fromkk.me/n/n2dbeb54cdf0d)
* プロポーザル：[noteのiOSアプリで実装したアクセシビリティの全て by かっくん | トーク | iOSDC Japan 2021 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2021/proposal/1388d639-901b-4e46-bba4-be866aba7130)
* Youtube動画：https://www.youtube.com/watch?v=rDX_tJ7t28M

### 内容（抜粋）
![スクリーンショット 2021-09-18 19.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/71a40f00-1cda-8d36-eeba-ea47b5c95c53.png)
アクセシビリティは障害者や高齢者向けの対応と思われがちだが、全人類が情報に触れたり機能を体験できることを目指している。

![スクリーンショット 2021-09-18 19.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/f32d1da2-efb1-5b97-d635-a08c3107a1b1.png)
ユーザービリティはアクセシビリティが保たれた上で意識したい。
そもそもアクセスできなければ利用すらできないため。

![スクリーンショット 2021-09-18 19.38.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/79bb1ef0-937d-5437-edcc-293dc45f406b.png)
盲目の方へのインタビューを実施した際、実際に動く様子を見せてもらうと「バグやん…」と思った。
アクセシビリティ向上を掲げてもなかなかタスクは進みづらいと思うが、バグ修正というタスクに分解すれば自ずと優先度が上がるのではないか。

![スクリーンショット 2021-09-18 19.46.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/49b0c8e4-4e0e-b8c1-affb-e0463e33b55c.png)
実際に発生した問題の一つとして、「タップジェスチャーが設定されているviewが選択できないという問題」があった。
ただのUIViewは`isAccessibilityElement`がデフォルトで`false`になっているため、`true`にしてあげることで解決した。

![スクリーンショット 2021-09-18 20.55.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/0be1855b-ca4b-b68b-6f6f-98a98b2c372a.png)
更に体験を向上する施策として、「何か動作をしたら用意したテキストを読み上げる方法」を紹介。
`UIAccessibility`の`post`メソッドに `.announcement`を設定してテキストを渡すだけでOK。

![スクリーンショット 2021-09-18 21.07.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/bc1d6150-83db-24bf-aa96-9fff6e8ffeb7.png)
次は「日付の読み上げを自然にする方法」。
`dateFormatter`で`yyyy/MM/dd`を指定すると、区切り部分が「すらっしゅ」と読み上げれらてしまう。
フォーマットを指定せずに`dateStyle`と`timeStyle`を指定したアクセシビリティ用の`dateFormatter`を別途用意して、`accessibilityLabel` に設定するとうまくいった。

![スクリーンショット 2021-09-18 21.11.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/5ede778d-acf4-b238-0bbb-5f5c641b02f7.png)
アクセシビリティの設定を確認するためのTips。
音声コントロールを有効にしてオーバーレイの設定を項目名にすることで設定済みのラベルを可視化することができる。
VoiceOver実際に使わなくてもラベルの確認ができて便利。

![スクリーンショット 2021-09-18 21.13.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/c4bdfcbc-201d-d515-455b-3b476b3967dc.png)
アクセシビリティの向上は突き詰めようと思うとどこまでもできてしまう。
実際に利用している人が困っている点を改善するのが大事なので、定期的にユーザーインタビューを実施したりアンケートを取ったりして、利用者の声を拾い上げていく仕組みづくりをしていきたい。

### ひとこと所感
アクセシビリティ対応をするうえでのTipsが盛りだくさんのトークでした。ここまでできてるnote社すごい！
動画だと断然わかりやすいので、気になる方はYoutubeを見てもらうと良いと思います。

# Day2
## Hello, Swift Concurrency world. 
### 概要
* スライド：[Hello, Swift Concurrency world. - Speaker Deck](https://speakerdeck.com/shiz/hello-swift-concurrency-world)
* プロポーザル：[Hello, Swift Concurrency world. by shiz | トーク | iOSDC Japan 2021 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2021/proposal/d351cec1-ba77-40a4-afaa-788f01a57bae)
* Youtube動画：公開待ち

### 内容（抜粋）
![スクリーンショット 2021-09-19 12.18.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/125282cd-1419-ce08-c483-7f6081cc640a.png)
Swift Concurrencyとは、非同期処理や同時並行処理を、わかりやすく、安全に書くための言語機能。
パフォーマンスの最適化も目指している。

![スクリーンショット 2021-09-19 13.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/f6112d51-6206-051c-bd56-2927235d9e61.png)
Async/awaitは、非同期処理を、同期処理と同じような方法で、より読みやすく、より正確に書けるようにした新しい構文。

![スクリーンショット 2021-09-19 12.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/fa116d44-09a7-ce27-dd52-1d3080abdaeb.png)
コールバックはネストが深く読みづらく、処理の流れが複雑で、Completionを手動で実行する必要もある（呼び忘れのリスク）。
一方、Async/awaitだとネストが減り、上から下に自然な流れで処理が行われ、コンパイラが処理の戻し忘れを検出してくれる。

`async`キーワードをつけることで、処理の途中でsuspend（=中断）する可能性をコンパイラに伝える。
結果が返ってくると処理をresume（=再開）する（await前と同じスレッドでresumeされるわけではないので注意！）。

![スクリーンショット 2021-09-19 12.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/1dd0bf47-f5ff-2e38-ca40-c3f95344ce91.png)
パフォーマンスの向上についてスレッドモデルから見ていく。
GCDはどんどんとスレッドを生成するので、メモリオーバーヘッドやスケジューリングオーバーヘッドなどの「Thread Explosion」を引き起こす可能性がある。
一方、Swift Concurrencyは固定数のスレッドを持ち、強調スレッドプールという仕組みでスレッドを再利用するので、必要以上にスレッドが生成されることがなく安全。

![スクリーンショット 2021-09-19 12.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/ca60681f-1b03-adc3-025b-e1528b1c78c9.png)
![スクリーンショット 2021-09-19 12.51.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/cf9312da-371a-4585-6856-dfc0331acabe.png)
Actorとは参照型のデータ型で、struct、enum、classに近い機能を持っている。
一度に一つの処理のみをおこなうことで、複数のThreadからの同時アクセス（データ競合）を防いでいる。
`class`の代わりに`actor`を使って定義し、Actorの外からアクセスするには`await`を付ける。

![スクリーンショット 2021-09-19 13.02.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/d4b9350d-8fbe-155d-a71b-e12ece46450e.png)
MainActorとは、メインスレッドで処理を実行するActor。`@MainActor`を付ける。
メインスレッドの外からコードを呼び出す場合は、`await`をつけて呼び出す必要がある。
メインスレッドで実行する必要のある処理の場合、DispatchQueueだと実行時まで気づかないこともあるが、MainActorを使うとコンパイル時にチェックされるので、後から変更した場合のリスクが減る。

### ひとこと所感
スライドが205枚（！）とすごい情報量で、ここではかいつまんでのまとめとなってしまいました…。
今後ごく一般的な機能になってくると思うので、何度か見返して理解したいと思います！

## ケースに応じたUICollectionViewのレイアウト実装パターン
### 概要
* スライド：[ケースに応じたUICollectionViewのレイアウト実装パターン - Speaker Deck](https://speakerdeck.com/to4iki/kesuniying-zitauicollectionviewfalsereiautoshi-zhuang-patan)
* プロポーザル：[ケースに応じたUICollectionViewのレイアウト実装パターン by to4iki | トーク | iOSDC Japan 2021 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2021/proposal/dae86b07-b55c-449f-bdf1-72acf578d11a)
* Youtube動画：公開待ち

### 内容（抜粋）
![スクリーンショット 2021-09-19 14.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/9d60e9e7-ebf9-6cb5-25e2-e68ba0ab98fb.png)
4つそれぞれに特徴があり、要件を満たすためにどの実装を選択すべきか悩ましい。

![スクリーンショット 2021-09-19 14.45.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/659a5c3a-7360-9ded-5864-f1eb315a7ba5.png)
`UICollectionViewFlowLayout`について。
縦横にコンテンツを均等配置するシンプルなレイアウト。
簡単に設定が可能だが、セクションごとやアイテムの位置に応じた動的にレイアウト変更はできない。
固定のレイアウトを組む場合に使用すると良い。

![スクリーンショット 2021-09-19 14.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/943dcef7-3112-ce9b-bf4e-5721155b4540.png)
`UICollectionViewDelegateFlowLayout`について。
IndexPathを参照可能のため、アイテムやセクションごとにサイズを変更することができる。
アニメーションを伴う変更や、アイテム同士のサイズを比較しておこなう変更など複雑なレイアウトは苦手。

![スクリーンショット 2021-09-19 14.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/044adda9-ab83-589e-9612-38ba65d118be.png)
`UICollectionViewLayout`を継承したCustomレイアウトについて。
アイテム同士のの比較など、レイアウトを頻繁に更新するケースで利用する。
柔軟なレイアウトが組める反面、パフォーマンス面の考慮も必要で難易度は高め。
（CompositionalLayoutを使えば簡単に実現できたりもする）

![スクリーンショット 2021-09-19 14.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/5ce89af4-cebe-06a1-ef57-98201f04808f.png)
`UICollectionViewCompositionalLayout`について。
iOS13以上で使える。
`Item`と`Section`の間に新たな`Group`という概念が加わった。
`Group`は入れ子構造が可能で、複雑なレイアウト構成を表現できる。
IndexPathにはアクセスできないので、データにアクセスして動的にサイズを変更するのは苦手。

![スクリーンショット 2021-09-19 14.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/21321713-eed8-c086-5c12-fa998b5c4688.png)
`UICollectionViewCompositionalLayout` + `DiffableDataSource`の実装例を紹介。
ViewControllerは渡されたデータ構造をただ表示するだけで、「表示モデル = 画面そのもの」の直感的な実装ができる。

![スクリーンショット 2021-09-19 14.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/5a3be4b0-8ffa-01f0-c827-6442126fce6f.png)
`DiffableDataSource`について。
差分更新が特徴で、データとUIの不整合を型レベルで担保している。

### ひとこと所感
各サブクラスの得意/不得意が分かりやすくまとまっていて良かったです。
`UICollectionViewCompositionalLayout`や`DiffableDataSource`を使うシーンも増えてくると思うので、ちゃんとキャッチアップしていかないとなーと思いました！

## iOSアプリのセキュリティ基礎
### 概要
* スライド：[iOSアプリのセキュリティ基礎 - Speaker Deck](https://speakerdeck.com/saten/iosahurifalsesekiyuriteiji-chu)
* プロポーザル：[iOSアプリのセキュリティ基礎 by saten | トーク | iOSDC Japan 2021 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2021/proposal/f4eeade3-e50b-4a49-91dc-22bbba321ecb)
* Youtube動画：公開待ち

### 内容（抜粋）
![スクリーンショット 2021-09-19 16.06.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/0dc0f46b-8091-957f-10e6-6436eb228be1.png)
http/https通信をする上でのセキュリティとして、iOSではATSがある。
Info.plistから強度が設定できるが、丸ごと無効化したりせず、できるだけデフォルトのASTに近い状態で動作するようにすることが大切。

![スクリーンショット 2021-09-19 16.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/a9b8bd92-07b8-9c52-8e0a-dcf4f6a1eb8b.png)
URLスキームの脆弱性について。
同じURLスキームを受け取るアプリをリリースすることが可能。
先にインストールしているアプリが受け取るので、もし攻撃者のアプリを先にインストールしていたら、攻撃者に大事なデータが渡ってしまう。
どのアプリにどのURLスキームが実装されているかはツールなどを利用すれば誰でもわかること。

![スクリーンショット 2021-09-19 16.16.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/08644e7b-9177-4ae0-dfc0-e54079c40bde.png)
対策の一つがUniversalLinksを使うこと。
攻撃者はドメインを奪うことは難しく、そのドメインに紐づくアプリを作ることはできない。
URLスキームよりもデータを奪われる可能性が低く安全。

![スクリーンショット 2021-09-19 16.22.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/1e4aa4aa-4db5-3913-4b64-0ba44584c268.png)
対策の2つ目として、外部ブラウザでの認証などの場合、外部ブラウザではなくSFsafariViewControllerなどを使ってアプリ内でブラウザを開くこと。
ブラウザ内でURLスキームが生じた場合、先にインストールしたアプリではなく、アプリ内ブラウザを開いているアプリが優先してURLスキームを受け取るため安全。
また、URLスキームではセキュリティ上漏洩になるような重要なデータを渡さないことも大切。

![スクリーンショット 2021-09-19 16.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/5abf8e04-e30e-bf0c-678f-3cf1f7c22477.png)
重要情報をローカルのどこに保存すべきか？については、Keychainに保存することを推奨。
Realm上のデータもKeychainに鍵を入れておくことによって守ることができる。
アプリをリバースエンジニアリングされる可能性があるので、ソースコード内に重要情報をハードコーディングするのは避けるべき。

![スクリーンショット 2021-09-19 17.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/d735f124-5ce8-6aeb-e3c4-77b36f4b0faa.png)
認証の仕組みについて、代表的なものはこの3つ。攻撃例と対応策は以下。

* CSRFにはstateパラーメーターの付与で対応
* id-tokenの改ざんはデジダル署名検証で対応
* リプレイアタックにはnonceパラメーターの付与で対応

![スクリーンショット 2021-09-19 17.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/54ab51e1-3d0f-8638-3a34-00aaca847c9f.png)
OAuthやOpenID Connectを利用するときは、独自の実装ではなくできるだけ標準の仕様に則った実装にすること。
また、脆弱性を理解して、OAuthやOpenID Connectに則った検証をちゃんとすること。
ログインできればいいというものではない。

### ひとこと所感
セキュリティについて基礎から説明してくださっていて、誰にでもわかりやすいトークだったと思います。
「脆弱性はいつも近くに潜んでいる」ということを胸に刻んで実装していきたいですね！

# おわりに
今回もまた大作になってしまいました:yum:
（トーク見ながら記事に起こすのはわりとハードで、3日間におよぶ自分との戦いに勝った気分です:beer: ）
ここまで見てくださった方、ありがとうございました！
※昨年の記事はこちら →[iOSDC 2020 印象に残ったトークまとめ🎉 - Qiita](https://qiita.com/orimomo/items/52827c0f79d7aadbc0a2)

スタッフの皆さん、スピーカーの皆さん、参加された皆さん、本当にお疲れさまでした:sparkles:
来年のiOSDCも楽しみにしています！
![スクリーンショット 2021-09-19 18.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/d15dd0d0-070c-ad24-dd80-1ad8472e8726.png)