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

# はじめに
[iOSDC Japan 2021 前夜祭をタイムシフトで追いかけて](https://qiita.com/Sab_swiftlin/items/27a50a4e0970866e1a0b)
上記の記事に引き続き、iOSDC Japan 2021に参加した感想を書いていきます。
セッションの内容はアーカイブを見たいただきたいと思いますので、タイムシフトで見るセッションを決める参考にしていただけると幸いです。

# シームレスな体験を実現する本人確認フローの構築 〜家計簿プリカB/43でのeKYC開発実例〜 
https://speakerdeck.com/nakamuuu/iosdc-japan-2021

現在の業務では本人確認を行うことはないのですが、**シームレスな体験**というワードが気になって視聴しました。
元々ドコモショップで働いていた事もあり、本人確認というタスクにも馴染みがあったというのもあります。

オンラインで完結する本人確認をeKYCという事を初めて知ったので、それだけで知見でしたが、設計思想も興味深かったです。

外部SDKがいくつかある中で、ユーザーのリテラシーを考えて自前実装に踏み切ったのはすごい勇気だし、ユーザーやサービスの事を真剣に考えていることが伝わりますね。
![スクリーンショット 2021-09-18 10.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/18cb00ce-7488-57b4-2dc3-5fecaf1fff1a.png)

シームレスなオンボーディング体験にコストをかける意思決定をした、という部分も良いチームなんだなと感じました。

![スクリーンショット 2021-09-18 11.02.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/3e893374-6b40-83ea-22a4-f27f41bdfc24.png)

法令遵守とユーザー体験を両立する閾値の検証は大変そうだなと感じます...
社内のテストだけでなく、ユーザーテストも行って調整しているというのは、さすがコストをかける判断をしただけのことはあるなという印象です。

![スクリーンショット 2021-09-18 11.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/9ac52d6c-5208-7963-4afb-4ea246658226.png)

ユーザーにとって負荷が高そうな本人確認フローで離脱が10%以下に抑えられているのは凄いことだと思いました。
僕もユーザーやプロダクトにとってより良い選択ができるように、コストをかける部分と外部サービスに頼って素早く実現する部分をしっかり判断していこうと思わされました！

# 日本語でもいい感じに改行したい！！
https://speakerdeck.com/trickart/split-japanese-sentence-for-uilabel-and-swiftui-text
これめちゃくちゃ身に覚えがあるので気になって聞いてみました。

画面サイズによって変なところで改行されてしまうのはあるあるで、日本語でも`\u{2060}`でワードジョイナーを入れられるというのは知らなかったので知見でした。
改行したくない位置にこれを差し込んでいけば良いというわけですね。
ただ、全文手動で入れるのは現実的ではないし、ユーザー入力の場合はどうするのかなと思っていたらもちろん対策されていました。
というかここからが本番ですね。

![スクリーンショット 2021-09-18 11.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/dc38ff28-46ba-40e8-1157-85bfef8b1921.png)

形態素解析にMeCabを使って単語を判定していくようです。
MeCabはC++製なのでSwiftから直接使えないというのも今まで気にしたことなくて、そうだったんだと新しい発見がありました。
Swiftから使うために中継するObjective-C++も今まであまり馴染みがないものでした。
![スクリーンショット 2021-09-18 12.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/50048f65-e245-bae4-87d8-475aaddc8c17.png)

時間をかけて作成されたラッパーをSwiftPackageとして公開していただいているみたいです！
自前で対応していくのはかなり大変そうなので、こういった形で公開していただけるのはとてもありがたいですね！！
https://github.com/trickart/muscat

ちなみに、このmuscat(マスカット)という名前は昔GoogleがPython製の改行タグ挿入ツールを作っていて、その名前がBudou(ブドウ)だったところから命名したそうです。
センス良いですよね！
技術力が高い人は命名センスが良い人が多いのでいつも感心させられます。

# 実践 iOS オープンソースプロジェクトの始め方 
https://speakerdeck.com/niw/shi-jian-ios-opunsosupuroziekutofalseshi-mefang

いつかは自作ライブラリを公開してみたいという思いがあったので聞いてみようと思いました。

ライブラリを作ることを考えた際に**どう公開するか**という点に意識がいきがちだったんですが、大前提として使いやすいライブラリにするためにAPI設計をしっかりして下位互換を考慮するという話にはハッとさせられました。

また、ライセンスについても普段は利用側としてしか意識したことがなかったので、[SPDX](https://spdx.org/licenses/)というライセンスを定義したものがあるというのも知りませんでした。

パッケージングは現在は最低限SPM対応していればよくなったのは少し楽になったのかなと感じました。

![スクリーンショット 2021-09-18 13.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/52801400-b22a-2f31-dca2-4f35e1446cea.png)
確かに、ライブラリにデモアプリが内包されているのは利用側としてとても助かるので、自分でライブラリを作成する場合も実践したいなと感じました。
ライブラリ運用の面では他にも[CLAアシスタント](https://cla-assistant.io/)を使ってCLAの同意確認をしたり、PRを受け付ける際の注意点やテクニック、Issuesの定型分の用意など非常に勉強になる内容でした。

![スクリーンショット 2021-09-18 13.54.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/e334fe90-778a-eec2-8052-1fd391878517.png)

このあたりのgitコマンドは普段の業務で使うことはなかったので新しい発見があって面白かったです。

# 100日間AR表現を実装して見つけた面白い実装を全力解説
https://speakerdeck.com/satoshi0212/100ri-jian-arbiao-xian-woshi-zhuang-sitejian-tuketamian-bai-ishi-zhuang-woquan-li-jie-shuo

ARは元々興味があって昔プライベートで少し実装して遊んでいたのと、発表者の服部さんとはコミュニティで知り合った事もあり応援したくて聞きに行きました！
基本的な内容としては実際の動作をサンプルを紹介頂いた後に実装コードの解説という流れでした。
[こちらのリポジトリ](https://github.com/satoshi0212/AR_100Days)で実装されている内容のようです。

顔ペイント | 現実スプラトゥーン | ARなぞとき | BlotterMedia風効果 | EyeTrackHeatMap
:-:|:-:|:-:|:-:|:-:
![スクリーンショット 2021-09-18 16.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/848d3ab7-d61e-0eb5-69c9-0674cf93906a.png) | ![スクリーンショット 2021-09-18 16.21.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/6860ff8c-4aae-7775-fa7f-34b59811ca91.png) | ![スクリーンショット 2021-09-18 16.22.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/ddc5680d-9100-d2a1-91f7-af7faeec93b3.png) | ![スクリーンショット 2021-09-18 16.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/ca5f2832-2f9d-c211-8346-1c96a2163965.png) | ![スクリーンショット 2021-09-18 16.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/d950065d-bee0-4fd2-56e3-101adc99a8ee.png)
 
こちらの5つの表現方法についてコードの解説をされていました。
全てが面白い内容で、とてもワクワクして見ることができました。
やはりARは夢が膨らみますね！

特に最後のヒートマップに関しては現在WIPで現実世界のヒートマップが作成されるというのを試しているそうで、これに関しては将来メガネ型のARデバイスが普及したらリアル世界の広告効果が測定できたり、課金体系も変化していったりする可能性がありそうなどと妄想せずにはいられませんでした。笑

ここ数年ARからは遠ざかっていましたが、またやってみようかなと思わされる内容でした！
素敵な発表をありがとうございます！！

# 宣言的UIの状態管理とアーキテクチャ - SwiftUIとGraphQLによる実践
https://speakerdeck.com/sonatard/swiftui-graphql

最近業務でもSwiftUIを使うようになって、設計にいまいち不安が残るので参考にしたいと思って聞きに行きました。

![スクリーンショット 2021-09-18 14.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/e925aac6-1d73-7e09-a6d4-cf16787c2fbf.png)
![スクリーンショット 2021-09-18 14.53.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/53f48687-d078-8100-9bc5-a4e9ef82a426.png)

このあたりの課題提起はとても共感できるものでした。
ここから課題を解決するために採用したアーキテクチャと、そこに至るまでの巷のアーキテクチャの歴史と思想を細かく解説されていてとても勉強になりました。

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/e0bb35e4-b962-4479-0a39-e98c352eb39a.png)

ReduxやTCAの説明に多く時間が割かれていたところも、実務で使ったことない身としては大変ありがたかったです。
![スクリーンショット 2021-09-18 15.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/cedcbb25-3b38-5060-99a9-1982814fe123.png)
![スクリーンショット 2021-09-18 15.09.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/a2aeface-3513-a7df-7baf-a7917d2b7bde.png)

ReactではAPIコールの状態をStoreではなく呼ぶ場所で持つようになったというのは知らなかったので、新たな発見がありました。
GraphQLについても存在は知っていましたが実際に使ったことはなかったので、クライアントからクエリを投げて必要なデータだけを取得できて変換が不要であること、クライアントにキャッシュされることはメリット大きいなと感じました。
ただ、キャッシュについてはGraphQLにキャッシュする仕組みが入っているのかGraphQLを利用するためのライブラリ(Apollo)がキャッシュするのかよく分かっていないのであとで調べてみようと思います。

セッションの最後にはおすすめのアーキテクチャも紹介されていて今後の参考になりました。

![スクリーンショット 2021-09-18 15.33.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/8bd6ca74-8b2f-9a05-3a60-abd166f45480.png) | ![スクリーンショット 2021-09-18 15.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/d1fa74e8-9c74-7162-51f0-8adfd1531fd2.png) | ![スクリーンショット 2021-09-18 15.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/d01d35eb-f7f7-f6f9-7e4c-51a2a052c777.png)
:-:|:-:|:-:

まずは1の分離から心がけていこうと思います！

# App Size Optimizationへの挑戦
https://speakerdeck.com/kazumanagano/app-size-optimization-hefalsetiao-zhan

今までアプリサイズはそこまで意識していなかったなという反省を踏まえて聞きにいきました。

容量を削減するにはまず現在の容量を知ることが大切で、その生成物を計測するかが大切ということでした。
![スクリーンショット 2021-09-18 15.55.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/a9a6c99b-9cb3-4db5-6161-6583d61a7a5b.png)

ユーザーへの影響を考える場合は端末用のipaを計測する必要があるようです。
これは開発中に確認する方法を紹介されていて、こちらは今まで使ったことがなかったので新たな知見でした。

![スクリーンショット 2021-09-18 15.58.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/477e0fc1-ea82-0faf-95dc-1368416b6f0e.png)

他にもバイナリの中身を確認する方法も紹介されていて勉強になりました。

![スクリーンショット 2021-09-18 16.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/19847cd8-05ef-e356-2a4b-4113960da2f3.png)

fastlaneでアーカイブしていてAppThinningが効いていないのは現職でも可能性ありそうと感じたので、この後確認しないといけないなと気付かされました。

![スクリーンショット 2021-09-18 16.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/c147b571-e324-dba7-13f7-89789621c394.png)

また、画像周りの知見についてはこれまでそんなに意識していなかったので、デザイナーにも共有して意識していこうと思いました。

![スクリーンショット 2021-09-18 16.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/b572f1ce-103b-9f38-fefc-06952b00ceaf.png)

# LT前半
### Nearby Interactionを利用した空間認識
普段あまり馴染みのない機能だったので興味深かったです。
現状はまだ動作が不安定とのことでしたので今後の進化に期待というところでしょうか。

### 再現ができない？特定ができない？ZOZOTOWNアプリのトップクラッシュに立ち向かった話
再現も特定もできないクラッシュで結局メモリ関連が原因だったようです。
ユーザーが使い続けると発生するバグだったようで、普段長時間利用のメモリを意識することは少ないので、意識していこうと思いました。

### M1チップの脆弱性M1racleを読み解く
5月に発見されたM1の脆弱性は気にするほどの内容ではなく、脆弱性をネタに騒ぎ立てる社会への発見者からのメッセージが込められているという話でした。

### Hacking the Tesla API 
テスラが公開しているAPIについての解説でした。
音声が途切れがちでうまく聞き取れなかった部分が多かったのが残念でした。。。

### やってみよう！iOSDCデザインスポンサー！
デザインスポンサーがやるタスクとスケジュール感、必要な役割などの紹介でした。
イベントの裏側を少し覗いた気がして面白かったです。
Pixivさんはとても良い会社ということも伝わってきました。

# LT後半
### iOS 15以降のNotificationのあり方について考える
Push通知に関する内容で、iOS15でアップデートされた内容の紹介は情報を追いかけていなかったので助かりました。
今後の通知戦略の考え方も参考になりました。

### あなたの知らないSafariのExperimental Featuresの世界
safariで使える実験的なWebKitの機能のon/offrが切り替えられるのは今まで知らなかったので面白かったです。

### SwiftUI.Textを使いこなす5分間
SwiftUIでの一部Boldのテキスト実装の方法や、ImageとTextを組み合わせる方法など実践的で勉強になりました。

### 最強の500系エラー画面を探し求めて
51アプリの500系エラーを集めて分類し、それを元に最適な表現を考察するという内容でした。
とても納得感があるお話でした。

### 「Hey Siri, おはよう」に憧れて
HOMEKit非対応のデバイスをSiriから操作する方法でした。
運営スタッフがスライドの中に入って話すスタイルでショーとしても面白かったです。

# iOSエンジニアがKMPで大規模アプリのロジック共通化をしてうまくできている話
https://speakerdeck.com/nirazo/iosdc2021

現職のチームでも以前KMPのハンズオン的なのをみんなでやろうとして環境構築でうまくいかない人が数名発生して座礁した経験から興味があって聞いてみました。

![スクリーンショット 2021-09-18 18.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/52b64f69-2ccc-f9ce-8aa3-02a941045fcb.png)

共通部分をcommonに書いて、各OS別のものはそれぞれのファイルに書くということでした。
エディタどんな感じでやっているのかは少し気になりました。

![スクリーンショット 2021-09-18 18.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/ee53467a-6e07-91fc-a9f6-dde29935031d.png)

ビジネスロジック部分はかなり共通化に成功しているそうです。
これだけ共通化できるのであれば採用するメリットは大きそうだなと感じました。
ただ、Keychainは一部対応していない部分もあるようでした(通常利用であれば問題ない)。

![スクリーンショット 2021-09-18 18.41.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172991/d4dc2b69-18da-3b29-58b9-74798f200b56.png)

他にもジェネリクスが階層構造になっているとAny型になってしまったり、同名同引数名のメソッドが複数ある場合に引数名に勝手に`_`がついてしまうという課題はあるようですが、Issueが立っていて改善に向けて動いていたり、現状でも回避策はあるとのことなので大きな問題にはならなそうという印象でした。

昨日のFlutterへのリプレイスの話も踏まえて、UIまで共通化したいならFlutter、UIは各OSに最適化したいがビジネスロジックだけ共通化したいのであればKMPという選択になりそうかなと思いました。
今後のトレンドとして開発の効率化は進んでいくと思っているので、現職のチームでもこのあたりを話し合ってみようかなという気持ちになりました。

# おわりに
day1もあっという間に終わってしまいました。。。
楽しい時間は過ぎるのが本当に早いですね。

昨年はセッションを見ながらTwitterで実況的にツイートするというのをやっていたんですが、今年はセッションを見ながらQiita(この記事)を書くというのを試してみています。
オンライン開催だと簡単にスクショできるので捗りますね。笑

それでは明日も楽しみにしつつ、みられなかったセッションをタイムシフト視聴していこうと思います。