Amarronの日記

iOSやMac、Web系の記事を書きます。

iOSDC JAPAN 2020 感想 自分用メモ

iOSDCの概要

f:id:Amarron:20200921183322p:plain

iOSDC JapanはiOS関連技術をコアのテーマとした技術者のためのカンファレンスです。今回はオンライン開催です! iOSDC Japanと言えば日本中、世界中から公募されたスピーカーによる知的好奇心を刺激するトークと参加者間のコミュニケーションですが、オンライン開催となる今回も変わらず、そして今まで以上にお楽しみ頂ける企画を検討中です。 開催に関連するニュースは本サイトのお知らせや公式Twitterアカウントでお知らせします。是非フォローしておいてください。

開催概要 開催2020年9月19日(土)〜9月21日(月・祝) 場所オンライン 対象iOS関連技術およびすべてのソフトウェアエンジニア 主催iOSDC Japan 2020実行委員会 (実行委員長 長谷川智希 @tomzoh)

iosdc.jp

コメントが多かったトーク

  • 1位 GitHub ActionsでiOSアプリをCIする個人的ベストプラクティス / uhooi
  • 2位 AVAudioEngineでリアルタイムレンダリング / 八十嶋祐樹

全体の感想

  • ニコ生について
    • そもそもニコ生をあまりみないのでシリアルコードの入力など戸惑う
    • 家のネットワーク環境の問題かニコニコの問題か、高画質で見ると音が飛び飛びになる
    • リアクションが文字なので独特
  • 内容について
    • 動画やナレーションが豪華で力が入っている
    • 質疑応答などはDiscodeらしいので、少し物足りない(Discodeの使い方がよくわからなかった)
    • セッションとの時間の感覚があるので休憩が取りやすい
    • DMMの広告が多い
    • SwiftUIの話題が多い
    • カンファレンスに参加すると自分の知ろうとしていない分野の知識が増えて視野が広がった気がする
  • その他
    • 前撮りした動画を流す形で配信(ライトニングトークはライブ)
      • 後からyoutubeでも見れるので見たいセッションが重なっていても安心

自分が聞いたトーク

  • 9/20
    • Background Notificationで新聞紙面の大きい画像の自動ダウンロードを実現する / Takagi Go
    • 100人でアプリをリファクタリングして見えてきた、最強のiOSアプリ設計に求められること / Yuta Koshizawa
    • Flutter移行の苦労と、乗り越えた先に得られたもの / 桐山圭祐
    • 新規機能開発からモジュール分割を始めてみる / Ryo Izumi
    • エラーアーキテクチャ設計について考える / きちえもん
    • iPadOSDC: Multiple Windows / ひろん
    • 効率よくUIKitからSwiftUIへ移行する / josh
    • ライトニングトーク
  • 9/21
    • 詳解Storyboard / 日向強
    • 継続的にアプリのパフォーマンスを計測する / kariad
    • クックパッドが、革新的な方法でまったく新しい買い物体験を皆様にお届けします」 / 藤坂 祐史
    • 大解剖!UIColorファミリー / しもとり
    • SwiftUIを導入したアプリ設計 / Yu Tawata
    • Apple Silicon への長い道 / hak
    • ライトニングトーク

9/20

Background Notificationで新聞紙面の大きい画像の自動ダウンロードを実現する / Takagi Go

speakerdeck.com

  • 背景
    • コンテツの自動ダウンロード
      • 快適なユーザ体験
      • 通信環境
    • 的配信コンテンツ
      • 寝ている間にアプリへ配達
      • ユーザーを逃さない
    • 通信量はそれなりのサイズ
  • iOS Background Mode
    • Background Mode
      • f:id:Amarron:20200921183255p:plain
      • 制約
    • Backgroundでダウンロードする方法
      • Background App Regresh Task(iOS 13.0+)
      • Background Notification(iOS7.0+)
        • push型
        • 許諾は必要なし
      • Background Transfer Service(iOS7.0+)
    • 「Background Notification(iOS7.0+)」採用
  • 全体的なアーキテクチャ
    • f:id:Amarron:20200921183301p:plain
  • 細かいTips
    • Background Notificationの性質に対処
      • 実行確率を上げるため、複数回送る
      • Background Notification自体を複数種類作らない
    • OS側が止めてしまうことを前提としたロジック
      • 排他制御のミスに気をつける
      • 最小限の単純なロジックにする
    • 提示できる状態はなるべき明示的に周知
    • Background Notificationに通知の許諾はいらない
    • Background Push Notificationの動作確認
      • 通知が必要なので、基本的に実機が必要
    • (ちなみに)Simulatorで通知を操作する
    • 運用すると課題が見えてくる
      • アクセスのピークが発生する
    • 端末側の問題
      • 端末による成功率の違いが如実に
    • OSによって落とされにくいアプリへと改善する
  • 安定して受け取るために
    • 利用するBackground Modeの選択
    • 動かしたい時間帯の考慮
    • アプリ本体は健康

