初リモート開催の iOSDC 2020 景色

### 参加動機
- そもそも人見知りすぎてコンファレンスなど嫌がり
- 会社チームで強引された

### 特記
- 一般参加者としては多分初めての完全リモートコンファレンス
- ニコ生、Discord で行われた
- ツイッターで参加者・発表者のアクティビティを誘導

### 参考
- 本投稿の作成者はアプリ開発者ではない
- 自分がライブで参加したセッションのみメモ
- ケースによって自分がよくわからない・逆にわかっているところはメモが省略されている可能性
- 大体個人的な感想
- Youtube の iOSDC チャンネルなど動画掲載があるらしい
(https://www.youtube.com/c/iOSDCJapan/videos)

### 1日目(2020/9/20)

#### iOS にない macOS 独自機能を Catalyst で実現する (D)

- 2018 WWDC から発表された Catalyst
- macOS 特有の Menu bar, Touch bar, Tool bar
- Menu Bar
  - UIResponder に buildMenu があるので AppDeletgate ovveride
  - UIMenuSystem
  - UIMenu
  - UIAction
  - UICommand
  - UIKeyCommand
  - canPerformAction (活性化)
- UIMenuの Identifierを指定 
- UICommand, UIAction, UIMenu を定義
- Touch Bar
  - NSGroupTouchBarItem
  - NSButtonTouchBarItem
  - NSColorPickerTouchBarItem
  - NSTouchBarItem.Identifer を指定
  - AppDelegate で makeTouchBar を実装
- Tool Bar
  - NSToolbar.Identifier 指定
  - AppDelegate で makeToolBar を実装
  - autosavesConfiguration=true にして実装を自動保存できるように
- Big Sur の変化
  - SplitView 設定ができる！

#### 400 種類のアプリビルド自動化 (B)

- yappli と言う会社
- Slack-bolt.dev とは？
  - https://slack.dev/bolt-js/concepts
- Dependabot (Github App) の導入検討
  - https://github.com/dependabot
  - https://github.com/marketplace/dependabot-preview
- 基本プロセス
  - 以前までビルド Mac に直接接続したことで行われたプロセスの自動化
  - Slack-bolt で Jira の特定チケットからビルド Mac へのビルドトリガーを連携
  - Dependabot でビルドMac の重要依存性アップデートを自動化
  - 証明証更新も Slack-bolt で
    - `fastlane sigh`で全ダウンロード・`repair!` しない理由＝契約更新したかしらないから 

#### Flutter 移行 (C)

- Flutter は便利で、信頼性あるけど、問題も散在
- タブの切り替えアニメーションが重たい
  - アプリクラッシュもあるから避けたい
  - タブウィジェットに AutomaticKeppAliveClientMixin を適用 (with で)
- Flutter -> Native -> Flutter の Flutter 表示リセット
  - Add-to-app: 既存アプリのネイティブに Flutter 部分的適用
  - Flutter 画面落としても FlutterViewController は破棄されるけど、インスタンスは残る
  - 初期化には時間が掛かるから、毎度初期化は❌
  - Init Page 用意して、Controller teardown で 表示させ
- Network server -> Proxy 経由しない
  - なぜか Flutter はパケットモニタリングできなかった
  - Flutter で Proxy 経由させるには PAC を明示的に指定する必要
  - PAC 指定：`HttpOverrides.createHttpClient(context)  ..findProxy = (uri) { return “PROXY xxx.xxx.xxx.xxx:xxxx” }`
- Google Map クラッシュ
  - Google Map からのメモリリーク
  - Google Map の PlatformView で循環参照
  - Flutter アップデートで直った

#### DMM の Debug 関連環境変数注入アプリ (B)

- pixiv ではデバッグ設定データを注入するアプリがある
- UserDefaults と App Groups を含め
- 単に言うとバックドアじゃない？
- App Groups でデータ共有させること
- Developers ページで App groups 設定
  - Capabilities -> App Groups チェック
  - Xcode の Signing & Capabilities で連携アプリ選択
  - userDefaults.set(true, forKey:<key>)
- コツ
  - 宣言的に UI 構成する(name, bundleID)
  - UITableView に入る項目の constructor を実装
  - UITableView に Group を作って constructor 追加

#### Error Architecture (D)

- error の扱いを改善…
- Error が幅広くラップされている問題
  - エラーの詳細が見えるように
  - ユースケースの漏れを確認したい
- 必要な設計
  - 固有のエラーは個別に処理
  - 列挙形の利用
  - 形で制約をかける
- iOSで AppUseCaseError を渡すように

#### Github Actions (B)

- Uhooi(┌|▼▼|┘)の圧がすごい
- CIの長所
  - remote repo 問題が確認できる
  - 自動だからビルドの手間がかからない
  - ローカル違いによる問題が整えられる
  - 結果が簡単に確認できる
- CIの短所
  - CI 学習のコスト
  - 課金
- cmake で整えて Github Actions…
- GHA=1yaml 1ワークフロー
- フォーク元のGHAは動かない

#### Swift 4.2 -> 5.x (D)

- Swift 6 系では async/await が…
- 5.x 特徴
  - Result?: 成功・失敗を返すenum 
  - Ordered Collection Diff: Collection 中身を insert/remove(Diffable DataSourceでしか使えない)
  - Opaque Return: Shape を含める enum, abstract Shapeを返せる(SwiftUIで有用)
  - Property Wrapper: カスタム getter/setter の実装

#### LT 1

- reject の理由＝MacOS 甘えんな
- IAP ガイドライン：？
- iOSキーボードの開発で注意事項：30MB 制限
- 左利きのApple Pencil 使い方。これアップルが配慮して欲しい

#### LT 2

- 仮想カメラ：VirtualCameraSampleMain
- PDF は圧縮：view.layer.renderLayer → view に PDF レンダーする実装を
- リーブランディング：きせかえは Asset Catalog で管理しよう
- アプリの引き渡し：SignInWithApple 解除 / KeyChain の UserDefaults / 課金の国設定 

### 2日目(2020/9/21)

#### Note のビルド周り自動化 (C)

- テスト用の新端末登録(UDID、機種など取得し)
- ビルド
- changelog 取得し追記
- appstore アップロード
- release
- dsym アップロード

→自分の主務とだいぶ同じ

#### Bazel と Micro Modular Architecture (E)

- Monolith: 大きすぎるとビルドに時間もかかるし、重たい
- Bazel は Micro-Modularization の期初
- Modularization: Application-Features-Domains-Libraries
- Bazel: Fast+Reliable+Scalable+Extensible
  - Plugin 概念なのでいろんな言語で書ける
  - Build Cache もリモートで使える
  - Pinterest はこれで 20~40% 速度改善できた
  - LINE も Bazel 使ってる（あと堀さんも)
  - LINE のリポ：https://github.com/line/rules_apple_line
