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

このSwiftUIの迷宮(ダンジョン)にState-Drivenのマインドセットを!

lovee 星野恵瑠

SwiftUIの登場により、iOS開発はUIKitのEvent-DrivenからState-Drivenのパラダイムへと進化しました。しかし、まだ多くの開発者はState-Drivenに慣れるのに苦労しています。本トークでは、State-Drivenなマインドセットを手に入れるための方法を解説します。

本トークは以下の内容をカバーします:

  • 背景:
    • SwiftUI導入の背景とState-Drivenマインドセットの重要性
    • SwiftUIとUIKitの違いを具体例で説明
  • State-DrivenとEvent-Drivenの違い:
    • 記述方法の本質的な違い
    • 抽象度や保守性の差
    • Single Source of Truthの重要性
  • State-Drivenのマインドセット:
    • 機能要件をState-Drivenに落とし込むアプローチ
    • State-Drivenに囚われすぎた失敗談と教訓
  • 実践例:
    • よくある機能の実装方法とベストプラクティス
    • 逆によく見かけるアンチパターン
    • State-Drivenのプログラムの動作保証

このトークでは、State-Drivenのマインドセットををダンジョン攻略に例えて学び、Event-Drivenからの脱却を目指します。初心者から中級者まで役立つ内容を提供します。

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

Multipeer Connectivity Framework を使った visionOS と macOS の連携方法

AkkeyLab akkey

Apple は空間コンピュータという新しいジャンルの製品、 Apple Vision Pro を発売しました。これには、類似の他社製品に比べて、ゲーム以外での活用幅が広いという特徴があります。
それを象徴する機能の一つが Mac Virtual Display で、これは Apple Vision Pro に macOS の画面を投影することを可能にします。

このように、 macOS との連携は Apple が重要視しているポイントの1つです。ただし、注意すべき点として、連携手段がネットワークもしくは Bluetooth のみであることが挙げられます。
なぜなら、 Apple Vision Pro には開発ツールを除いて通信用ケーブルを装着する手段が準備されていないからです。

このトークでは、 Multipeer Connectivity Framework を利用して複数の端末をローカルネットワークを通して連携させるためのノウハウをご紹介します。
ここでは、 visionOS から macOS に映像をシームレスに転送するアプリの実装事例を取り上げます。
visionOS 向けのアプリ開発に興味がある方はもちろん、 Multipeer Connectivity Framework を活用したデータの送受信について学びたい方にとっても貴重なトークとなることでしょう。

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

Xcodeの機能言えるかな? 2024

__ryomm Ryomm

Xcodeの機能言えたなら 言われた機能もうれしい!


iOS開発にほぼほぼ必要不可欠なものってな〜んだ?
──── それは、Xcode!

みなさんはXcodeをどのくらい使いこなせていますか?
昨年リリースされたXcode 15ではBookmarks機能が新登場し、年々進化しています。

あるとき「私全然Xcode使いこなせてないじゃん!」と自覚し、改めてXcodeにどんな機能があるのか調べてみると知らなかった機能がたくさんありました。その中からXcodeにおけるアプリ開発で便利な機能をまとめてご紹介します!

トピック

  • ブレークポイント
  • けんさく
  • デバッグナビゲータ
  • テストナビゲータ
  • ソースコントロール
  • ブックマーク
  • レポートナビゲータ
  • エディターオプション
  • オーガナイザー
  • シミュレータ

Xcodeの機能言えたかな? だいたい言えればいいかんじ!

採択
2024/08/24 10:30〜
Track D
レギュラートーク(40分)

iPhone × NFC で実現するスマートキーの開発方法

oka_yuuji oka yuji

いきなりですが「自宅の鍵が公共交通機関の改札のようにiPhoneで開閉できたらなー」と思ったことはありませんか?

