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

Swiftにおけるホットリロードの仕組みと実践

banjun ばんじゅん🍓

ホットリロードは、アプリを実行したまま再起動せずに実行コードを差し替えるテクニックです。Swiftは初めから動的な振舞いが少ない言語でしたが、今ではホットリロードの実現に必要な一部の機能がSwiftでも提供されています。

このトークでは、Swiftの @_dynamicReplacement の仕組みを解説し、ホットリロードを実践するためのノウハウをお伝えします。
Xcode Previewsでも使われているこの機能は、アプリの中でも使えます。例えば、アプリを再起動せずにビューを変えたり、APIレスポンスを変えたり、カメラのセッションを切らずにフィルターの実装を変えたりもできます。

下記の内容を特に詳しく解説します。動作についてはiOS/macOS/visionOSのシミュレーターと実機で確認済みです。

  • ホットリロードできるバイナリのビルド
  • Swiftが関数置き換えをする仕組み
  • 実機向けのsandboxやコード署名

トークの対象は、提供されているツールを単に使うだけではなく、Swiftの機能を深く理解したうえで使いたい人や、ホットリロードを自分で実装してみたい人です。この機能を活用する予定が今は無かったとしても、このトークでSwiftの実行環境の理解を深める楽しみをお伝えできればと思います。

10
レギュラートーク(20分)

標準SwiftUI APIによく馴染むViewインターフェースの作り方

el_metal_ el_metal

標準SwiftUIでは美しいインターフェースが提供されています。
一方、ディベロッパがViewを構築する際のガイドラインは提供されておらず、どのようにコードを書けば良いか迷うことも多いかと思います。

2019年のSwiftUI発表以来サイボウズではプロダクションでSwiftUIを使ってきました。
その中でモジュール分割やライブラリ化を経験し、優れたViewインターフェース設計に共通の性質があることがわかってきました。

  • Single-responsibility Modifier
  • Applying appearances with ViewStyle
  • Injecting Content
  • Operate via proxy

このトークではこれらの性質を踏まえて、標準のSwiftUI APIによく馴染み、メンテナブルで美しいコードを設計するためのiOS向けテクニックをコード例と共に紹介します。

このトークが皆様のView設計の助けとなることを期待します。

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

SwiftUI時代のsnapshot testing

417_72ki 417.72KI

UIテストの代替手段として、意図しないデザインやレイアウト崩れを検出できるsnapshot testが広く採用されつつあります。
一方、Scrollableな画面はそのままでは画面全体のsnapshotが撮れないため画面外の要素で検知漏れが発生するなどFlaky Testになりがちです。

UIKitの時代はScrollView内部のviewを直接取得してsnapshotを撮るといったことが可能でした。
しかし、SwiftUIではViewというprotocolで隠蔽されるため正攻法ではScrollViewを取得することができません。

本トークでは、UIKitからSwiftUIへ移行する過程で躓いたScrollViewのsnapshot test問題を力技で解決した後、プライベートAPIを使ってその力技を不要にするべく試行錯誤した話をします。

話すこと

  • UIKitでScrollView内部のsnapshotを撮る方法
  • SwiftUIでScrollView内部のsnapshotを撮るために行った力技
  • プライベートAPI(_VariadicView)を使ってScrollViewの中身を取り出す方法

話さないこと

  • snapshot testのライブラリについて
  • _VariadicViewそのものの深堀り
レギュラートーク(20分)

「品質」と「スピード」を両立させるためのGraphQL戦略

ryu1sazae Rick

▼ 概要
私たちは「あたらしい旅行を、デザインする。」をミッションに旅行アプリ「NEWT」を日々開発しています。
その中で、カスタマーに届ける「品質」と「スピード」を両立させるための手段の1つとして、「GraphQL」・そのクライアントとして「apollo-ios」を利用しています。

カスタマーは、「予約時に知りたい人気ツアーやホテルの情報」・「実際の旅の途中で必要な自身の予約情報」など、場面ごとに最適な情報を、最速で閲覧・利用したいと考えています。私たちは、カスタマーに旅行の出発前から帰国後まで、一生の思い出となるような最高の体験を提供する責任があります。そこで、そうしたニーズに応えるための有効な手段の1つとして、実際にどのようなキャッシュ戦略を駆使しているのかをご説明します。