- Bazel 書き方：WORKSPACE ファイルがあったら一旦 Bazel
  - bazel build //target 
  - Xcode で index を切り替える：lyft/index-import
- Bazel の iOS 支援は非公式
- iOS でも Gradle は実は使えたんだ
- 積極的な Cache (Micro Modularized ones ごとにキャッシュ)
- GraphWiz
- https://bazel.build

#### 組織とアプリ開発プロセス(C)

- 13~14人に マーケッターやテスターが含まれる
- リードタイム削減が目的
- 専門レイヤーにチームを分ける
- Scope(UXMap) -> Priority -> Process
- Incremental(１から、いいえ、０から) vs. Iterative(概ねから)
  - 最初は結局Incremental, 機能追加は Iterative
  - 結局 Priority 想定はこの場面で要る

#### Firebase Dynamic Links(D)

- In App message に関して
- FDL でできること
  - Deep Link かな？→似てるけど少し違う
  - 未設置→インストールリンク
  - 設置→特定画面へ遷移
- 長所
  - iOS/Android 関わらず１つのアドレスで出来る
  - 振替ウェブページへの遷移もできる
  - イベント、アクセスユーザなどが集計できる
- Firebase 導入方法
  - firebase console でケースによる許容リストを作成(`\`要る)
  - APPID 
  - アプリに import firebase し Firebase.configure で設定
- Dynamic Link 生成
  - 短縮 URL リンクを設定する
  - 両方の動作を定義(iOS, Android系)
  - 生成後にイベントのトラッキング情報追加可能
- App 内の設定
  - Signing Capabilities で Dynamic link を導入
  - 該当画面で handle 処理を行う
  - アプリのバージョンチェックで、アップデートさせるかどうかを決定
  - 失敗したら crashlytics への報告も設定できる
- 動的リンクの弱点
  - `動的リンクを作ると、 Analytics に含まれなくなるのが辛いところです。`

#### CTIサービスと物理デバイス(A)

- CTI(Computer Telephony Interation) →コールセンターのあれ！
- CTI は：お客からの電話を分配すること、各種情報を収集し保存
- iOS関係＝iPad などとCTIの連携
- 実際 iOS の技術的な部分はなかった気が…

#### Apple Silicon (E)

- Google Stadia Tech solution Engineer さんが語る Apple Silicon
- マジか… iphone の半導体(コア)の話だった…
- でも面白い歴史授業

#### LT 1

##### LLDB
- Obj-c のコンパイルで使うLLDB
- pvc で.h を解析
- tv <hash> でファイル検証
- vinfo <hash> でファイル情報確認
- pc <↑から見えるindex> <メソッド> でメソッド解析

##### iOS13 Siri ショットカット
- NSUserActivity で shortcut にアクション入れる
- ？（素人すぎてメモできなくなった）

##### xcrun essentials
- 基本 simctl list/create/delete などの話だった

##### Swift でわかるSOLID

- Single responsibility(1クラスは 1アクター)
- O
- Liskov Substitute 
- I
- Dependency Contrast (

##### Flutter vs. SwiftUI

- SwiftUI のプロトコルが多すぎ問題
- Flutter はUIレイアウト関連でわかりやすい
- Grid/LazyGrid 

#### LT2

##### iOS開発の教育
- 教えのコツ
- 知るのが当然(x) 知らないのが当然(o)
- 説明は理解するまで
- Human Interface Guideline?
- Appとは：一言で説明できるように

##### Feature Flag で A/Bテスト改善
- 特定機能がちゃんと動くかの判定＝Feature Flagで
- ライフサイクル順で以下のように分類
- Release
  - 本番用
  - サイクル短い、変更は少ない
- Experiment
  - パーフォマンス・テスト用
- Ops
  - システムの動作
- Permission
  - 制限・ユーザ権限

##### CryptoKit / Core Bluetooth でスマートキー
- RXBluetoothKit と言うライブラリで楽にBluetooth 使える
- Challenge → sha256 で有効検証 → 確認したらオープン
- CryptoKit は CommonCryptより書きやすい(swiftだから)

##### Low-Latency HLS で超低遅延配信
- Periscope: TS を Chunk Transfer Encoding で予め送る
- Apple は逆にごまきれ

##### 着信者表示
- Call Directory Extension で Caller 情報確認
- 0から始まらないと caller directory extension で認識ができない
- ↑ iOS 12までは国番号つけて、13からはしなくてもおkだった