レギュラートーク(40分)

XVimがSherlockされるまで

r_plus taiki komaba

Xcode 13最大の新機能と言えばVimキーバインドの登場ですね!
多くの開発者が利用しているVim/NeovimのキーバインドがとうとうXcode標準で使えるようになりました。

Xcode 12まで、多くのVim好きの開発者はVimキーバインドを利用するために、
Pluginの形式で提供していたXVimというソフトウェアを利用していました。

このトークではそんなXVimないしXcode Plugin業界に襲いかかってきた
macOS, Xcode, Swift, AppleSiliconの様々な技術的ハードルについてメンテナーが振り返って供養します。

6
採択
2022/09/12 13:00〜
Track C
レギュラートーク(40分)

The state of Swift for WebAssembly in 2022

kateinoigakukun kateinoigakukun

SwiftのWebAssembly対応を進めている、SwiftWasmというプロジェクトがあります。

現在、WebAssemblyはWebブラウザ上の用途だけでなく、「複数言語からコンパイルできて様々な環境で動く高速なプログラム」として、エッジコンピューティングやIoT、ブロックチェインにおけるスマートコントラクトなど、様々な分野で用途が模索されています。

もし将来的にWebAssemblyが覇権を取った場合、そこでSwiftが活躍できるポジションはあるのでしょうか?

このトークでは、Wasm対応によって達成できる未来、プロジェクトの最新状況と課題、実際の活用事例を紹介したいと思います。
Appleプラットフォーム以外でのSwiftの活用に興味のある方には、特に楽しんで頂ける内容になる予定です。

レギュラートーク(40分)

続・めくるめくシェーダアートの世界

ta_ka_tsu ta_ka_tsu

シェーダアートとはシェーダと呼ばれるGPUで実行されるプログラムを記述することで様々なイメージをスクリーン上に表現する手法のことです。
シェーダでは各ピクセルの座標値と共通のデータを入力として色を出力する関数を記述するだけですが、その手法は様々で驚くべき表現が可能となります。

3年前のiOSDC2019「めくるめくシェーダアートの世界」ではシェーダアートの原理を細かく説明しました。
しかし原理や基礎から丁寧に説明することに重きを置いたため、「レイマーチングを使用した3D表現」に関してはあまり時間を割くことができませんでした。
レイマーチングを駆使してからがめくるめく世界への入り口であるというのに!

そこで本トークではレイマーチングを使用した3D表現の解説に重きを置いて再びシェーダアートの原理とその魅力を語ります。

6
レギュラートーク(40分)

段階的に導入して理解するDI Container

_rockname 岩名 勇輝

依存性の注入(DI)によりコンポーネント間の結合度を低めるのは良いことですが、コンポーネントの再利用にかかる依存関係解決のコードはボイラープレートになりがちです。この問題を解決する手段として、依存関係およびそれらのライフタイムを管理するコンテナクラスであるDI Containerの導入が考えられます。

本トークでは、SwiftUIで開発されたiOSアプリにDI Containerを段階的に導入しながら、各ステップでどのような問題が解決されていくかについてお話しします。

アジェンダ
・DIおよびDI Containerについて
・DIの導入
・DI Containerの導入
・動的な依存関係の解決
・静的な依存関係の解決
・コードの自動生成による静的な依存関係の解決
・DI Containerでのスコープ管理
・マルチモジュールにおけるDI Container

3
レギュラートーク(40分)

アプリケーションアイコンのライブドローイング

1024jp 1024jp

macOSやiOSのアプリケーションアイコンは強いスタイルがが存在します。「立体的に」とか「シンプルに」とかHIGでも書かれているけど、書くは易し。実際には何をどう描けばその立体感は実現するのでしょうか。特にmacOSのアイコンは物体のリアリズムが求められ、リッチな陰影表現が必要となります。大丈夫です。3Dモデリングをせずとも、ぼかしやグラデーションなどの組み合わせでこう言った表現は実現できるのです。
このセッションでは、CotEditorやSparkleフレームワークなどのアプリケーションアイコンを手掛けた1024jpが、Illustratorを使ってmacOSアプリケーションアイコンを解説しながら実際に時間内でイチから描きます。これはライブです。