また、高速なデリバリースピードは高い品質維持の上で成り立ちます。GraphQLを用いた開発過程おいて、スピードを落とさずに品質を高め続けるために、どのようにして土台を整えているかの具体的な方法についてもお話しします。

▼ 内容
・ NEWTはなぜGraphQLを採用しているのか
・ apollo-iosを用いたキャッシュ戦略
・ GraphQL Schemaから自動生成されたSwiftコードを、TestDoubleとして利用するための自動生成戦略

9
レギュラートーク(20分)

MPEG構造を把握し、VideoToolBoxを使った特殊再生の実装方法を理解する

k2_moons k2moons

VideoToolBoxは、AVPlayerなどが属するAVFoundationのさらに低位のレイヤーで、動画の圧縮(エンコード)や伸張(デコード)を行います。AVPlayerは非常に優秀なため、ほとんどの場合、VideoToolBoxを直接利用する必要はありません。しかし、MPEGの構造を理解し、VideoToolBoxを使って特殊再生を行うことで、AVPlayerがどれほど複雑な処理を行っているかを垣間見ることができます。

このトークでは、カメラで撮影した映像ファイルをVideoToolBoxで再生し、スキップ、シーク、倍速再生などの特殊再生を行う方法を解説します。また、なぜそのような処理が必要になるのか、MPEGフォーマットの重要なポイントについても説明します。

1
採択
2024/08/23 16:50〜
Track D
レギュラートーク(20分)

楽しく簡単に!QRコードの読み取り機能を実装しよう

penguinsan_pg ぺんぎんさん

iOSアプリには、カメラを使ってQRコードの検出・読み取りを行う機能がよく組み込まれます。
しかし、この機能をアプリ内で実装するには、AVCaptureSessionを用いた入力デバイスや出力データの管理、AVCaptureVideoPreviewLayerを用いたカメラプレビューの表示、AVCaptureMetadataOutputからQRコードの情報の取得...など、多くの関連するクラスを扱う必要があり、複雑な実装を行わなければなりませんでした。

そこで登場するのが、VisionKitフレームワークです。
iOS 16以降に利用可能なDataScannerViewControllerを使うことで、カメラを使った検出・読み取りの機能をシンプルかつ簡単に実装できます。

このトークでは、以下の内容についてお話しします。

  • VisionフレームワークとVisionKitフレームワークの概要
  • 従来のQRコード読み取り処理とその問題点 (AVFoundationフレームワークを利用した実装)
  • DataScannerViewControllerを用いた実装方法の紹介 (VisionKitフレームワークを利用した実装)

QRコードの読み取り機能に苦労していた日々は今日でおしまいです。
みんなで楽しくVisionKitフレームワークを学びましょう!

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

WebViewにおけるログイン状態の維持 - RequestHeader vs Cookies -

marcy731 marcy731

「WebView内でもログイン状態を維持してください」

アプリ開発をしていると、WebViewを使うことはよくあると思います。
WebView内でログイン状態を維持する方法には、大きく「RequestHeaderにAuthorizationトークンを使用する方法」と「Cookieを使用する方法」の2つがありますが、どちらがより良い方法なのでしょうか?

このトークでは、WKWebViewを用いてユーザーのログイン状態を維持する方法として、上記2つのアプローチについて徹底解説します。
両者を比較し、それぞれのメリット・デメリットを説明したのち、セキュリティ重視や実装の簡便さなど、具体的なケーススタディを通じて最適な選択を議論します。

これらの知識を通じて、参加者はWKWebViewでのログイン状態維持におけるベストプラクティスを学び、自分のプロジェクトに即座に適用できる実践的な知識を得ることができます。
初心者から中級者まで、幅広いレベルの開発者にとって役立つ内容を提供しますので、ぜひご参加ください。

内容:

  • WKWebViewとは
  • RequestHeader / Cookies の説明
  • RequestHeaderを用いたログイン情報の維持、そのメリット・デメリット
  • Cookiesを用いたログイン情報の維持、そのメリット・デメリット
  • まとめ
2
レギュラートーク(20分)

アラートでユーザーの操作を止めたくない、でもトーストやバナーの独自実装は気が乗らない。何か良い案はないか!

_ski_u さかいゆうのすけ

私は事業用クレジットカードを提供するサービスに携わっており、カードや利用明細を閲覧・管理するiOSアプリを開発しています。
自社でも導入しているため、自分もそのアプリのユーザーです。