NFC(近距離無線通信)はセキュアでレスポンスが早く、環境に影響されにくいので、デジタル認証を行う上で非常に適した通信技術です。
iOSにもNFCをサポートするCore NFCというフレームワークがありますが、現状ではNFCタグやNFCカードの読み書き機能しかサポートしていません。
そのため、物理カードのように振る舞うカードエミュレーションや、双方向通信を行うP2Pモードは実装できません。
また、カードエミュレーションとして機能するNFC付きのPassの生成も現状では限りなく不可能に近い状態です。

これらの制限により、現状では個人でiOSとNFCを組み合わせてスマートキーを開発することは難しい状況です。
しかし、どうしてもNFCを利用して公共交通機関の改札レベルの体験を自宅でも味わいたい…と思い、NFC付きのPassを利用して開閉するスマートキーを作成しました。

このトークでは、NFCの基本的な話から、Core NFCでできることを簡潔に解説した上で、NFC付きPassを利用して開閉するスマートキーの作り方をデモを交えて紹介します。
基本的な概念から応用まで40分で学べる内容となっていますので、ぜひこの機会に今後のiPhoneとNFCの可能性に備えませんか?

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

ハードとソフトの両面からアプローチするiOS × Object Captureの課題

oka_yuuji oka yuji

iOS 17.0より、RealityKitを使用してObject Capture APIが利用可能になりました。
このAPIにより、デバイス上で対象物のスキャンから3Dオブジェクト生成までできるようになりました。
しかし、現行のサンプルコードでは、撮影者が対象物の周りを自ら移動してスキャンを行う必要や、精度を高めるためには多くの写真が必要です。
このため、スキャンの環境と撮影時間(枚数)が課題と感じます。
そこで

  • 自動回転するターンテーブルの開発
  • 少数の写真でも精度の良い3Dオブジェクトを生成する

ことで解決できるのではと考えました。
本トークでは、Object Captureの基本概念から、上記の課題に対してハードウェア(自動回転するターンテーブル)とソフトウェア(少数の写真でも精度の良い3Dオブジェクトを生成する)の両面からアプローチした事についてデモを交えたながら解説したいと思います。
このトークを聴き終えた後にはきっとObject Captureの基本を理解し、自身でも3Dオブジェクトを生成したくなるでしょう!

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

大規模開発を成功に導くDesign Docの書き方

hatakenokakashi 佐藤 剛士

皆さんは、実装レビュー中に設計レベルの考慮漏れを指摘され、手戻りが発生した経験はありませんか?

そのような事態を防ぐためのツールがDesign Docです。

Design Docは実装の前段階で作成されるドキュメントで、プロジェクトの目的や実装の大まかな方向性、影響範囲、検討した代案などを示します。
事前にレビューを受けることで実装の精度を高め、手戻りを減らすことができます。

Design Docの作成は、モバイル開発ではまだ珍しいことかもしれません。
しかし複数チームに影響する開発を進める場合や、チーム全体が利用するコンポーネントを導入する場合など、iOS開発でもDesign Docを作成することで開発が効率よく進む場面が多々あります。
このトークでは、私が経験したプロジェクトを元に、Design Docの効率的な書き方や書くべき場面、その内容をお伝えします。

さらに、具体的な事例を紹介し、Design Docを元にどのように開発が進んでいったのかを詳しく解説します。
例えば、アプリ全体に影響がある追加認証としてのPasskeyの導入などです。

開発が複雑になり、変更の影響が複数チームに渡るほど、変更内容の指針が必要となります。

このトークを通じて、Design Docが大規模な開発を成功に導くための不可欠なツールであることを実感していただければと思います。

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

アプリへ最新のカメラ撮影機能を搭載する

Naoya_Maeda_app Maeda Naoya

iPhoneのカメラは年々進化しており、iPhone一台で高品質な写真やビデオを撮影することが一般的になっています。

例えばハードウェア性能が向上したことで、48MPの高解像度撮影や、Apple ProRAWやApple Log等の特殊な撮影ができるようになっています。

こうした進化したカメラ機能を自分のアプリに組み込むことで、独自のUIを使ってカメラを操作するだけでなく、標準のカメラアプリでは実現できない色温度や焦点位置の細かな調整、他のフレームワークと連動したユニークなアプリの開発が可能になります。