100人でアプリをリファクタリングして見えてきた、最強のiOSアプリ設計に求められること / Yuta Koshizawa

SwiftUIで作るリバーシアプリ - github

  • 設計に見られた共通項
    • Presentation Domain Separation(PDS)
    • Enterprise Business Ruleの分離
    • 状態遷移の整理
    • 依存関係逆転の原則(DIP)
    • 一方向のデータフロー
    • 静的型の活用
  • Presentation Domain Separation
    • Presentation(UI)とDomain(ロジック)を分離する
    • Clean Architecture
    • モジュールを分ける方法
  • Enterprise Business Ruleの分離
    • Enterprise Business Ruleとは、アプリに依存しない汎用的なルール
    • オセロ
      • Disc・・・おせろ、白黒の状態を持つ
      • Board・・・オセロの数、挟んだら色が変わる
      • Game・・・ゲームの状態(ゲーム中/終了)、どちらの番とか(対戦相手がマニュアルかコンピュータかはゲームに含めない)
  • 状態遷移の整理
    • f:id:Amarron:20200921183300p:plain
  • 依存関係逆転の原則(DIP)
    • デリゲートで依存関係を逆転される(Presentation -依存-> Domain の形にする)
    • 他の方法
      • DI
      • Combineによる変更通知、値型による変更通知
  • 一方向のデータフロー
  • 静的型の活用

Flutter移行の苦労と、乗り越えた先に得られたもの / 桐山圭祐

  • Flutterとは
  • 話すこと
    • Flutterを採用して実際どう立ったか
      1. どんな技術的課題に直面したか
      2. 乗り越えた時のメリット
  • じゃらんおFlutter移行
  • 前提の共有
    • Flutterへの段階的移行
      • Add-to-appを使用
        • FlutterViewController
        • FlutterView
        • FlutterEngine ← Dartのコードを実行している
      • 既存のネイティブプログラムに組み込む
    • Flutterのレイアウト構築
  • 直面した課題
    • タブ切り替えのパフォーマンス
    • Flutterの画面が初期化されない
    • ネットワーク通信がproxyサーバを経由しない
    • Google Mapのクラッシュ
  • タブ切り替えのパフォーマンス
    • リストのアイテムを大量に読み込んでタブを切り替えると重い、またはクラッシュする
    • どう回避したか
      • AutomaticKeepAliveClientMixinを適用することで、画面をクリアさせない
  • Flutterの画面が初期化されない
    • Flutterの画面を再度開くとFlutterの画面だけ、前回の画面が残る
    • どう回避したか
      • FlutterViewControllerは初期化されていたが、FlutterEngineが初期化されていなかった
      • FlutterEngineを初期化すると時間がかかる
      • 初期画面を明示的に呼び出す処理を書く
  • ネットワーク通信がproxyサーバを経由しない
    • Flutterだとproxyサーバを経由できない
    • どう回避したか
      • PACを指定する
  • Google Mapのクラッシュ
    • google_maps_flutterを使うとメモリが解放されないため何度も利用しているとクラッシュされる
    • どう回避したか
      • google_maps_flutterのバージョンが上がったことでメモリが正しく開放されるようになった
  • 直面した課題まとめ
    • 致命的なものはなかった
  • メリット
    • 開発効率の向上
      • 規制部品の充実
        • Widgetの種類がとて充実
      • hot reload/ restart
        • ビルドが即時に反映される
      • IDE(Android Studio)の機能の充実
    • 工数の削減
    • 上記以外のメリット
      • 宣言的UI構築が素晴らしい
      • FlutterはOSSであるので、内部処理を確認できる
      • など

新規機能開発からモジュール分割を始めてみる / Ryo Izumi

speakerdeck.com

  • マルチモジュール
  • 新規機能からモジュールを分割する
    • 新しい施策の機能をモジュールに分割する前提で設計する
  • 手順
    1. 要件、使用の整理
    2. 責務を決める
    3. input/outputを定義
    4. framework
    5. 開発
  • メリット
    • 通化すべき部分が見えてくる
    • 既存コードに囚われなくなる
    • 影響範囲の縮小
  • デメリット
    • プロジェクトファイルのコンフリクト
      • XcodeGenを導入するべきだった
    • モジュール分割の単位が機能単位になる
    • 抽象度が上がるので実装がどこにあるか分かりにくくなる可能性