アプリではカード番号等をコピーでき、決済ページへの情報入力の際に便利です。
しかし各情報をタップしてコピーする度に「コピーしました」というアラートが表示されます。
アラートはOKボタンをタップして消えるため、カード番号コピー→OKタップ→名義人コピー→OKタップ、とユーザーの連続した動きを中断させてしまいます。

開発時は気にしていませんでしたが、ユーザーの自分は「このアラート邪魔…作ったの誰…」と私自身の実装に対し文句を言うのでした。
そうしてこのアラートが不要だと気づいた私は、ユーザーの操作を妨げずにコピーしたことを伝えようと決めました。

このトークではそのようなユーザーへのフィードバックに、不要なアラートを使わないためのアイデアをお話しします。

はじめに、Apple社製のものをはじめとした様々なアプリにおいて、類似した状況で用いられるフィードバックを調査した結果をまとめます。SwiftUIに無い一時的に表示するバナーの実装や、その為のライブラリの使用は大仰に感じ、まずは事例調査をしました。
その後、プロトタイプの実装やデザイナーとの相談を経て冗長なアラートを取り除くまでの流れを紹介します。

3
採択
2024/08/22 18:10〜
Track D
レギュラートーク(20分)

GPSでどのようにして現在地が分かるのか

inonb ta.inoue

位置情報のCore Locationは、衛星電波の届く戸外ではかなり精確な現在地を得ることができ、多くのアプリで利用されています。フレームワーク内部では、いわゆるGPSと呼ばれる衛星測位をベースに、WiFiやセルラーのアクセスポイントも援用した、スマートフォンならではの測位手法が使われています。

GPS(GNSS)測位の基本的な原理は、いくつかの衛星と受信機を結ぶ三角測量といえ、非常にシンプルなものです。とはいえ、2万キロの距離を微弱な電波で結ぶための様々な工学的工夫があり、また、ネットワークの位置情報を効果的に参照することで、すばやく精確な測位を実現しています。

このトークでは、衛星からの電波にどのような情報が入っているのかを覗いてみて、私たちが普段便利に使っている位置情報がどのように求められているかを確認してみます。

32
レギュラートーク(20分)

快適なSwiftUI Previewドリブン開発に移行するためにしたこと

satoshin21 satoshin21

現在担当しているアプリはメインの導線に関してはSwiftUIに移行を完了しました。
SwiftUIへの移行とあわせてSwiftUI Previewを活用して開発とフィードバックのループを高速化し業務に活用しています。

iPadでのUIの活用やダークモードとライトモードの確認に非常に効果的なSwiftUI Previewですが、なかなかクセが強いところもあり
Previewがうまく実行されなかったり、実行に時間がかかってしまったりと、快適に使っていくためには工夫して使っていく必要があります。

それらを踏まえ、このトークでは我々が行っているSwiftUI Previewドリブンな開発、
SwiftUI Previewを快適に活用しながら実装していく為にしていることを紹介させていただきます

具体的なアジェンダは以下のとおりです

  • SwiftUI Previewドリブンな開発とメリット
  • マルチモジュールな設計とSwiftUI Preview
  • 徹底的に依存を排除する
  • 限りなく小さい単位でビルドする
4
レギュラートーク(20分)

Safari on Apple Vision ProにおけるSpatial WebとWebXRの現状確認

ikkou HEAVEN chan / ikkou

過去の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屋”の皆さんに向けた内容を予定しています。

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

Don't be just an iOS Coder: Multi-Skill Growth & Career Transformation

kent_strong_dev Kent Strong

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.

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

Targetを活用してXcode Previewsビルドを爆速化!

yamakentoc yamaken

Xcode Previewsを使用することで即座にレイアウトや動作確認ができ、開発効率を向上させることができます。しかし、依存関係が複雑なプロジェクトでは通常のビルドと変わらないくらい時間がかかってしまいます。
SwiftPMによるマルチモジュール化により、Previewビルドの時間を短縮することもできますが、大規模なプロジェクトでは複数の開発が並行して行われているため、即座に対応することは難しいです。

高速化のための簡易的かつ効果的な方法として、Preview用のTargetを作成する方法を紹介します。依存ファイルを減らすことでビルド時間の短縮を狙いますが、単にTargetを設定するだけではうまくいかない場合が多いです。本トークでは、そこで発生する問題に焦点を当て、具体的な解決策を提案します。