しかし、カメラ性能が向上しているにも関わらず、開発者がどのような新しい機能を利用できるのかについてはあまり知られていません。こうした新機能はAVCaptureのAPIを利用してアプリに組み込むことができますが、実際にドキュメントを読んで実装しようとすると、不十分な記述に惑わされ、試行錯誤してなんとか実装することになります。

このセッションでは、AVFoundationを使った最新のカメラ機能の概要と実装方法について解説します。カメラの基本的な撮影や応答性の説明から始め、近年のAVCaptureのAPIのアップデートについて体系的に紹介します。48MP撮影やApple ProRAW / Apple Log等の特殊撮影の基本知識とその実装についても、デモを交えて説明します。

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

iOSだけじゃない、macOS MDMの世界

YusukeIwaki

企業でiPhoneやiPadを社用端末として利用する際、MDMと呼ばれるデバイス管理の仕組みが使われていることは、ここ数年のiOSDCで語り尽くされてきました。
いっぽうで、我々エンジニアが使っているパソコンはmacOSです。社用端末として使っていますよね。あれ、でもmacOSのMDMってあまり話題に上がっていませんよね。

実際には、macOSにもiOSと同様にMDM機能が存在し、ここ数年のWWDCでもmacOSのMDMの進歩は実はホットな話題です。とても気になるので、自分でオープンソースのMDMを作って中古のMacbookをメルカリで買って、その機能性をいろいろ確かめてみました。

・業務に必要なアプリの自動インストール
・SSH設定の自動化
・WiFi設定の配布・自動更新

などなど、これらのMDMの機能は、デバイスの"管理"だけでなく、PCセットアップの自動化など、エンジニアチームにとって大きな利便性をもたらしてくれそうです。

市販のMDMを使うだけでは面白くないので、自分でMDMをつくっての業務改善にチャレンジしてみませんか。
このセッションではMDMのプロトコルやその実装方法などについてもわかりやすく説明したいと思います。

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

AI時代のSiriに備える

zeero Jiro Nagasaki

AIの著しい発展に伴い、近い将来Siriがより賢くなることが予想されます。
反面これまでを振り返るとSiriにまつわる技術はショートカットアプリやWidgetの登場とともに大きく変遷してきました。
このセッションではSiriの歴史を振り返りながら、Siri対応の開発ノウハウを紹介します。具体的には以下の内容に触れていきます。

・SiriKit
・Custom Intents と Siri
・App Intents と Siri
・「Siriからの提案」
・サンプルアプリを用いたSiri対応の詳細説明
 ・App Intents 実装の最小構成
 ・AppEnum の使い方
 ・AppEntity と EntityQuery の使い方

Siriをフル活用するための開発に乗り遅れないよう、キャッチアップに役立ててください!

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

Swift Reactを使ってWebフロントエンド開発を始めよう

omochimetaru omochimetaru

近年、SwiftのコードをWebブラウザで動作させることが簡単になってきました。ブラウザが提供するAPIも、Swiftから利用することができます。

しかし残念ながら、ダイナミックなGUIを含む実践的なWebフロントエンド開発にSwiftを採用することはまだ難しいでしょう。それは、HTMLを宣言的に記述するためのライブラリが不足しているからです。JavaScriptにおいても、生のDOM APIでGUIを実装するのは難しいとされており、様々なライブラリが利用されています。

そこで私は、Swift Reactという宣言的HTMLレンダラーを開発しました。これは、広く使われているJavaScriptのライブラリであるReactのコンセプトに基づきつつ、それをSwiftらしいAPIとして再設計し、一から実装したものです。

このトークではまず、Swift Reactを使うことで簡潔で読みやすいコードでWebフロントエンドが書ける事を紹介します。そして、宣言的なインターフェースを支える、仮想DOMによる状態管理と差分検知の実装について解説します。また、簡単な手順で新規にアプリケーションを構築できる事を伝えます。

この発表を聞けば、SwiftによるWebフロントエンド開発をすぐにでも始めたくなるでしょう。