エラーアーキテクチャ設計について考える / きちえもん

speakerdeck.com

  • モチベーション
    • エラーをいい感じに扱いたい
  • 環境
    • RxSwift
  • エラーの種類
    • enumで定義することでなんのエラーがあるかわかる
  • 固有エラーは個別定義
  • 問題点
    • エラーケースを方で表現できない
    • エラーケースの漏れが発生
    • 機能固有のエラーケースを個別に処理できない
  • 改善
    • 型で制約をかける
    • 列挙型を利用する
    • 固有エラーは個別に処理する
  • 2種類のユースケース
    • 基本コース:晴れの日のシナリオ
      • すべてが上手く行ったシナリオ
    • 代替コース:雨の日のシナリオ
      • 何かしらうまくかなかったシナリオ
  • 雨の日のシナリオを考えるのがエラーアーキテクチャ
  • エラーアーキテクチャ設計まとめ
    • f:id:Amarron:20200921183314p:plain

iPadOSDC: Multiple Windows / ひろん

speakerdeck.com

  • iPadOS
  • Multiple Windows
    • 複数のスペースで同じアプリを開いて作業する
    • メモの動作
      • SplitViewで同じアプリの別ウィンドウを並べられる
      • メモのアイテムをドラックすると別のウィンドウを開くことができる
      • Appスイッチャーや、AppExposeでウィンドウを閉じることができる
  • 予備知識
    • 1つのアプリのプロセスは従来どおり1つ
    • ここまで「スペース」や「ウィンドウ」とよんできたものは「シーン」に相当
    • 全面に表示されていないシーンは切断されたり、そもそも接続されてなかったりする
  • 登場人物図
    • f:id:Amarron:20200921184540p:plain
  • サンプロコード
  • Step 1 シーンは簡単
    • Xcode11で新規プロジェクト作成
      • iOS13以降で考える(iOS12で対応すると大変)
    • info.plist に Scene Manifest を追加
    • SceneDelegate クラスを作る
      • 今までは画面のライフサイクルに関する通知はAppDelegate
      • Sceneごとにの通知はSceneDelegateが呼ばれる
    • AppDelegate から SceneDelegate へ引っ越し
  • Step 2 複数のシーンをサポート!戦いの始まり
  • Step 3 シーン状態の保存ならオレにまかせろ
    • NSUserActivity
      • アプリの状態を表現するクラス
    • OSからの要求に答える
    • 状態の復元
    • 状態の保存はシーン API の機能
  • Step4 プログラムから新しいシーンを展開
  • Step4(2) プログラムから新しいシーンを閉じるようにしたい
  • その他のトピック
    • シーンのライフサイクル
      • f:id:Amarron:20200921184545p:plain
    • シンクロナイズドシーン
      • 片方の画面を更新したらもう片方に反映したい
      • 特別な方法があるわけではない
        • KVM、NotificationCenter、Combine、他
      • データが単方向に流れていると同期しやすい

効率よくUIKitからSwiftUIへ移行する / josh

speakerdeck.com

  • Why move to SwiftUI
  • Why not move to SwiftUI
    • バグが多い
    • 古いOSに対応していない
    • 複雑な画面に対応できない場合がある(ヒューマンインターフェースガイドラインに準じていない場合もある)
  • Modernize Swift usage
    • Objective-CをSwiftへ移行する
    • Swiftのバージョンを新しくする
  • Modernize UIKit usage
    • Storyboardを分ける
  • Plan and prototype
    • プロトタイプのアプリを作って、実験する
  • Architecture
  • Two approaches
    • 末端の画面からSwiftUIへ変更している
  • Tips
    • 画面内でUIKitとSwiftUIを混ぜない
    • 簡単な画面からSwiftUIへ切り替えていく
    • 急ぎすぎない(無計画に進めると大変なことになる)
    • SwiftUIとCombineを事前に勉強しておくことが大事