以下について話します。

  • Previewビルドを早くするためのいくつかの方法
  • Preview用のTargetを用いてビルド時間を短縮する方法
  • 依存関係が複雑なプロジェクトに適用した時に生じた問題点とその解決策

自分が担当しているアプリではSwiftPMによるマルチモジュール化をせず、この方法を用いることで、約120秒かかっていた初回のPreviewビルドが約23秒になりました。本トークを通じてPreviewのビルド時間を短縮し、よりスピーディな開発環境を構築してみませんか?

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

App Store Server API、Notifications を利用したバックエンドの課金ネットワーク構築

shimastriper shimastripe

本セッションでは、App Store Server APIやApp Store Server Notificationsというアプリ内課金のバックエンドで用いられるApple提供の仕組みの仕様や実装を紹介します。
特にNotificationsはStoreKit2と同じタイミングでバージョン2といえる抜本的な改善がされており、2024年の今も安定して機能追加やApple公式のOSSライブラリも提供されるようになりました。

課金機能がアプリで完結しないケースでは、StoreKit2に加え様々な基盤と相互に連携する必要があります。たとえば有料機能のための認証・認可API、ユーザー分析、iOSアプリ内課金以外の決済手段との連携です。
これらを実現する上で、クライアントの環境・操作内容に依存せずリアルタイムに更新を受信できるバックエンドの機構は依然重要です。しかし、アプリ内課金のバックエンドの仕組みはあまり世間に公開されていません。日本経済新聞社の電子版アプリで提供するサブスクリプションをStoreKit2に合わせてフルリプレースして得られた知見を紹介します。

このトークを通して、参加者は通常目を通すことが少ないアプリ内課金のバックエンド側の最新動向を学ぶことができます。システム全体を把握して、バックエンドチームと連携する際にも効果的に役立つ Tips が学べるセッションとなります。

2
採択
2024/08/23 15:40〜
Track A
レギュラートーク(20分)

詳解UIWindow

n_atmark atsuyan

みなさん、UIWindowというクラスについてご存知でしょうか。

グローバルに画面最前面に要素を表示するHUD(Head up display)の実装を行う際などにUIWindowを用いることがよくあります。しかし、通常の開発で直接触ることは少ないためUIWindowについてあまりよく理解せずに使われていることも多いのではないでしょうか。

例えばUIWindowにおける表示順はUIViewのsubViewsにおける表示順などとは少し異なっているため注意が必要です。 isKeyWindow がtrueなUIWindowが最前面であると思われたり、 UIApplication.shared.windows の順番がUIWindowの表示順であると思われたりしがちですがどちらも間違っています。

また、複数のUIWindowを表示している際のステータスバーの挙動にも一癖あります。特定の画面でステータスバーを非表示にしたいようなケースでUIWindowの特性をちゃんと把握していないと意図した挙動を実現できないことがあります。

このトークではUIWindowがどういうものなのか、UISceneやUIViewとの関係性を踏まえて話しつつ、UIWindowの表示に関する挙動や利用する際の注意点について紹介します。

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

ノイズを極限まで除去しクリアな音声を録音する方法

Mucchooooo ヤズジュ夢佐

目的:

Swift標準ライブラリやサードパーティツールを使用した、iOSアプリ開発における様々なノイズ除去技術を紹介し、 最高品質の音声録音を実現するための方法を紹介します。

内容:

  1. Swift標準ライブラリ
    AVFoundation, CoreAudioなどのSwift標準ライブラリを使ってできるノイズ除去手法の紹介と簡単な実装例を紹介します。
  2. サードパーティツール
    世の中に存在するノイズ除去が可能なツール、 高度なAIを活用したノイズ除去用サードパーティライブラリをいくつか紹介したり、それぞれの利点、実際にどれぐらいノイズを除去できるのかのライブデモ、利点の比較などを行います。
  3. ライブデモ
    実際にノイズ除去技術を利用して録音した音声を、ノイズ除去していないもの、Swift標準ライブラリでノイズ除去したもの、サードパーティーライブラリでノイズ除去したもの、複数のツールを組み合わせたものなどを実際に聴いて比較し、最強のノイズ除去ベストプラクティスを決定します。
5
採択
2024/08/23 17:25〜
Track C
レギュラートーク(20分)

Core Audio徹底解剖

entaku_0818 entaku

