iPadやMacのような大画面のアプリを開発する際に重要なポイントの一つに、空白をどのように作るかがあります。
UIKitでiPadアプリのレイアウトをするときは、 readableContentGuide
という便利な機能がありました。
これを利用することで、Appleが定義した読みやすい幅を基準にレイアウトを組むだけで、イイ感じに作ることができました。
SwiftUIが登場して5年になり、成熟してきた感も出てきましたが、まだまだ大画面レイアウトに関するベストプラクティスはまだ確立されていません。
このセッションでは、個人事業主として手伝っているSwiftUIベースのアプリをiPadに対応させるためにどのようにしたかをお話しします。
トランクベース開発では、細かいコミットを頻繁にマージし、コードの安定性を高め、コンフリクトを早期に解決することで、迅速なリリースが可能になります。この手法において、未完成機能やバグのある機能をオンオフするためにFeature Flagを利用することが重要です。
Feature Flagを導入することで、開発中のコードを安全にマージし、複数の機能開発を並行して進めることが可能となり、チーム開発を加速させるメリットがあります。しかし、機能のリリース後にFeature Flagの定義や分岐箇所を削除する際、不要なファイルや定義の削除漏れが発生することがあります。
この問題を解決するために、Swift Macroを活用して削除漏れを防ぐための@粉砕アノテーションを作成しました。このアノテーションにより、Feature Flagの定義が削除された際にビルドエラーを発生させることで、削除漏れを防止します。
このトークでは、メタバースプラットフォームclusterでの具体的な事例をもとに、Feature Flagを利用したトランクベース開発の運用方法と、Swift Macroを活用した@粉砕アノテーションによる削除漏れ防止の方法について紹介します。
このトークでは、CNLabelContactRelationElderCousinMothersSiblingsSonOrFathersSistersSonについて語りたいと思います。
果たしてCNLabelContactRelationElderCousinMothersSiblingsSonOrFathersSistersSonとは何者なのか、
どうやってCNLabelContactRelationElderCousinMothersSiblingsSonOrFathersSistersSonを利用すればいいのか、
あまり語られてこなかったCNLabelContactRelationElderCousinMothersSiblingsSonOrFathersSistersSonについて説明します。
またCNLabelContactRelationElderCousinMothersSiblingsSonOrFathersSistersSon周辺の機能についても語る、
CNLabelContactRelationElderCousinMothersSiblingsSonOrFathersSistersSon尽くしの5分間となる予定です。
iOS 17からiPhoneの機能としてNameDropが利用できますが、
APIを公開されていないため、私たちiOS開発者はNameDropの機能やエフェクトを利用できません。
APIが提供されていないなら、自作してみようと考え、
NameDrop風エフェクトをMetalを利用して開発してみました。
Metalは、Appleが開発したグラフィックスおよびコンピューティングのための低レベルなフレームワークです。
ハードウェアに近いレベルで制御が可能であり、効率的なグラフィックスおよび計算処理を実現できます。
しかし、Metalを使用して開発するためには、CPUとGPUの関係、シェーダープログラミング等の
様々な知識が必要となり、理解が難しいと感じる人も多いでしょう。
今回はMetalを使用したエフェクト作成方法について、開発したコードを用いて解説します。
まずは、Metalの処理の流れやコマンドバッファ、コマンドエンコーダ、パイプラインなどの用語や概念について説明し、
次に、シェーダー関数を利用してNameDrop風エフェクトを実現する方法について要点を説明します。
Metalの知識を学習することで、エフェクトの作成時の高度なカスタマイズ等の
魅力的な視覚効果を実装することができます。
この機会にMetalプログラミングを学び、日々の開発に役立てていただければ幸いです。
iOSプロジェクトにおいて、開発効率を向上させるためにマルチモジュール構成を採用する人が増えてきています。各モジュールの独立性を確保することで、スケーラビリティが高まります。
しかし、マルチモジュール構成では、一つの変更がプロジェクト全体、全てのモジュールに影響を与えるとは限りません。それにも関わらず、全てのテストを毎回実行するとテスト実行時間が長くなり、開発サイクルが遅延します。マルチモジュール恩恵を十分に受けてられていません。
この課題を解決するために、「XcodeSelectiveTesting」というツールを用いて、変更箇所に依存するターゲットのみを選定し、意図したテストターゲットのみを実行する手法を紹介します。
このトークでは、プロジェクトへの導入方法と導入で得た知見や課題を共有します。
「アジャイル開発ってよく聞くけど、実際にはどうすればいいのかよくわからない・・・」
昨今、アジャイル開発を取り入れる現場が皆さんの周りでもかなり増えているのではないでしょうか。今やアジャイル開発はエンジニアとしても無視できない状況となってきています。
しかし、「私はただ開発さえできればいいんだ!XcodeだけがTOMODACHI。」と考えるエンジニアも少なくないと思います。そんな皆さんに向けて、アジャイルな現場での立ち回り術を紹介します。
本トークでは、アジャイルの中でも最もよく使われるスクラムフレームワークをベースに、アジャイルなプロジェクトでどのように立ち回るとプロジェクトから重宝されるか、ひいてはプロジェクトが成功するかについてお話しします。プロジェクトの成功に貢献したいiOSエンジニアの皆さんに、スクラムマスターの観点からコツを解説します。
ウィジェットの生誕から10周年を迎え、その進化は目覚ましいものです。WWDC14での初登場以来、ウィジェットはシンプルな情報表示から始まりましたが、WWDC20でホーム画面に設置できるようになり、昨年のWWDC23ではさらにインタラクティブなやりとりが可能となり、機能の幅が大きく広がりました。
しかし、多くの開発者が直面している課題は、ウィジェットでどのような機能が実現できるのか、そしてどうやってユーザー体験を向上させるかという点です。
このトークでは、App Storeに眠る世界中の開発者が生み出すウィジェットを調査し、革新的で多種多様なアイデアを共有します。
具体的には、
などの事例を紹介します。
参加者はこれらの実際の事例を通じて、アプリ開発に活かす新たなアイデアやインスピレーションを得ることができます。
未知のウィジェットの世界はまさに宝探しのようです。刺激的なインスピレーションを求めて、一緒に世界のウィジェットを巡る旅に出かけましょう。
このトークを通じて、あなたが次の伝説のウィジェット開発者になるためのアイデアを得ることでしょう。
SwiftUIの「View Identity」という概念を知っていますか?
SwiftUIはこのView IdentityによってViewを管理・再描画を行っています。
そのためView Identityの扱いによっては余分な再描画を生んでしまいアプリのパフォーマンスを下げてしまいます。
このLTでは、View Identityについて簡単に説明した後
パフォーマンスが良くないSwiftUIのコードとその改善方法を紹介します。
このLTを通してView Identityを意識したパフォーマンスの良いViewを書くアプローチを一緒に学びましょう!
WWDC21で発表されたPhotogrammetryのObject Captureは、複数枚の写真から3Dモデルを生成する技術です。Photogrammetryに加えて、NeRFや3D Gaussian Splattingといった手法も注目を集めています。
本トークでは、Photogrammetry、NeRF、そして3D Gaussian Splattingの各手法の特徴や、それぞれの得意・不得意について5分で簡潔に紹介します。
なお、例えば3D Gaussian Splattingの分散行列といった技術的な詳細には触れないので、専門知識がなくても楽しめる内容となっています。
iOS 15より導入されたFormatStyleは、値を加工するためのプロトコルです。
.format(value)
の形で値を与えるだけで、日付や数値、文字列などの標準的なフォーマットはもちろん、人名や電圧など多岐にわたる形に対応したFormatStyleが用意されています。
SwiftUIにおいても各種ビューにおいて非常に便利に使うことができます。
でも、みなさん、まだまだ足りなくないですか?
そんなフォーマットに飢えている皆さんのために、カスタムフォーマットをどのようにして作るかを提示したいと思います。
世の中をフォーマットしていきましょう。
iOSエンジニアといえど、XcodeGen、SwiftLint、GitHub Actions、Bitriseの設定などでYAMLを書く機会はありますよね?さてこのYAMLというやつ、何者なのか理解していますか?
このトークでは、iOSアプリエンジニアでも知っておくべきYAMLの基本について話します。YAMLときちんと向き合うことで、きっと前より設定ファイルがスラスラ書けるようになるはずです…!
Topics
・YAMLとは
・YAMLの基本的な書き方
・どっちが正しい書き方?クイズ形式で学ぶYAML
▼ 概要
私たちは「あたらしい旅行を、デザインする。」をミッションに旅行アプリ「NEWT (ニュート)」を日々開発しています。
NEWTは初期の開発初期段階からSwiftUIの導入を行なっており、開発開始から3年が経ちました。
みなさん、SwiftUIでの記法のルールは定めていますか?
宣言的UIの登場で開発のしやすさが増すと同時に、複数人で開発を行うと自由度が高いがゆえに記法揺れが起きると思います。
その一例としてStack.space/padding/Spacerをどのように利用しているか、ルール化しているかをお伝えします。
▼ 内容
【ご案内】
iOSアプリ開発において、SwiftUIを利用することで直感的で効率的なUI構築が可能になります。
しかし、時にはSwiftUIに固執することで、開発が行き詰まることもあります。そんな時はUIKitの力を借りることが有効かもしれません。
本LTでは、上記の案内をもとに、SwiftUIとUIKitを使い分ける8つのパターンを解説します。
ここにトマトがあります。
このトマトを、幅を指定して切るメソッドについて考えてみましょう。
extension Tomato {
public func slice(width: Double)
}
トマトを3cm幅でカットする際は、以下のように書けば良さそうです。
tomato.slice(width: 3)
さてここで、メソッドのシグネチャからwidthを省略したら、メソッドを使う側にどう伝わるでしょうか?
tomato.slice(3)
「トマトを3cm幅でカットする」ではなく、「トマトを3つにカットする」と伝わってしまうかもしれません。
Swift の API Design Guidelinesは、明確で一貫性のあるコードを書くための指針を教えてくれます。しかし、その抽象的な概念を理解し、日々のコーディングに適用するのは難しい場合があります。
本LTでは、身近な「野菜」を使って、これらのガイドラインの理解を深めていきます。野菜を使うことで抽象的な概念を具体的なイメージとして捉え、より実践的な知識として吸収し、より良いコードが書けるようになることを目指します!
Swift Concurrencyは、非同期処理やマルチスレッド処理を便利にするSwiftの新機能です。iOSアプリ開発において、ゼロからこの機能を利用する場合は比較的スムーズに導入できますが、既存のアプリに導入する際にはさまざまな課題が発生します。
我々のチームでは、すでにリリースされているアプリにSwift Concurrencyを全面的に導入しました。まず、API通信のような非同期で結果が返る処理をasync/awaitに変換することから始めました。その過程で、ActorやMainActorの利用も行いました。また、非同期処理にまつわる問題を厳密にチェックするため、SWIFT_STRICT_CONCURRENCYオプションを有効にし、その結果に対する対応策も講じました。
その過程で遭遇した具体的な問題とそれに対する対策の実例を紹介します。
Swift コードの品質を向上させるためには、コードベースが大きくなるほど自動化が不可欠です。CodeQL は GitHub が開発した静的解析ツールで、コードベース全体を検査して脆弱性やエラーを検出することができます。たとえば、データを安全でない方法で利用する、関数に危険な引数を渡す、機密情報を漏洩するなどの、コードにおける潜在的なセキュリティ問題を検出することが可能です。現在は、GoやPython、C++といった様々な言語がサポートされています。
この CodeQL、なんと Swift もベータサポートされています!本LTでは、CodeQL を用いて Swift コードの脆弱性とエラーを検出する方法を紹介します。
現在最新の Swift 5.10 にも対応しています。しかし、いくつかドキュメントにない対応が必要となります。それらを紹介するにあたって、自身のOSSアプリを公開する際「秘匿情報書いたりしてないかな.....」とドキドキしながら公開ボタンを押してどうなったか!!という小話と共に紹介します。
コストがかかって大変ですが、おざなりにはできないセキュリティチェック。まずは数行の設定を書くだけで利用できる便利なCodeQLをみなさんも始めてみませんか?みんなでフィードバックしていくことで安全な Swift コードを増やしていきましょう。
みなさん、UIWindowを最前面に表示したい時どのように表示を行なっていますか?
多くの方が makeKeyAndVisible()
を使っているのではないでしょうか。Developer Guideにも 「自身の windowLevel
以下のUIWindowの中で最前面に表示できる便利メソッド」であることが明記されています。
しかし、同時にDeveloper Guideには「表示だけであれば isHidden
プロパティを false
にすればよい」とも書いてあります。
makeKeyAndVisible()
によってUIWindowが keyWindow
となるため keyWindow
なUIWindowが最前面のUIWindowであると思われがちですが実際にはそうではありません。
この理解が曖昧だと「キー入力は受け付けたいが最前面に表示したくない」といったケースで困ったり、「 makeKeyAndVisible()
を呼んでいるのに別のUIWindowが最前面になってしまった」というケースで困ることがあります。
このLTではUIWindowの表示順決定方法について紹介しつつ、 makeKeyAndVisible()
で何が起こっているのか紹介します。
Swiftでもシェルスクリプトのようなことができるのは既に知られていることかと思います。
しかし、標準の開発環境であるXcodeではSwiftスクリプトのサポートがほとんどされておらず、標準APIのコード補完すらできないのが現状です。
一方で、VSCode (Visual Studio Code)にSwiftプラグインを導入することでコード補完はもちろん、変数の型の確認が容易になるなどの恩恵を受けられます。
更に、GitHub Copilotも標準サポートされているのである程度の単純作業であればすぐにスクリプト化することができます。
本セッションではSwiftでスクリプトを書く際の注意点を紹介しつつ、実際に使っているシェルスクリプトをVSCode+GitHub CopilotでSwiftに書き直す様子をライブコーディングでお届けします。
iPhone, iPad, Apple Watch, AirTag, AirPods, Mac。
iOSDCに参加されている方なら、これらをたくさんお持ちだと思いますが、自分に合ったちょうどいいスタンドなどのアクセサリを見つけるのはなかなか難しいですよね。実際に使ってみないと、そのアクセサリが本当に良いかどうかわからないので、色々試してみたくなることはありませんか?
購入する以外にも、CADと3Dプリンタを使って自分で作るという選択肢が増えれば、様々なアクセサリを試すことができたり、世界に一つだけのオリジナルなものを作れたりと、日々の生活がさらに楽しくなります。
そこで、Apple公式の「Appleデバイス用アクセサリのデザインガイドライン」を元に、作り方の手順や完成データの探し方、私が実際に作ってみたものを紹介しながら、発表したいと思います!
swiftUIで pull to refresh を実現するにはApple純正のrefreshableを使うのが一般的です。
ただし、私が開発しているアプリでは、この純正機能を使用することで、レイアウト崩れや予期しない動作が発生していました。
具体的には、リフレッシュした後にスクロールview の画面が下にずれる問題が発生していました(詳細はこちら: https://stackoverflow.com/questions/76943913/swiftui-scrollview-refreshable-doesnt-work-appropriately)
他にも対応している、アプリがiOS15以下も対応していたため、そもそもScrollViewのリフレッシュが使えない。
私のUIKit経験値が低いために、UIKitでのリフレッシュバグが起きた際に対応しきれなかった。
そのためswiftUIのみでcustomRefreshableを作ろうと思いました。