ライトニングトーク

  • Catalystに対応したアプリをリリースするまでのリジェクト集 / かっくん
    • Macだと考えることが少し多い
  • In App Purchaseのこれからの在り方を考える / Yuki Yamamoto
  • iOS Custom Keyboards でできること/できないこと/やってはいけないこと / Kyome
    • できること
      • 好きなキー配置、特殊な記号、背景を変更
    • できないこと
      • キーボードだけをAppStore配信できない
    • やってはいけない
      • 余計な機能を搭載
  • DroidKaigiの公式アプリで始めるiOSアプリのOSSコミッターへの道 / 遠藤拓弥
    • 修正が認められなかった
      • issueに取り込む前に修正範囲を明確にしていなかった
      • 確認が足りなかった
    • この経験を活かして次は修正したところ無事コミットできた
  • Apple Pencilと左利き対応 / ああうえ
    • ツールバーの位置について(右利きは右側、左利きは左側)
  • ダークモード対応とAutoLayoutアニメーションと私 / Abebe
  • macOS仮想カメラ「テロップカム」実装方法とその先 / 服部 智
    • CoreMediaIO DAL Plugin
    • NSPasteBoard
  • 文字列をコピーできるスクリーンショットを作る / えんどう
    • なぜPDFは文字列をコピーできるのか
      • PDFに文字情報を持っている
    • なぜ文字列をコピーできなかったのか
      • 文字情報を持っていなかった
    • 文字列をコピーできるPDFを作るには
      • ViewをそのままPDFに出力する
  • あなたのアプリ、✨リブランディング✨できますか? / monoqlo
  • iOSアプリを譲渡!?失敗は許されない一発勝負!予想外に立ち塞がる様々な罠に挑んだストーリー / じんむ

9/21

詳解Storyboard / 日向強

speakerdeck.com

  • UIHostingController
    • 内部にSwiftUIを持つことができるViewController
  • IBSegueAction
  • リストア機能
    • Restoration
      • SceneDelegateでは使えない
  • Storyboardを分割する
  • Localization
  • テキストにundoをつける
  • OSバージョンごとにStoryboardを差し替える
  • 様々な画面に対応する
  • ActionはObject化する
  • Delegate
    • Collectionで返すと複数のActionを呼べる

継続的にアプリのパフォーマンスを計測する / kariad

speakerdeck.com

  • アジェンダ
    • なぜパフォーマンス計測が必要なのか
    • iOSアプリにおけるパフォーマンス計測
    • 継続して計測する仕組みの作成
    • 運用してみて
    • これから
  • なぜパフォーマンス計測が必要なのか
    • 重い、クラッシュする
  • iOSアプリにおけるパフォーマンス計測
    • 代表例
      • Instruments,MetricKit、外部サービス
    • Instruments
      • どこのパフォーマンスが悪いのか分析、特定する機能をサポート
    • MetricKit
      • iOS13から利用可能
      • 起動時間、CPU使用時間、バッテリー消費、クラシュなど
      • ユーザの操作の計測
    • 外部サービス
      • FireBase、HeadSpin
  • 継続して計測する仕組み
    • パフォーマンスが悪くなってからでは遅い
    • 継続的な計測で必要なもの
      • 計測ツール
        • Instrumentsを採用
      • 最新のアプリ
        • 毎日の更新に追従した最新のアプリで継続
        • releaseビルドと同等の最適化されたアプリで計測
          • ipaのresignを利用した
      • 実機
        • 自前で管理はコストが高い
        • クラウド型のデバイスファーム
          • f:id:Amarron:20200921184548p:plain
          • HeadSpin
            • 様々なパフォーマンス計測もできるデバイスファーム
          • Appium
      • CI
        • 今回の計測では2種類
          • 計測対象のアプリをビルド、resignする
          • 計測を行う(負荷ツールを動かす)
        • Jenkins
          • Jenkins自体の管理が必要
          • 脱Jenkinsを目指している
    • アプリ操作用のUITestフレームワーク
      • Appium
    • アプリに負荷をかけるツール
    • この構成で起きた問題
      • Appium serverの問題
        • Xcodeのバージョンの問題
        • traceファイルの保存先
      • Instrumentsの問題
        • 計測結果を定量的な数値で取得する方法がない
  • 実際に運用してみて
    • 問題点
      • Appiumの不安定さ
      • 実行パターンの増加
      • 季節
      • インカメラの利用
      • 結果確認フローの問題
    • 運用した結果の変更
      • f:id:Amarron:20200921184557p:plain
  • これからの展望
    • xctrace
      • Xcode12からInstrumentsコマンドがdeprecatedとなりxctraceが追加された
    • Bitrise(MacStadium)への移行
    • 他項目の計測

クックパッドが、革新的な方法でまったく新しい買い物体験を皆様にお届けします」 / 藤坂 祐史

  • 全く新しい買い物体験 クックパッドマート
    • 課題
      • 実店舗だと品揃えや並びなど
      • ネットだと送料や1品だと買えないなど
    • クックパッドマート
      • 送料無料で1品からでも買える
      • 専用冷蔵庫
        • 好きな時間、好きな場所で受け取りOK
      • 注文アプリ、配送アプリ
      • 技術的な取り組み
        • 配送アプリ・・・配達員専用アプリ
          • ドライバの位置情報を常にオンにする
          • puree
    • クックパッドアプリの「買い物」機能
      • レシピから買い物へ
      • 新機能の画面はSwiftUIで実装している
      • SwiftUIを導入すべきか?
        • f:id:Amarron:20200921184603p:plain
      • SwiftUIで良かったこと
        • Viewの組み立てが楽
          • 状態のあるUIがわかりやすい
          • データを入れるだけで、良きに再描画される
          • コンポーネント単位で使いまわし、可変しやすい
          • スタイル調整も楽