14
採択
2024/08/23 13:00〜
Track B
レギュラートーク(40分)

SMBファイル共有をSwiftで実装する

岸川克己

Appleプラットフォームのファイル共有にはSMBプロトコルが利用されています。しかし、ファイルが非常に多いフォルダを開く際に接続が不安定になるなどの問題があります。OSに含まれるライブラリの不具合なので対処は難しいですが、SMBファイル共有を自分で実装すれば問題を根本的に解決でき、快適なファイルブラウジングが実現できます。

SMBファイル共有を実装すると一口に言っても何から始めたらいいかわからない方も多いでしょう。SMBプロトコルはHTTP通信ではなく、URLSessionは使えません。データ構造もJSONなどのなじみのある形式ではありません。

難しそうですが、実は道具が違うだけで通信はHTTPではなくTCPソケットを、データ構造はJSONのデコード/エンコードのかわりにバイナリのシリアライズ/デシリアライズを用いるだけです。TCPソケット通信を理解すると、Bitcoinやメールなど、他の通信プロトコルの実装にも簡単に応用できます。

この講演ではSwiftでTCPソケット通信を行う場合の複数の選択肢の比較、プロトコルに従ったバイナリのシリアライズ/デシリアライズの方法など、SMBクライアントを実装する手順について解説します。最終的にiOSとmacOSの両方で動作し、音楽や動画ファイルをストリーミング再生できる、速くて使いやすいネットワークファイルブラウザを作成します。

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

Observation時代のiOSアプリの作り方

koher koher

Swift 5.9でObservationが導入されました。これはCombineのObservableObjectを置き換えるもので、iOS 17から利用可能です。iOS 17のシェアが高まるにつれ、今後Observationを採用するプロジェクトが増えると予想されます。

Observationを導入する際には、単にObservableObjectと@Publishedを@Observableで置き換えることも可能です。しかし、より積極的にObservationの利点を活かすこともできます。たとえば、エンティティをstructではなく@Observable classとして実装することでパフォーマンス上の利益が得られるケースがあります。しかし、これは値型中心の言語であるSwiftにおいては異質なアプローチです。また、CombineではViewModelが別のObservableObjectを監視する際に一手間必要だったので、そのような設計は避けられることがありました。しかし、@Observableでは同様の問題は発生しません。このように、Observationの導入がコーディング上の設計に影響を与える可能性があります。

本セッションでは、まずObservationについて説明し、その後、Observationを使ってどのようにiOSアプリを作れるのか、パターン別に解説します。

13
採択
2024/08/24 10:30〜
Track A
レギュラートーク(40分)

Swift 6のTyped throwsとSwiftにおけるエラーハンドリングの全体像を学ぶ

koher koher

Swiftがオープンソースになって以来、長年議論され続けてきたTyped throwsの提案がついに承認されました。これは、throws節にエラー型を指定できる新しい言語機能であり、Swift 6から導入されます。

Swiftにおけるエラーハンドリングの考え方は、Swift 2でthrows/tryが導入される際にまとめられた"Error Handling Rationale and Proposal"というドキュメントに基づいています。その後、Swift 5でResultが導入され、Swift 5.5でSwift Concurrencyが追加されました。これにより、それらの機能とエラーハンドリングを併せて考える必要が生じました。そして、Swift 6でTyped throwsが導入されます。

しかし、それらの変化は、Swiftにおけるエラーハンドリングの基本的な考え方を変えるものではありません。"Error Handling Rationale and Proposal"の理念は今も生き続けています。

本セッションでは、まずTyped throwsについて説明し、次に"Error Handling Rationale and Proposal"の内容を復習します。最後に、それらを踏まえた上でSwift 6でどのようにエラーハンドリングを行うべきか、その全体像を示します。

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

存在しない画面表示を溢れ出させない、ステートマシンで管理するアプリと画面の状態

kuroruri くろるり