10
採択
2022/09/11 14:10〜
Track B
レギュラートーク(40分)

詳解 Core NFC - NFC を用いた iOS App 開発のてびき

treastrain treastrain / Tanaka Ryoga

NFC とは駅・空港での自動改札機やお店での電子マネー決済、社員証や学生証をかざした入退出管理など、日常でよく見かけるアレを叶える技術です。

iPhone に搭載されている NFC を私たちの App で使うためには Core NFC を用います。これは iOS 11 から利用可能になり、iOS 13 のタイミングで大きくアップデートされました。昨今の情勢から非接触技術が注目されたり、eKYC に利用できたりと、現在進行形でさまざまな App で利用が広がっています。

私は iOS 13 のときから3年間、この Core NFC を使った App の個人開発を続け、関連する OSS も公開してきました。それによって得た iOS 固有の NFC 利用まわりの知見や、これから Swift Concurrency + Core NFC を活用する App を開発する際の流れ・例を紹介します。

採択
2022/09/11 14:10〜
Track C
レギュラートーク(40分)

SwiftUIとUIKitを仲良くさせる

auramagi Apurin Mikhail

SwiftUIが発表されてからすでに3年が経ちました。
しかしいまだに開発現場から採用が難しいという声が聞こえてきます。
UIKitとSwiftUIの併用も可能ですが、実際に採り入れてみるとさまざまな問題が発生しました。
このセッションではそれらの問題を解決する手法を紹介します。

  • レイアウト・プレビュー
    • UIView / UIViewControllerをSwiftUIの中で使うとき
    • RepresentableKitの紹介
    • ViewをUIKitで使うとき
  • Appライフサイクル
    • UIApplicationDelegateとUISceneDelegateを引き続き使う
    • Appでまだ取得できないイベントをSwiftUIに伝える
    • iOS 13の交互性を考慮する
  • 状態管理
    • 共通の状態をどうするか
    • 依存の受け渡し
レギュラートーク(40分)

CreateML/CoreMLで作る最先端のインタラクション

_DS_Store なかおかれい

近年、Human computer interaction(HCI)の研究分野では機械学習を利用しスマートフォンのインタラクションをより豊かにする研究が多く行われています。

・音声認識を利用しスマホで叩いた物体を認識
・画像認識を利用しApple Pencilの機能を拡張
・イヤホンのセンサを活用した行動認識

これらの研究を応用することで例えば、スマホで欲しい物を叩くだけでECサイトでその物を注文できるようになったり、非接触でモバイル端末の操作ができたりと今までのアプリに無いようなインタラクションを実現できます。本セッションではそのような研究事例を紹介し、実際にCreateML/CoreMLでモデル構築、デモアプリの実装を行います。CreateML/CoreMLや機械学習に興味がある方、既存のアプリにはない面白い機能を実装したい方などに興味を持っていただける内容です。

5
レギュラートーク(40分)

iPad対応ガチ勢始めました 2022 - とある学習アプリの現在

toshi0383 鈴木 俊裕

abceedアプリにおけるiPad対応の経緯と現在の方針について詳らかにします。
abceedは学習アプリとしてtoB向けにも展開していますので通常よりもiPadユーザーの割合が多く、広い画面で気持ちよく学習できるようデザインの最適化を積極的に行っています。
今回は私からアダプティブレイアウトのひとつのやり方としていろいろなトピックを共有し、みなさんのなにか議論のきっかけとなれば嬉しいと思っています!
以下のようなことを話す予定です。

  • 基準とする画面サイズの決め方
  • SizeClassを使わない理由
  • SplitView対応のポイント
  • ハードウェアキーボードとキーボードショートカット
  • 工数の見積もり
  • 品質担保(QA)
3
採択
2022/09/12 13:00〜
Track A
レギュラートーク(40分)

Swift Concurrency時代のiOSアプリの作り方

