Appleが提供する機械学習フレームワークであるCoreMLと、そのモデル生成に使用されるCreateMLを用いて、ユーザ個別に最適化された筋トレ自動計測アプリを開発しました。
一般的な流れでは、データセットとXcode付属のCreateML(GUIツール)を使用してモデルを作成し、CoreMLを用いてiOSアプリに導入することが一般的です。
しかし、以下の方法を用いることで、アプリ内でモデルの新規学習や追加学習を完結させることが可能です。
これらの方法は、特に”ユーザ依存性の高いコンテンツ”の開発に有効です。今回は、Updatableなモデルを使用して、端末のセンサーデータを基にユーザ定義の筋トレメニューの実行回数を自動計測するアプリを開発しました。
このテーマは開発だけでなく、研究的な要素も含んでいます。以下の内容についてお話しします。
非同期処理は、プログラミングにおける難題の一つとしてよく挙げられます。これはiOSアプリ開発においても同様です。黎明期から非同期処理は存在し、また開発者の頭を悩ませ続けてきました。
本トークでは、iOS開発における非同期処理のこれまでの歴史と進化について紐解きます。非同期処理のパラダイムがどのように進化してきたかを知ることで、最新のSwift ConcurrencyによるAPIが過去の課題をどのように解決しているかを深く理解することができるでしょう。
まず、非同期処理の基本概念とその重要性を簡単に紹介します。次に、iOS開発における非同期処理の歴史を振り返り、Grand Central Dispatch、操作キュー、Promiseなどの主要な技術の導入と進化を時系列で説明します。その後、現在主流となっているSwift Concurrencyに焦点を当て、その特徴と利点を過去の技術と比較しながら解説します。
このトークを通じて初学者や中級者の方が様々な非同期処理のパラダイムに触れる機会を作り、新鮮な視点でSwift Concurrencyに向き合うきっかけを提供します。
皆さんはカメラアプリを実装したことがありますか?
iOS標準の操作感を持つカメラを簡単に実装するなら、UIImagePickerControllerが便利です。
一方で、シンプルに撮影する機能だけで良い場合や、カスタマイズが必要な場合、AVFoundationを選択することが多いでしょう。
SPIDERPLUSでは、UIImagePickerControllerで実現できない要件があり、AVFoundationを使用してiOS標準風の操作感を持つカメラを自作しました。
本トークでは、AVFoundationでiOS標準風の操作感を持つカメラを実現するまでの過程について詳しくお話しします。
<トピック>
皆さん、iPhoneのSpotlight機能をご存知ですか?
MacのSpotlight機能は多くの方が利用していますが、iPhoneにもSpotlight機能が存在します。
Spotlightを活用することでユーザーにとってアプリを見つけやすくすることができます。
そしてアプリの検索性を高めるために重要なのがCoreSpotlightとINAlternativeAppNameです。
例えば、レシピアプリを開発している場合、ユーザーが「美味しい料理」と検索することで、あなたのアプリがSpotlight上でヒットするように設定できます。
このトークでは以下の内容をカバーします:
このセッションを通じて、CoreSpotlightとINAlternativeAppNameを駆使し、皆さんのアプリをより多くのユーザーに届けましょう!
iOS アプリにおいてユーザーエンゲージメントを向上させるためには、ローカルプッシュ通知の活用が重要です。
ローカルプッシュ通知は、デバイス上で直接スケジュールされるため、即座に実装でき、効果的に使用することで、ユーザー体験を大幅に向上させることができます。
このトークでは、具体的なスマートアラーム機能の実装方法と、その効果を高めるための戦略を紹介します。
トーク内容
スマホアプリでは利用規約やプライバシーポリシーなど、静的URLを利用することがよくあります。
多言語対応をしないのであれば、URLをベタ書きしてしまえば良いのですが、言語によってURLを変更したい場合には翻訳機能を利用するでしょう。
しかし、翻訳の実装を間違えてしまうと英語設定のアプリで日本語ページのURLを開いてしまい、ユーザー体験を損ねてしまいます。
URLの指定ミスは見た目ではわかりにくく、クラッシュやエラーも発生しないため、問題に気づきにくいです。
このトークではString Catalogを利用して静的URLの翻訳を管理し、
さらにそれをUnitTestで検証することで、ユーザー体験を損ねないようにする方法についてお話します。
Swift5.9ではSwift Macrosが導入され、マクロによるコード生成が可能になりました。
また、マクロの実装時に用いるSwiftSyntaxは、それ単体でコード生成の仕組みを提供しており、Build Tool Pluginと組み合わせればビルド毎にマクロよりも自由度の高いコード生成を行うことも可能です。
私が開発したSword (https://github.com/rockname/sword) というDIコンテナのライブラリでは、この両者のコード生成の仕組みを併用しています。
本トークではSwordの開発から得られた知見をもとに、Swift MacrosおよびSwiftSyntaxにおけるコード生成にはそれぞれどのような特徴があるのか具体的なコードを交えながら説明し、それぞれが活きる利用パターンについて体系的にお話しします。
本トークを通じて聴講者のみなさまが、コード生成によりどのような課題を解決できるのかより鮮明にイメージできるようになり、プロダクトやライブラリの開発へすぐに活かすことができるようになることを目指します。
Dependency Injection(DI)とは、オブジェクトに必要な依存関係を外から注入する設計パターンです。オブジェクト間の依存を疎に保つことで、コードを再利用しやすくなり、保守性を高めることができます。
Androidアプリ開発ではDagger(Hilt)というDIライブラリの使用が推奨されていますが、iOSアプリ開発においてはまだまだデファクトスタンダードと呼べるDIライブラリは存在しません。
そこで私はSword (https://github.com/rockname/sword) というDaggerライクなiOS向けのDIライブラリを開発し、Swift Macros等の言語機能を活用したコード生成による静的なDIのアプローチを探求しました。
本トークでは、そもそもDIとはどのような設計パターンであるかを説明しつつ、Androidアプリ開発におけるDaggerによるDIのアプローチについて具体的に紹介します。その上でiOSアプリ開発においてはどのようなDIのアプローチが考えられるのか、Swordの開発から得られた知見をもとにお話しします。
本トークを通じて、iOSアプリ開発における最適なDIのアプローチについてみなさんの考えるきっかけやヒント、あるいは答えを提供できれば幸いです。
現代のiOSアプリ開発において、Web APIとの連携は避けて通れない重要な要素です。本トークでは、HTTPの標準を上手に利用する方法を中心に、効率的で信頼性の高いWebバックエンドとの通信方法を探ります。また、RESTfulなアプローチだけでなく、GraphQLなどの新しい技術を活用したデータ取得の方法についても解説します。
主なトピックは以下の通りです:
・HTTPの基本と効果的な利用法
・RESTful APIの設計と実装のベストプラクティス
・iOSアプリでのエラーハンドリングとリトライ戦略
・GraphQLの基本概念とiOSアプリでの導入事例
・バックエンドに優しいアーキテクチャ
このトークは、iOSアプリ開発者がWebバックエンドとの連携をより円滑にし、アプリの信頼性とパフォーマンスを向上させるための具体的なアドバイスと実践的な知識を提供します。初心者から中級者まで幅広いレベルの開発者に役立つ内容となっています。
モバイルアプリ開発では、たとえ新しいバージョンをリリースしてもいきなり全ユーザーが最新バージョンのアプリを利用するようになるわけではありません。旧バージョンを利用し続ける人も一定数いるため、我々は新旧バージョンにおけるデータの互換性や将来想定される仕様変更に対する拡張性を意識しながら設計していく必要があります。
例えば、アプリに永続化したデータの構造を新バージョンで変更する場合やサーバーから取得するレスポンスのフィールドに新しい要素を追加する場合、さらには旧バージョンで不具合が生じたときに新バージョンへの更新を促したい場合など、新旧バージョンと向き合わなければならないケースというものは多岐に渡ります。
すべてに対して丁寧に対応していくことも可能ですが、考慮しなければならないパターンが多く、ある程度折り合いをつけながら落とし所を探っていくことも重要です。
本トークでは、この新旧バージョンと向き合って開発していく上での戦略的な設計方針から、具体的に求められる戦術的な実装パターンまでを、体系的にお話しします。
SwiftUIが発表されてから早5年が経ちました。皆さんのプロダクトにもSwiftUIが採用されているのではないでしょうか。
我々は2年前から、SwiftUIを用いて図形描画や画面に直接触れて文字を書くといった機能を実装してきました。
これらの機能は、ユーザーインターフェースの向上や特定のアプリケーションでの必須機能として求められているからです。
本LTでは、SwiftUIを使った図形や文字の描画を実装する際の勘所をメインにお話しします。特に、以下のトピックに焦点を当てます。
・図形描画の際に直面した技術的な工夫
・画面に直接文字を書く際の工夫
これらのトピックを通じて、皆さんがSwiftUIでお絵描きするのって簡単なんだと感じてもらえれば、嬉しい限りです。
iOSでチーム開発をしていると、iMacやMacBookを数年おきに買い替えることが多いかと思います。
その際、使用しなくなったがまだ動作するMacマシンの使い道に困っている方はいませんか?
このトークでは、古くなったiMacの具体的な有効活用方法についてご紹介します。
弊社での活用事例としては、以下の方法があります。
CI/CDマシンとしての活用
古いiMacをCI/CD専用のマシンとして利用することで、新しい機材を購入するコストを削減できます。具体的な導入手順や設定方法についてもご説明します。
QAチームでの不具合検証マシンとしての活用
QAチームが不具合を迅速に検証できる環境を提供するため、古いiMacを再利用します。これにより、迅速な問題解決が可能となり、顧客満足度の向上にも寄与しました。
これにより、会社全体のコスト削減やリソースの有効活用が実現できました。
本トークを通じて、古くなったMacマシンの再活用のヒントを提供できればと期待しています。
SwiftUIが登場して早くも5年が経ち、今や多くのプロジェクトでSwiftUIの導入が進められています。
しかし同時に多くの開発者がSwiftUIの限界を目の当たりにし、「このViewを簡潔にSwiftUIで作るのは難しい…」、「UIKitを使わないと作れない…」と嘆いてきました。
本セッションでは5年の月日を経て進化したSwiftUIの機能を紹介します。
そして、以前はUIKitの力を頼りつつ苦労していたが現在では新機能を使って楽に実装できるようになったViewの作成事例を紹介していきます。
皆様のプロジェクトのViewの見直しやリファクタリングに役立てば幸いです。
ZOZOでは、ショップスタッフ向けの販売サポートアプリ「FAANS」を開発しています。FAANSアプリを利用することで、スタッフはコーディネートを投稿し、その閲覧数や売上などの成果を確認できます。これまでは画像のみの投稿が可能でしたが、新たに動画投稿機能が追加されました。私は、この動画投稿機能の開発を担当しており、AVFoundationを用いて動画の編集や再生機能を実装しました。本トークでは、FAANSにおける動画機能の開発過程で直面した課題と、それを克服するために用いたテクニックについて紹介します。
具体例として、FAANSではエンコードされていない動画と音楽を同期して再生する機能が求められました。単に再生を開始するだけでは動画と音楽のズレが発生するため、AVPlayerのreadyToPlayステータスを監視して、両者が再生可能になった時点で再生を開始するように実装しました。また、アップロードされた動画を再生する際には、動画が再生可能かどうかをObserverを用いて監視し、再生できない場合には適切なエラーハンドリングを行うことで、再生の待機やアラート表示を実現しました。
本トークでは、動画機能の開発における具体的な課題とその解決策について、実際のコード例を交えながら詳細に解説し、新たな知識と知見を提供します。
SwiftにはTrailing Closureという強力な記法が存在しており、引数の最後のClosureを引数リストの外に展開して書くことができます。
SwiftUIでもTrailing Closureが積極的に利用されており、主に子のUI要素を構築する @ViewBuilder
のClosureを最後に持ってくることで、UIの階層構造を表現しています。
一方でSwiftUIにおけるClosureは、タップなどのアクションを実行するためにも使われます。 @ViewBuilder
なClosureがない場合、アクションのClosureを引数の最後に持っていきたくなってしまいますが、Trailing Closureは引数ラベルがないため、そのClosureがUIを構築しているのかアクションを実行しているのかはClosureの中身を読む必要があります。
本セッションでは私がおすすめするSwiftUIにおけるTrailing Closureの使い方についてご紹介します。誰もがわかりやすいSwiftUIのコンポーネントを作れるようになるために、まずは引数内のClosureの位置を意識してみるのはいかがでしょうか。
Go on a deep dive into the commands of the Low Level Debugger
Understand from the ground level how Xcode uses LLDB under the hood:
Compile, Run, Attach, Detach, Breakpoint, Backtrace and more all from the Xcode console or Terminal command line.
Learn how to run expressions while paused in execution, reading variables in scope and printing the contents of registers
アプリ内でDrag & Dropは活用していますか?
Drag & Dropとは、コンテンツをある場所から別の場所にドラッグして移動したり複製したりする手段です。アプリ内である部分から別の部分へ、またはアプリから別のアプリへ転送することが可能です。
SwiftUI登場時点でDrag & Dropの実装はできましたが、カスタムタイプのコンテンツだと転送処理が複雑になるという課題がありました。しかし、iOS16から導入されたTransferableプロトコルを用いると簡単に実装できるようになります。
本トークでは以下の内容を解説します。
参加者の皆様が、Drag & Dropのプラクティスや実装の理解の手助けになることを目指します!
SPIDERPLUSは、外部機器で検査結果を計測する機能があります。
外部機器との接続にはBluetoothを利用しており、ハマりポイントなどを紹介します。
ある日、「UIは同じで、APIの向き先・アプリ内で使用するリソース・アプリの名前・BundleID等だけを変えたアプリをいくつか作りたい」といった要望が社内で上がりました。
同じようなUIなのに別々にアプリを作り、それを一つずつ運用していくのって面倒ですよね。
Targetで分けるにしても、xcodeprojファイルをレビューする必要が出てきて同じく面倒ですよね。
そんな課題をXcodeGenを用いて解決した(swiftファイルは共通で、makeコマンドで各アプリごとのプロジェクトファイルを作成し、必要な値を全て切り替わるように対応した)内容になります。
また、アプリ完成後の運用方法についても触れようと思います。
トークの構成としては、以下を想定しております。
みなさんは、業務の効率化のためにちょっとしたツールを探していたのに、時間だけが過ぎてしまったという経験はありませんか?
また、やっと見つけても会社のMacに入れるには手続きが必要で、簡単には入れられなかったというような経験はありませんか?
そんな時は思い切って、自分でツールを作ってみてはいかがでしょうか!
普段iOSアプリを開発している方であれば、SwiftUIを使って簡単にmacOSアプリを開発することができます。
このトークでは、私が実際に業務改善のために開発したmacOSアプリを例に、開発の手順やiOSとの違いを詳しく紹介します。
業務改善ツールを開発しながら、macOSアプリについて知識を深めていきましょう!