大解剖!UIColorファミリー / しもとり

speakerdeck.com

  • 話すネタ
    • UIColorにはサブクラスがいっぱい
    • サブクラスの紹介
    • UIColorのサブクラス自作は結構難しい
    • UIColorのメソッドの挙動を見る
  • UIColorにはサブクラスがいっぱい
    • サブクラスは18個ある
    • デザインパターン
      • Class Cluster
        • サブクラスが複雑な処理をしてくれる
  • サブクラスの紹介
    • f:id:Amarron:20200921184610p:plain
    • UIPlaceHolderColor
      • 何か特定の色を指しているわけではない
    • UI(Cached)DeviceRGBColor
      • RGBで指定される色のクラス
    • UIDynamicColor
      • traitの変化に応じて動的に変わる
        • systemBlueなど
      • Asset Catalogから得られる
    • その他フレイムワーク
      • UICIColor
        • CIColorを受け取って
      • UIPatternCGClor
      • NSColor
  • UIColorのサブクラス自作は結構難しい
    • UIColor直下に作る簡単なものならOK
    • privateのサブクラスに作るのは難しい
  • UIColorのメソッドの挙動を見る
    • isEaual(to:)
      • 同じ色でもサブクラスが違うと等しくならない

SwiftUIを導入したアプリ設計 / Yu Tawata

speakerdeck.com

  • アジェンダ
  • 設計の目標
  • SwiftUI
    • 考慮すべき要件
      • 機能
        • 複数のアプリ起動経路
      • 非機能
        • アナリティクスの画面遷移
    • 複数のアプリ起動経路
      • UIKitの場合
        • Coordinator
      • SwiftUIの場合
    • UIKitをベースにしてSwiftUIを実装する
  • 検証
    • 次のクラスでSwiftUIを利用できるか
      • UITableView
      • UICollectionView
  • アーキテクチャ
    • f:id:Amarron:20200921184613p:plain
    • フロー
      • f:id:Amarron:20200921184619p:plain

Apple Silicon への長い道 / hak

  • SoCの歴史
    • AAPL0098
    • AAPL0298
    • AAPL0398 / A4
    • AAPL498, 2498, 7498 / A5
    • AAPL5498 / A5X
    • A6 / X
    • A7
      • 64bit
    • A8 / X
    • A9 / X
    • A10 Fusion / X
      • Big/Small コア
    • A11 Bionic
    • A12 Bionic / X / Z
    • A13 Bionic
  • Apple Silicon

ライトニングトーク

  • 本当はこわいLLDB / みやし
  • iOS 13における Siri Shortcuts 最小実装+α / 明渡麻衣花
    • NSUserActivityを利用する
  • xcrun Essentials / Yutaro Muta
    • xcrunとは
    • xcrunを使う
      • xcrun simctl
      • xcrun xccov
  • Swiftで分かるSOLID原則 / 川口 航平
    • 単一責任の原則
    • リス古布の置換原則
    • 依存性逆転の原則
  • SwiftUIとFlutter / tamappe
    • Flutter最高
    • SwiftUIとFlutterは似ている
  • 100人以上の中高大学生にiOSアプリ開発を教えていて感じたこと / とし
    • プログラミング
      • 一緒にやる、自分でやってみるのフロー
      • 何度でも説明など
    • アプリについてきちんと考えられるのか
  • Feature Flagを適切に分類することでA/Bテストの運用コストを下げる / Takeshi Ihara
    • A/Bテスト + Feature Flag
    • Feature Flagの分類(生存期間、変更規模を考える)
      • Release Flag
      • Ops Flag
      • Permission Flag
      • Experiment Flag
  • CryptoKitとCoreBluetoothを利用したスマートキー開発 / saiten
    • 車の鍵をiPhoneで開く
    • RxBluetooth
    • CryptoKit
  • Apple Low-Latency HLSを使った超低遅延配信について / meteor
    • 遅延
    • HTTP Live Streaming
    • CMAF
  • 着信時氏名表示させたいエンジニア vs 簡単には着信時氏名表示できない電話番号 (iOS13対応版) / 栗山 徹
    • 0はじまりでない電話番号で氏名が表示できない