koher Yuta Koshizawa

昨年、Swift Concurrencyが導入されました。当初はiOS 15のみでサポートされていましたが、Concurrencyのback deploymentが実現されたため、iOS 13以降であれば今すぐにでもConcurrencyを取り入れることができます。

しかし、実際にConcurencyを取り入れようとすると、参考となる情報はまだまだ少ないのではないでしょうか。Conccurency自体の情報は豊富でも、iOSアプリ開発での活用、特にactorや単体テストなどについてはほとんど語られていないように思います。

本トークでは、iOSアプリ開発におけるConcurrency活用の一つのベースラインとなることを目指して、async/awaitやTask、actor、MainActorなどを、アプリやテストのコードにどのように取り入れるか、具体例を用いて紹介します。

111
レギュラートーク(40分)

宣言的UIを徹底比較!SwiftUI x Jetpack Compose x Flutter

yohta_watanave watanave

iOSのSwiftUI、AndroidのJetpack Compose、そしてマルチプラットフォームのFlutter…

モバイル開発は宣言的UIの時代に突入しました。
このセッションではこれら3つのフレームワークの特徴や考え方、具体的な実装方法を比較します。

他フレームワークの技術から得られる新しい発見、全てのフレームワークに共通する重要な概念を明らかにします。

11
レギュラートーク(40分)

UIKitとMetalで紐解くFlutter

yohta_watanave watanave

昨今話題のFlutter。
実はFlutter内部ではUIKitやMetalといったiOS技術が使われています。
このセッションではUIKitやMetalの解説と共に、Flutterの内部の仕組みを紐解きます。

「タッチイベントはどのように処理されてる?」
「どうやってレンダリングしてる?」

そこが分かればもう怖くない!

7
レギュラートーク(40分)

読みとるから読み解くへ

d_date Daiki Matsudate

身の回りにはさまざまな形式のデータが存在し、読みとるためのAPIが提供されています。
例えば、AVFoundationを使えば、QRコードを読みとれます。CoreNFCであれば、iPhoneでNFCタグとデータをやり取りできます。
データ形式がJSONなら、Codableを使って簡単に変換できます。

しかし、APIが用意されないデータの読み取りは自分で実装する必要があります。
データ形式や通信方式は特定の機関が標準化しており、電子証明書に利用されるASN.1はその一例です。
標準化されているからといって、標準のAPIが提供されるとは限りません。

このトークでは、まず馴染みあるデータの読みとり方を整理します。
次に、ASN.1を例に、Parserの基本原理、仕様の調べ方を解説し、実際に実装してみます。
標準仕様の読み解き方とその実装方法を知ることで、処理できるデータの幅を広げましょう。

19
採択
2022/09/11 11:05〜
Track A
レギュラートーク(40分)

アニメーションAPIのすべて

k_katsumi 岸川克己

iOSにはさまざまなアニメーションAPIがあります。思いつくだけでもUIView.animate()、Core Animation、UIViewPropertyAnimatorがあり、Core Animationが提供するAPIは膨大ですべてを使った人は稀でしょう。物理演算を追加するUIKit Dynamicsもあります。さらにSwiftUIでは.animation()や.withAnimation()というModifierによる手段が提供されています。
これらのAPIがカバーする範囲は重なっていて、同じことを別のAPIでも実現できます。それぞれのAPIをどのように使い分けるのでしょうか?

この講演では各APIの使い方を実用的なパターンの実例を示しながら解説し、どのような判断で使い分けるべきかを示します。すべてを明確に理解し、表現の引き出しを増やして、アニメーションをマスターしましょう!

レギュラートーク(40分)

UIKitベースの個人開発アプリをFull SwiftUIに移行した方法と実践

0si43

iOS 14からSwiftUIに App が追加され、Full SwiftUIでのアプリ開発が可能になりました。が、UIKitでつくりこまれたUIを移行するのは容易ではなく、移行例はあまり多くないのではないでしょうか。