突然ですが貴方はデザイン上想定されない画面表示、仕様上存在しない画面表示を生み出したことはありますか?
画面の表示内容を isLoading: Bool / response: Reponse? / error: Error? のようなプロパティだけで扱っていたとしたら、通信終了後に isLoading を切り替え忘れるだけで通信が終わって結果が表示されたのに通信中表示が出たままになっている、そのような存在しない画面表示がすぐ出来上がります
上記は非常に簡単な例でしたが、画面表示内容だけに注目したデータ構造で扱っているとこのような存在しない画面表示が生まれるでしょう

本トークではそのような問題に対し、状態遷移を整理しデータ構造を作り、ステートマシンを列挙型と単方向データフローのアーキテクチャで管理することで存在しない画面表示を防止する方法を、下記のような内容で話します

  • 表示内容に注目したデータ構造が生む想定外の画面表示
  • ステートマシンの簡単な説明
  • 単方向データフローと列挙型によるステートマシンの導入
  • なぜ表示内容ではなく状態遷移からデータ構造を設計するのか
  • 複雑な画面を階層化されたステートマシンで整理する例
  • 状態の列挙に伴う画面プレビューの網羅性向上
  • ステートマシンによる状態管理設計がもたらすコーディング以外での変化
1
採択
2024/08/22 17:20〜
Track D
レギュラートーク(40分)

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

k2_moons k2moons

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

このトークでは、カメラで撮影した映像ファイルをVideoToolBoxで特殊再生する方法を解説します。

  1. PTS (Presentation Time Stamp) と同期処理の基礎:
    PTSの役割と、時間同期ついて説明します。
  2. GOP (Group of Pictures) の基礎:
    Iフレーム、Pフレーム、Bフレームの圧縮方式とその制約について説明します。
  3. 特殊再生の実現方法:
    スキップ、シーク、倍速再生などの特殊再生を行うために、どのようにVideoToolBoxをどう利用すれば良いのかを具体的なコードを交えて説明します。

このトークを通じて、参加者はMPEGフォーマットの重要な仕組みを理解し、VideoToolBoxを用いた特殊再生の実装方法について学ぶことができます。

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

自動テストの信頼性を高めるミューテーションテストの活用

tarappo tarappo

iOSアプリ開発において自動テストは一般的になってきています。
しかし、どういった自動テストを用意すればいいのか、このテストは本当に価値を発揮できているのかと、不安に思うことはありませんか?

その不安を解消する手段として「ミューテーションテスト」を使ってみてはどうでしょうか。
ミューテーションテストは、プロダクトコードを意図的に変異させ、テストコードが適切に失敗するかを確認することで、自動テストの有効性を評価するテスト手法です。

とはいえ、多くのテストを実行するため、実行時間が大きな課題となります。
しかし、近年のマシンスペックの向上やXCTestを取り巻く環境の進化により、ミューテーションテストの実施が現実的になってきました。

本トークでは、ミューテーションテストの基本的な概念とその利点を説明し、さらに実行時間を短縮するための具体的なアプローチについて紹介します。

具体的には、「muter」というライブラリがおこなっているアプローチを元に、実行時間を短縮するための工夫を紹介します。
加えて、ミューテーションテストを実行した際の実行時間や出力結果を基に活用法を紹介します。

これにより、iOS開発における自動テストの価値を最大限に引き出す方法を学んでいただけることを目指します。

6
採択
2024/08/24 13:00〜
Track D
レギュラートーク(40分)

めざせ!WKWebViewマスター!

marcy731 marcy731

「ここはWebViewでいきましょう」
iOSエンジニアであれば、ネイティブで実装したい気持ちとビジネス要件との間で葛藤し、最終的にWebViewでの実装を選択した経験がある方も多いと思います。

このトークでは、iOSアプリ開発における強力なWeb表示コンポーネントであるWKWebViewのAPIについて徹底解説します。
WKWebViewには多くのAPIが存在し、その中にはあまり知られていないものもあります。
主要なAPIだけでなく、できるだけ普段あまり使われないAPIも含めて説明することで、参加者がWKWebViewで実現可能な機能を幅広く理解できるようになります。

