ホットリロードは、アプリを実行したまま再起動せずに実行コードを差し替えるテクニックです。Swiftは初めから動的な振舞いが少ない言語でしたが、今ではホットリロードの実現に必要な一部の機能がSwiftでも提供されています。
このトークでは、Swiftの @_dynamicReplacement
の仕組みを解説し、ホットリロードを実践するためのノウハウをお伝えします。
Xcode Previewsでも使われているこの機能は、アプリの中でも使えます。例えば、アプリを再起動せずにビューを変えたり、APIレスポンスを変えたり、カメラのセッションを切らずにフィルターの実装を変えたりもできます。
下記の内容を特に詳しく解説します。動作についてはiOS/macOS/visionOSのシミュレーターと実機で確認済みです。
トークの対象は、提供されているツールを単に使うだけではなく、Swiftの機能を深く理解したうえで使いたい人や、ホットリロードを自分で実装してみたい人です。この機能を活用する予定が今は無かったとしても、このトークでSwiftの実行環境の理解を深める楽しみをお伝えできればと思います。
標準SwiftUIでは美しいインターフェースが提供されています。
一方、ディベロッパがViewを構築する際のガイドラインは提供されておらず、どのようにコードを書けば良いか迷うことも多いかと思います。
2019年のSwiftUI発表以来サイボウズではプロダクションでSwiftUIを使ってきました。
その中でモジュール分割やライブラリ化を経験し、優れたViewインターフェース設計に共通の性質があることがわかってきました。
Modifier
ViewStyle
Content
proxy
このトークではこれらの性質を踏まえて、標準のSwiftUI APIによく馴染み、メンテナブルで美しいコードを設計するためのiOS向けテクニックをコード例と共に紹介します。
このトークが皆様のView設計の助けとなることを期待します。
UIテストの代替手段として、意図しないデザインやレイアウト崩れを検出できるsnapshot testが広く採用されつつあります。
一方、Scrollableな画面はそのままでは画面全体のsnapshotが撮れないため画面外の要素で検知漏れが発生するなどFlaky Testになりがちです。
UIKitの時代はScrollView内部のviewを直接取得してsnapshotを撮るといったことが可能でした。
しかし、SwiftUIではView
というprotocolで隠蔽されるため正攻法ではScrollViewを取得することができません。
本トークでは、UIKitからSwiftUIへ移行する過程で躓いたScrollViewのsnapshot test問題を力技で解決した後、プライベートAPIを使ってその力技を不要にするべく試行錯誤した話をします。
話すこと
_VariadicView
)を使ってScrollViewの中身を取り出す方法話さないこと
_VariadicView
そのものの深堀り▼ 概要
私たちは「あたらしい旅行を、デザインする。」をミッションに旅行アプリ「NEWT」を日々開発しています。
その中で、カスタマーに届ける「品質」と「スピード」を両立させるための手段の1つとして、「GraphQL」・そのクライアントとして「apollo-ios」を利用しています。
カスタマーは、「予約時に知りたい人気ツアーやホテルの情報」・「実際の旅の途中で必要な自身の予約情報」など、場面ごとに最適な情報を、最速で閲覧・利用したいと考えています。私たちは、カスタマーに旅行の出発前から帰国後まで、一生の思い出となるような最高の体験を提供する責任があります。そこで、そうしたニーズに応えるための有効な手段の1つとして、実際にどのようなキャッシュ戦略を駆使しているのかをご説明します。
また、高速なデリバリースピードは高い品質維持の上で成り立ちます。GraphQLを用いた開発過程おいて、スピードを落とさずに品質を高め続けるために、どのようにして土台を整えているかの具体的な方法についてもお話しします。
▼ 内容
・ NEWTはなぜGraphQLを採用しているのか
・ apollo-iosを用いたキャッシュ戦略
・ GraphQL Schemaから自動生成されたSwiftコードを、TestDoubleとして利用するための自動生成戦略
VideoToolBoxは、AVPlayerなどが属するAVFoundationのさらに低位のレイヤーで、動画の圧縮(エンコード)や伸張(デコード)を行います。AVPlayerは非常に優秀なため、ほとんどの場合、VideoToolBoxを直接利用する必要はありません。しかし、MPEGの構造を理解し、VideoToolBoxを使って特殊再生を行うことで、AVPlayerがどれほど複雑な処理を行っているかを垣間見ることができます。
このトークでは、カメラで撮影した映像ファイルをVideoToolBoxで再生し、スキップ、シーク、倍速再生などの特殊再生を行う方法を解説します。また、なぜそのような処理が必要になるのか、MPEGフォーマットの重要なポイントについても説明します。
「WebView内でもログイン状態を維持してください」
アプリ開発をしていると、WebViewを使うことはよくあると思います。
WebView内でログイン状態を維持する方法には、大きく「RequestHeaderにAuthorizationトークンを使用する方法」と「Cookieを使用する方法」の2つがありますが、どちらがより良い方法なのでしょうか?
このトークでは、WKWebViewを用いてユーザーのログイン状態を維持する方法として、上記2つのアプローチについて徹底解説します。
両者を比較し、それぞれのメリット・デメリットを説明したのち、セキュリティ重視や実装の簡便さなど、具体的なケーススタディを通じて最適な選択を議論します。
これらの知識を通じて、参加者はWKWebViewでのログイン状態維持におけるベストプラクティスを学び、自分のプロジェクトに即座に適用できる実践的な知識を得ることができます。
初心者から中級者まで、幅広いレベルの開発者にとって役立つ内容を提供しますので、ぜひご参加ください。
内容:
私は事業用クレジットカードを提供するサービスに携わっており、カードや利用明細を閲覧・管理するiOSアプリを開発しています。
自社でも導入しているため、自分もそのアプリのユーザーです。
アプリではカード番号等をコピーでき、決済ページへの情報入力の際に便利です。
しかし各情報をタップしてコピーする度に「コピーしました」というアラートが表示されます。
アラートはOKボタンをタップして消えるため、カード番号コピー→OKタップ→名義人コピー→OKタップ、とユーザーの連続した動きを中断させてしまいます。
開発時は気にしていませんでしたが、ユーザーの自分は「このアラート邪魔…作ったの誰…」と私自身の実装に対し文句を言うのでした。
そうしてこのアラートが不要だと気づいた私は、ユーザーの操作を妨げずにコピーしたことを伝えようと決めました。
このトークではそのようなユーザーへのフィードバックに、不要なアラートを使わないためのアイデアをお話しします。
はじめに、Apple社製のものをはじめとした様々なアプリにおいて、類似した状況で用いられるフィードバックを調査した結果をまとめます。SwiftUIに無い一時的に表示するバナーの実装や、その為のライブラリの使用は大仰に感じ、まずは事例調査をしました。
その後、プロトタイプの実装やデザイナーとの相談を経て冗長なアラートを取り除くまでの流れを紹介します。
現在担当しているアプリはメインの導線に関してはSwiftUIに移行を完了しました。
SwiftUIへの移行とあわせてSwiftUI Previewを活用して開発とフィードバックのループを高速化し業務に活用しています。
iPadでのUIの活用やダークモードとライトモードの確認に非常に効果的なSwiftUI Previewですが、なかなかクセが強いところもあり
Previewがうまく実行されなかったり、実行に時間がかかってしまったりと、快適に使っていくためには工夫して使っていく必要があります。
それらを踏まえ、このトークでは我々が行っているSwiftUI Previewドリブンな開発、
SwiftUI Previewを快適に活用しながら実装していく為にしていることを紹介させていただきます
具体的なアジェンダは以下のとおりです
過去のiOSDC Japanでも何度か話していますが、私はWebにおけるXR技術であるWebXRを強く推しています。
WebXRとSafariの相性は良くなく、フラグが追加されたかと思いきや、実際には使えないことが多く、なぜSafariでWebXRを楽しめないのかというモヤモヤを抱えてきました。しかし、ついにApple Vision Proが登場しました。
この新しいデバイスのSafariは、iPhoneのSafariとは異なり、WebXR Device APIに対応しています。
AppleはSpatial computingという表現を用いていますが、関連するものとしてSpatial Webもあります。
私はSafari on Apple Vision ProでSpatial WebとWebXRがついに花開く、そう思っていました。
しかし、現時点でのSafari on Apple Vision Proにはまだいくつかの制約があります。
これらの制約が解消されると、理想的なWebXR体験が可能になるでしょう。
本セッションでは、Safari on Apple Vision ProにおけるSpatial WebとWebXRの現状について詳しくお伝えします。
Webが好きで、WebでXRを楽しみたいと考えている“Web屋”の皆さんに向けた内容を予定しています。
Transform from a coder who simply follows instructions to a true engineer who innovates and satisfies customer needs on your own. Learn from my journey transitioning from iOS development to mastering some other areas. Also, discover how to broaden your skills and evolve into roles like tech lead, manager, consultant, freelancer, or founder of a new company creating your own products and services. This session provides real-life experiences and strategies to improve your career and truly become an engineer, who can survive next 10 years.
Xcode Previewsを使用することで即座にレイアウトや動作確認ができ、開発効率を向上させることができます。しかし、依存関係が複雑なプロジェクトでは通常のビルドと変わらないくらい時間がかかってしまいます。
SwiftPMによるマルチモジュール化により、Previewビルドの時間を短縮することもできますが、大規模なプロジェクトでは複数の開発が並行して行われているため、即座に対応することは難しいです。
高速化のための簡易的かつ効果的な方法として、Preview用のTargetを作成する方法を紹介します。依存ファイルを減らすことでビルド時間の短縮を狙いますが、単にTargetを設定するだけではうまくいかない場合が多いです。本トークでは、そこで発生する問題に焦点を当て、具体的な解決策を提案します。
以下について話します。
自分が担当しているアプリではSwiftPMによるマルチモジュール化をせず、この方法を用いることで、約120秒かかっていた初回のPreviewビルドが約23秒になりました。本トークを通じてPreviewのビルド時間を短縮し、よりスピーディな開発環境を構築してみませんか?
本セッションでは、App Store Server APIやApp Store Server Notificationsというアプリ内課金のバックエンドで用いられるApple提供の仕組みの仕様や実装を紹介します。
特にNotificationsはStoreKit2と同じタイミングでバージョン2といえる抜本的な改善がされており、2024年の今も安定して機能追加やApple公式のOSSライブラリも提供されるようになりました。
課金機能がアプリで完結しないケースでは、StoreKit2に加え様々な基盤と相互に連携する必要があります。たとえば有料機能のための認証・認可API、ユーザー分析、iOSアプリ内課金以外の決済手段との連携です。
これらを実現する上で、クライアントの環境・操作内容に依存せずリアルタイムに更新を受信できるバックエンドの機構は依然重要です。しかし、アプリ内課金のバックエンドの仕組みはあまり世間に公開されていません。日本経済新聞社の電子版アプリで提供するサブスクリプションをStoreKit2に合わせてフルリプレースして得られた知見を紹介します。
このトークを通して、参加者は通常目を通すことが少ないアプリ内課金のバックエンド側の最新動向を学ぶことができます。システム全体を把握して、バックエンドチームと連携する際にも効果的に役立つ Tips が学べるセッションとなります。
目的:
Swift標準ライブラリやサードパーティツールを使用した、iOSアプリ開発における様々なノイズ除去技術を紹介し、 最高品質の音声録音を実現するための方法を紹介します。
内容:
アクセシビリティは、すべてのユーザーにアプリを利用してもらうための重要な要素です。
このセッションでは、SwiftUIを使用してアクセシブルなiOSアプリを構築するための具体的な技術と知見を紹介します。具体的には、以下のポイントについてお話します。
VoiceOverの設定 - 視覚障害者向けのナビゲーション補助。
Dynamic Type対応 - ユーザーがテキストサイズを調整できる機能。
カラーコントラストの最適化 - 色覚多様性に対応したデザイン。
インタラクション要素の設計 - タッチやジェスチャーの使いやすさの向上。
このセッションを通じて、アクセシブルなアプリ開発のための具体的な知識とスキルを習得しましょう。
noteのiOSアプリにはこれまでUndo/Redo機能がありませんでした。しかし、この春にUndoManagerを導入しUndoに対応しました。
UndoManagerは、アプリにUndo・Redo機能を提供してくれる強力なクラスです。
特にnote アプリのような編集アプリにとって、Undo機能は必須の機能の一つといえます。
しかし、意外とUndoManagerを使いこなしているアプリは少ないのが現状です。
本トークでは、UndoManagerの基礎から、実際のアプリへの導入方法、そしてその際のはまりポイントまで、実体験に基づいて解説します。
[内容]
一緒にUndoManagerを使いこなし、アプリのユーザーエクスペリエンスを向上させましょう!
みなさんの会社ではUIKitからSwiftUIへの移行をどのように進めていますか?
また、移行の際に既存のシステムアーキテクチャをどう扱えば良いか悩んでいる方も多いのではないでしょうか。
私たちのiOSアプリ「note」では、VIPERというアーキテクチャを採用しています。
VIPERはiOSアプリ開発にクリーンアーキテクチャの一種で、View、Interactor、Presenter、 Entitiy、 Routingなどに責務を分割するアーキテクチャです。
本セッションでは、noteのiOSアプリにおいて、UIKitからSwiftUIへの移行した際、どのようにVIPERアーキテクチャと向き合っていったかを共有します。
多くの現場でUIKitからSwiftUIへの移行が進んでいるかと思いますが、このセッションでは実務で得た具体的なノウハウをお伝えし、皆様のプロジェクトに役立てていただければと思います。
WWDC21でTextKit 2が発表されました。NSTextLayoutManagerを中心とした新しいテキスト操作へのアプローチは無限の可能性を感じさせた一方で、その実用には多くの困難が伴います。本セッションではそんなTextKit 2を使うことで、テキストとレイアウトの柔軟な関係を実現し、テキスト操作の限界に挑みます。
Compose MultiplatformはiOS、Android、Desktopアプリ間でUIコードを共有できる宣言的UIフレームワークです。
これまでKotlin Multiplatformというクロスプラットフォームのフレームワークが存在しましたが、UIコードの共有はできませんでした。
しかし、Compose Multiplatformが登場により、この制約が解消されました。
Jetpack ComposeはAndroid開発向けの宣言的UIフレームワークですが、Compose Multiplatformを使うことで、同じUIコードをiOSアプリにも適用できます。
本セッションでは、以下の内容について解説します。
Jetpack ComposeとCompose Multiplatformのノウハウを身につけることで、効率的なクロスプラットフォーム開発が実現します。
iOS/Androidの垣根を越えた開発を目指す方の参考になればと思います。
iOSアプリでキーボードショートカットに対応するケースは多くありません。しかし、あなたのアプリがiPadで使用でき、長文のテキスト入力が必要な場合、キーボードショートカットを実装することで操作性が向上します。iOSアプリでは UIKeyCommand
を使用することで、カスタムのキーボードショートカットを作成できます。
本セッションでは、あまり知見が知られていないキーボードショートカットについて深く掘り下げます。
モバイルアプリ開発において、ネットワークエラーは当然想定しなければならないエラーです。ただネットワークエラーになった場合にアプリとして対処できることは「回線の復旧を待ってリトライ」であることがほとんどであり、正直雑に処理しているケースがほとんどではないでしょうか?
しかしネットワークエラーの適切なハンドリングによって、更なるUI/UXの向上が実現できるかもしれません。たとえば、YouTubeアプリはオフライン状態を検知した場合、アプリ内のダウンロード済動画への導線を表示するプレミアムユーザー向け機能があります。
本セッションでは、ネットワークエラーを適切に扱うための考え方と、実際の対応方法について話します。
具体的には以下の内容を扱います。