そんな状況で、私は2021年末に個人開発のノートアプリ「Pieces of Paper」をFull SwiftUIに移行しました。本トークでは実際に移行を行った際に経験した様々な問題を中心に話したいと思います。

  • なぜ移行しようと思ったのか
  • 移行する方法
  • 実践する中でハマった数々の問題と対応
    • @ObservedObject の意図しない初期化によるバグ
    • 反映されると思った状態変数がnilになる
    • UIKitベースのライブラリ(特にコア機能の PencilKit )とのブリッジをどうするか、など
  • 移行するメリットはあったのか?
7
レギュラートーク(40分)

確実な動作を最優先したアプリ設計

yaso_san 八十嶋祐樹

iOSのアプリ開発では、意識してコードを書いていないと、予想外のタイミングで不要なイベントが実行されてバグが起きてしまうことがよくあります。

無秩序な非同期処理もそうですが、特にUI周りはプログラマがコントロールしきれるものでなく、予想外に起きるイベントを完全に無くすことはできません。

アプリを安全・確実に動作させるためには、そのような不安定な外部要因に依存せず、アプリの状態を構築する事が必要です。

このトークでは、確実な動作をするアプリを作るにはどうすれば良いかを、以下のような内容でお話しする予定です。

・iOSのUIの問題点
・画面遷移の方法について
・UIに依存せずにアプリの状態を持つ
・「機能」と「生存期間の管理」を分けてオブジェクトツリーを構築する
・循環参照を起こさない構造にする
・非同期関数を隠蔽する

4
採択
2022/09/10 17:15〜
Track D
レギュラートーク(40分)

SwiftUI Navigation のすべて

kalupas226 アイカワ

SwiftUIのNavigation APIは「Tab, Alert, Sheet, Navigation Link...」など様々な種類が存在し、OSによるインターフェースの変化も激しいです。
また、これらのAPIを利用して画面遷移を実現する際には多くの選択肢があり、画面遷移が増えれば状態管理も複雑になります。

このトークでは、そんなSwiftUI Navigationについて以下の内容で発表します。

・SwiftUIのシンプルな画面遷移と状態駆動型の画面遷移について俯瞰
・状態駆動型の画面遷移の利用時に起きる状態の不整合、不要な状態の管理を改善するswiftui-navigationの手法

本トークではPoint-Free製のswiftui-navigationを深掘ることによって、よりSwiftUIのNavigationについて理解できるようになることを目指します。

採択
2022/09/11 11:05〜
Track B
レギュラートーク(40分)

Swift Concurrency Next Step

stzn3 shiz

Swift5.5で登場したSwift Concurrencyは、非同期処理を簡潔で安全に扱える機能です。主な機能は既に追加済ですが、現在も新しい機能の追加や改善が行われています。
今回は、この1年で見られた進化や実装上のTipsなどを紹介します。また、Swift6以降に既存のコードが動かなくなるリスクを最小限に抑えるための段階的導入方法など、ちょっと先の未来についても見ていきます。

例:

  • Swift5.6以降の新機能や変更
  • エラーやキャンセル時の子タスクの挙動
  • Taskのinitとselfの関係
  • Actorが切り替わるタイミング
  • swift-async-algorithmsから見る実装方法
  • iOS frameworkとの連携
  • Swift6で何が起こるのか?

これからConcurrencyをもっと使ってみようと思っているみなさまのお役に立ちましたら幸いです。

採択
2022/09/12 13:00〜
Track D
レギュラートーク(40分)

react-reconcilerでオレオレReact Nativeを作ろう!

_kwzr_ ああうえ

Reactの思想であるLearn Once, Write Anywhereを推し進めるため、React内部にはReactをどこでも動かせるようにするreact-reconcilerというパッケージが存在します。

react-reconcilerはReact DOMやReact Nativeで利用されているUIの差分検出処理のパッケージで、JSXで書かれたコンポーネントのマウントや更新通知を受け取れます。これを使って独自のレンダラーを作ってみましょう。

このトークでは、react-reconcilerのレンダラーをSwift(UIKit)で実装して自分だけのReact Nativeを作る方法について話します。