具体的には、私が日々のWKWebViewを用いた開発の中で得られたノウハウを交えながら、各APIの役割や使用例、効果的な活用方法について解説します。
初心者から中級者まで、幅広いレベルの開発者にとって役立つ内容を提供しますので、ぜひご参加ください。

めざせ!WKWebViewマスター!

内容:

  • WKWebViewとは
  • WKWebViewの各APIの紹介
    • 基本的なウェブページの表示
    • HTTPリクエストのカスタマイズ
    • Cookie/キャッシュの管理
    • JavaScriptからネイティブコードへのコールバック
    • ナビゲーションの管理
    • etc...
採択
2024/08/22 17:20〜
Track C
レギュラートーク(40分)

実践 Advanced CallKit 〜快適な通話の実現に向けて〜

h1d3mun3 h1d3mun3

CallKitで音声通話機能を実現したことはありますか?

CallKitはiOS 10 / iPad OS10から利用できる音声通話機能を実現するためのFrameworkで、様々なアプリがCallKitを利用して音声通話機能を実現しています。
おそらくアプリを利用して音声通話機能を実現する場合、1対1の通話を実現が実現できればアプリのユースケースのほとんどを十分にカバーできると思います。
ですが、CallKitを使えば、1つのアプリで友達のAliceとの1体1通話はもちろん、その通話中に友達のBobとの1体1通話に切り替えるといったような、一歩進んだ音声通話機能を実現できるのはご存知でしたでしょうか?

本トークでは下記観点などから、快適な通話の実現に必要なCallKitの実装方法についてタクシーアプリでの活用事例を踏まえつつご紹介します。

  • CallKitを使って1体1の音声通話を実現する方法
  • 音声通話とおやすみモードの関連性
  • 複数の音声通話を受ける方法・通話のグループ化といった1つ先の利用方法
採択
2024/08/23 13:00〜
Track D
レギュラートーク(40分)

アプリ内課金と自社の認証認可基盤を連携する複雑な課金ネットワークを構築する

shimastriper shimastripe

iOS 15から導入されたStoreKit2はアプリ内課金の実装を大幅に簡略化できます。オファー機能や複数のプラン提供を行いやすくするために導入・移行を検討している方は多いのではないでしょうか。
ただし課金機能がアプリで完結しない場合、StoreKit2と様々な基盤を連携する必要があります。たとえば有料機能の認証・認可API、課金ユーザー分析、iOSアプリ内課金以外の決済手段が挙げられます。

そのためのバックエンド構築にはApp Store Server APIやApp Store Server NotificationsというApple提供の仕組みが使えます。近年バージョン2といえる抜本的な改善がなされ、アプリ内課金の状態を自社サービスから詳細に分析できるようになりました。

本セッションでは、日本経済新聞社の電子版アプリで提供するサブスクリプションをStoreKit2ベースでフルリプレースして得た知見を紹介します。各種ツールの仕様・アプリ内課金全体の仕組みを理解、クライアントからバックエンドまでどのような手順で安全にアップデートしていくか注意点を確認しつつ解説します。クライアントだけでは把握しづらかった課金状態をAPIで把握したTipsも紹介していきます。

このトークを通して、参加者は自社のシステムにアプリ内課金を連携するための実践的な仕様を理解することができるでしょう。

採択
2024/08/22 17:20〜
Track B
レギュラートーク(40分)

StoreKit 2によるモダンなアプリ内課金

0si43

2024年4月、note iOSアプリはアプリ内課金機能をリリースしました。本セッションでは、StoreKit 2の導入、実装、テストについて説明します。これからアプリ内課金を実装しようとする方にとって、参考になる情報を提供できれば幸いです。
具体的には以下の内容を扱います。

  • noteアプリのポイント課金仕様
  • StoreKit 1とStoreKit 2の比較
  • StoreKit 2による実装
    • async/awaitによる非同期処理の簡略化
    • レシート検証の簡素化
  • テスト方法
    • sandbox環境とTestFlightを使ったテスト
    • StoreKitTestの活用