みなさんはCore Audioを利用してiOSで音声を扱ったことはありますか?
iOSではCoreAudioをはじめ、AVAudioPlayer/AVAudioRecorderやAVAudioEngineなどさまざまな音声を扱うAPIが存在しますが、どのAPIを使ってどのような音声処理ができるのか?を語られることは少ないと思います。

このセッションでは、オーディオデータの取得と処理技術、リアルタイム録音技術、再生技術を学び、iOSアプリケーションのオーディオ機能を強化するための実践的な例とベストプラクティスを紹介します。

本セッションを聴き終わった際にはあなたもiOSで音声処理を試してみたくなることでしょう

  1. Core Audioの理解:
    • Core Audioのアーキテクチャの概要
    • iOSオーディオスタックにおけるCore Audioの役割
  2. オーディオデータの取得と処理:
    • オーディオデータの取得方法とその処理
    • サンプルレート、ビット深度、チャンネル数の基本概念
  3. 高度なオーディオ技術:
    • リアルタイムオーディオ録音の実装:
    • 効率的なバッファ管理とデータ転送
    • 音声エフェクトの実装と管理
    • オーディオエフェクトの追加と調整
  4. 実践的な例とデモ:
    • 実際のコードを用いたデモ
    • 実践的なサンプルプロジェクトの紹介
38
レギュラートーク(20分)

SwiftUIでアクセシビリティに優れたiOSアプリを構築する

kzytcbn315 たっち

アクセシビリティは、すべてのユーザーにアプリを利用してもらうための重要な要素です。

このセッションでは、SwiftUIを使用してアクセシブルなiOSアプリを構築するための具体的な技術と知見を紹介します。具体的には、以下のポイントについてお話します。

VoiceOverの設定 - 視覚障害者向けのナビゲーション補助。
Dynamic Type対応 - ユーザーがテキストサイズを調整できる機能。
カラーコントラストの最適化 - 色覚多様性に対応したデザイン。
インタラクション要素の設計 - タッチやジェスチャーの使いやすさの向上。

このセッションを通じて、アクセシブルなアプリ開発のための具体的な知識とスキルを習得しましょう。

6
採択
2024/08/23 10:50〜
Track D
レギュラートーク(20分)

アプリバイナリ解析入門 〜実機向けバイナリをARM64シミュレータ向けに変換する方法を例に〜

Ooka

皆さん、バイナリ形式で配布されるSDKがx86_64のシミュレータしか同梱されていない状況に困ったことはありませんか?
本トークでは、実機向けバイナリをARM64シミュレータ向けに変換する作業を通じて、アプリのバイナリを解析する手法を紹介します。
具体例としてLive2D Cubism SDKを取り上げ、必要なツール(lipoとotool)、バイナリ解析の基礎、バイナリ変換手法、動作確認までを丁寧に解説します。

  • バイナリ変換の基本概念と必要なツール(lipoとotool)の紹介
  • ARM64バイナリをシミュレータ対応のバイナリに変換する手順
    • Mach-Oバイナリの基本構造の理解
    • 必要なコマンドの置き換え
    • オフセットの再計算方法
  • 変換したシミュレータ対応バイナリをLive2D Cubism SDKに組み込み
  • iOSシミュレータでの動作確認

基本的なiOS開発の経験があれば十分です。ARM64アーキテクチャに関する知識やバイナリ解析の経験がなくても問題ありません。

このトークを通じて、バイナリ解析の楽しさを少しでも伝えられればと思います。お楽しみに!

32
レギュラートーク(20分)

ノートアプリにUndo機能を実装! UndoManager導入ポイント

watura watura

noteのiOSアプリにはこれまでUndo/Redo機能がありませんでした。しかし、この春にUndoManagerを導入しUndoに対応しました。

UndoManagerは、アプリにUndo・Redo機能を提供してくれる強力なクラスです。
特にnote アプリのような編集アプリにとって、Undo機能は必須の機能の一つといえます。
しかし、意外とUndoManagerを使いこなしているアプリは少ないのが現状です。

本トークでは、UndoManagerの基礎から、実際のアプリへの導入方法、そしてその際のはまりポイントまで、実体験に基づいて解説します。

[内容]

  1. UndoManagerの概要とUndo・Redo方法
  2. Undoのグルーピング機能
  3. note アプリへのUndoManager導入
  4. 導入時に遭遇したはまりポイントと解決策
  5. UndoManagerを使ったテストの書き方

一緒にUndoManagerを使いこなし、アプリのユーザーエクスペリエンスを向上させましょう!

5