WWDC25:Automate your development process with the App Store Connect API

CI/CDにとどまらず、リリース情報、フィードバックの変更をトリガーにした自動化を加速できる。


0:00 – Introduction

  • App Store Connect は開発プロセス自動化のための多くの API を提供
  • 今年は app management や TestFlight など主要分野で API が大幅拡張
  • Webhooks API や Apple-Hosted Background Assets API など新機能も追加
  • Webhook 通知 Build upload API Feedback API などが開発サイクル高速化に寄与

1:56 – Webhook notifications

  • Webhook 通知によってイベント駆動型のワークフローを組むことができる
    • Webhook はサーバー間のプッシュ通信で イベント発生時に App Store Connect から HTTP コールバックを受け取る仕組み
    • Webhook listener の URL を App Store Connect に登録し イベント発生時に POST リクエストを受信
    • 通知 payload にはイベント情報が含まれ 必要に応じて追加 API コールも可能
  • Webhook 通知は Build upload state イベント, Feedback イベント, Build beta state イベントなど多様なイベントに対応
  • Webhook 設定は UI でも API でも可能 シークレットキーで署名検証もサポート
    • Integretions > Workfows の設定方法説明

6:50 – Build upload API

  • Build upload API でビルドのアップロード自動化が可能に
  • 任意の言語やプラットフォームから利用でき 柔軟な自動化が実現
  • BuildUploads を作成し build 情報を登録 → BuildUploadFiles でファイル詳細を通知 → 指示に従いバイナリをアップロード
  • アップロード完了後 PATCH リクエストで完了通知し App Store Connect がビルド処理を開始
  • Webhook 通知で処理完了を即時把握可能、署名検証で信頼性も確保

11:18 – Beta testing builds

  • TestFlight API でビルドのベータ配信も自動化可能
  • ビルドをテスターグループに割り当て、外部テスターには Beta App Review 提出も API で対応
  • Build Beta State Webhook event でベータ審査完了を即時通知
  • 通知 payload でビルド ID や状態を確認し次のステップへ進める

12:51 – Feedback API

  • TestFlight のフィードバック(スクリーンショットやクラッシュ)も API で取得可能
  • Webhook で新規フィードバック到着を即時検知しフィードバックの ID で詳細取得
  • Feedback API でデバイス情報やスクリーンショット URL などを取得 クラッシュログも API でダウンロード可能

15:05 – Additional development APIs

  • Apple-Hosted Background Asset 管理用 API も新登場
  • app version state webhook event で App Store 上の状態変化も通知
  • 既存の多様な API も活用し 開発からテスト リリースまで自動化可能

WWDC25:Customize your app for Assistive Access

先日の Recap イベントにて、LTのひとつで取り上げられていた Assistive Access。発表者の方とお話しし、超高齢化社会を迎えるこれからの日本でこそ有用な機能であると伺いなるほどと思った。Dynamic Type を使って文字を拡大して使われている方は多いが、一定大きくなると表示との整合性を取ることが難しくなる。一定以上の文字サイズ設定のレイアウトを Assistive Access と分離すると良いかもしれない。


0:00 – Welcome

  • Assistive Access は Apple が iOS と iPadOS で提供する 認知障害のある人向けのシンプルな体験
  • アプリやコントロールを本質に絞り込み 誰でも簡単かつ自立してデバイスを操作できるように設計されている
  • iOS と iPadOS 26 では Assistive Access scene type を使ってアプリをこの体験に統合できる

0:59 – Meet Assistive Access

  • Assistive Access は iOS と iPadOS 17 で導入された
  • 認知負荷を減らすために シンプルなインターフェースと一貫したデザインを提供
  • Camera や Messages などのビルトインアプリは 大きなコントロールや視覚的な要素を重視した共通スタイルを持つ
  • 最適化されていないアプリは 画面下部に常に表示される戻るボタンのために縮小フレームで表示される
  • 認知障害向けに設計されたアプリは UISupportsFullScreenInAssistiveAccess キーを Info.plist で true に設定することでフルスクリーン表示が可能
  • SwiftUI や UIKit で Assistive Access セッションの検出も可能
  • フルスクリーン対応アプリは Accessibility 設定の Optimized Apps リストに表示される
  • 一般的なアプリは iOS と iPadOS 26 で Assistive Access scene を作成し 専用の UI 体験を提供できる

4:09 – Create a scene

  • UISupportsAssistiveAccess キーを Info.plist に true で追加し Optimized Apps に表示されるようにする
  • Assistive Access scene を追加し シンプルな UI 階層を設計
  • Assistive Access で起動時 この scene がアタッチされる
  • SwiftUI コントロールは自動的に大きく明確なスタイルで表示され grid や row レイアウトも自動適用
  • SwiftUI preview macro で Assistive Access trait を渡してレイアウトをテスト可能
  • UIKit アプリでも SwiftUI scene を定義し scene delegate でアクティブ化できる

7:08 – Tailor your app

  • アプリの体験を本質に絞り込み 理解しやすくサポート的な UI を設計することが重要
  • 主要な1〜2機能に絞り 他の機能は Assistive Access 外で提供する
  • 画面上の選択肢や要素を減らし 誤操作や混乱を防ぐ
  • 隠れたジェスチャやネストした UI は避け 明確で目立つコントロールを使う
  • タイムアウトによる UI の自動消失や状態変化は避ける
  • ステップバイステップのガイドフローを設計し 一度に多くの選択肢を提示しない
  • 取り消しや削除など回復困難な操作は極力排除し 必要な場合は二重確認を行う
  • テキストだけでなく アイコンや画像など視覚的な情報も併用する
  • SwiftUI の assistive access navigation icon modifiers でナビゲーションタイトルにアイコンを追加
  • ユーザーからのフィードバックを重視し Assistive Access コミュニティでテストを行う

WWDC25:Wake up to the AlarmKit API

地味に反響の大きな AlarmKit について。筆者は10年以上前にポモドーロタイマーアプリをリリースしたことがあったが、ローカル通知頼りにならざるを得ず、体験的にイマイチだったし、通知が溜まりまくってカオスになってしまっていた。AlarmKit があれば、ポモドーロ以外にも細かなシーンを補えるので嬉しそう。(例えば筋トレアプリだとインターバルの残り時間とか)


0:00 – ようこそ

  • AlarmKit はアプリでアラームを作成できるフレームワーク
  • スケジュール型とカウントダウン型の2方式目立つアラートを提供
  • サイレントモードやフォーカスを突破してアラートを表示
  • カスタムアラームタイトルとアプリ名を表示し、停止やスヌーズ機能を提供
  • StandBy や Apple Watch でもサポート
  • Live Activities を使ったカスタムカウントダウンインターフェースも可能

0:32 – 概要

  • アラーム機能はユーザーが各アプリごとにオプトインで有効化
  • 許可は手動で要求するか、最初のアラーム作成時に自動要求
    • 設定アプリでいつでも許可状態を変更可能
    • NSAlarmKitUsageDescriptioninfo.plist に追加して使用目的を説明
    • AlarmManager.requestAuthorization() で手動許可要求
  • authorizationState で許可状態を確認してからアラームをスケジュール
    • 拒否時の制限明示も重要

1:39 – 作成

  • アラーム作成に必要な要素:
    • カウントダウン時間(pre-alert/post-alert duration)
    • スケジュール(固定日時または相対パターン)
    • 外観設定
    • カスタムアクション処理
    • 関連サウンド
  • スケジュールの指定:
    • 固定スケジュール:特定の未来日時を指定(タイムゾーン変更に影響されない)
    • 相対スケジュール:時刻と週次繰り返しパターンを指定(タイムゾーン変更に対応)
  • アラーム外観のカスタマイズ:
    • AlarmButton でボタンのテキスト、色、アイコンを設定
      • アイコン(SF Symbols)は Dynamic Island 表示に使用
    • AlarmPresentation でアラートタイトルを設定
    • AlarmAttributes でアラーム属性を設定
      • 表示のレンダリングに必要な情報
      • tintColor の設定:アラームとアプリの関連性を伝えるのに役立つ
    • AlarmConfiguration に、duration と attributes を含める
  • カウントダウン表示の設定:
    • 繰り返しボタンを AlarmPresentationsecondaryButton / scondaryButtonBehavior に指定 (.countdown)
    • Live Activities を使ったカウントダウン UI
      • Live Activity を Widget Extension に追加
    • 追加情報の表示設定:
      • AlarmMetadataAlarmAttributesmetadata に指定
      • Live Activity 側で context.attributes.metadata を抽出して表示に活用
    • カウントダウンインターフェイスの表示はシステムが保証:システム表示のカスタマイズ(一時停止/再開ボタン等)
  • カスタムアクション:
    • App Intent を使ったカスタムボタンアクション
    • アプリを開く、詳細表示等の処理
    • アラームに一意の識別子を定義して追跡できるようにする
  • サウンド設定:
    • デフォルトシステムサウンドまたはカスタムサウンド
    • ActivityKit の AlertSound 構造体を使用
      • サウンドファイルはメインバンドルか、Library/Sounds に格納

16:32 – ライフサイクル

  • AlarmManager クラスでアラームのライフサイクルを管理
  • 一意の識別子を使ってアラームを追跡
  • カウントダウン状態への移行、キャンセル、停止、一時停止、再開が可能
  • ベストプラクティス:
    • 特定間隔のカウントダウン(料理タイマー)や繰り返しアラート(目覚まし)に適している
    • 重要な通知や時間敏感な通知の代替ではない
    • アラート表示は明確で理解しやすく(何のアラームか、どのようなアクションが可能か)
    • Live Activities には残り時間、停止ボタン、一時停止/再開ボタンを含める

WWDC25:Meet PaperKit

新登場の PaperKit。がっつり UIKit ベースの実装で懐かしさを感じた。Apple Pencil 結局使いこなせていない、、空間アクセサリとして対応する日が来たら、また変わるのかもしれない。


0:00 – イントロダクション

  • PaperKit は Apple のシステム全体で使われているマークアップ体験を支えるフレームワーク
  • Notes やスクリーンショット、QuickLook、Journal アプリなどで利用
  • キャンバス上で描画や多様なマークアップ要素(図形、画像、テキストボックス等)を追加できる
  • macOS Tahoe でも同様のリッチなマークアップ体験を提供

1:36 – PaperKitの基本知識

  1. PaperKit の主な3コンポーネント
    1. PaperMarkupViewController:インタラクティブなマークアップ・描画の提供
    2. PaperMarkup:データモデルコンテナ・PaperKit マークアップ、PincilKit 描画データの保存・読み込み、レンダリング
    3. MarkupEditViewController or MarkupToolbarViewController(macOS):挿入メニュー

3:35 – PaperKitの導入

  • iOSアプリへの導入例:
    • UIViewControllerviewDidLoad() 内で PaperMarkupPaperMarkupViewController を初期化
      • PaperMarkup は初期化時に bounds を指定
    • PencilKit のツールピッカー(PKToolPicker)と連携し、ツールの表示や操作を制御
      • paperViewController と紐づけツールピッカーの状態変化に動的に応答
    • UIResponder.pencilKitResponderState.activeToolPicker / .toolPickerVisibility
    • アクセサリボタンから挿入メニューを呼び出し、マークアップ要素を追加
      • MarkupEditViewController
  • macOS アプリでも同様の手順で導入可能。ツールバーUIで挿入メニューを提供
  • SwiftUI 環境でも UI/NSViewControllerRepresentable で統合可能
  • デリゲートや Observable 対応で状態管理や自動保存も柔軟
  • ディスク読み込みのデータに対し、前方互換性のためコンテンツバージョンの検証が必要
    • 不一致時はアラートでアップグレードを訴求/あらかじめレンダリングされたサムネイル表示
    • PaperKit の前方互換性担保の仕組み:CGContextmarkupModel.draw(…)

8:37 – 機能セットのカスタマイズ

  • PaperKit の全機能は FeatureSet で管理
  • FeatureSet.latest で最新機能を一括利用可能
  • remove/insert で利用可能なツールやインクを細かく制御
  • HDR対応も可能(colorMaximumLinearExposure プロパティで設定)
  • カスタマイズした FeatureSet を各コントローラに適用し、アプリ全体で一貫した体験を実現
  • paperViewController.contentView のカスタマイズで独自テンプレートや背景も設定可能(カスタムビューを指定することで、マークアップの下のレイヤーとしてレンダリングされる)

WWDC25:Explore Swift and Java interoperability

先日の Recap イベント で知った SwiftJava について。

話されているこの方、try! Swift 2025 でもご登壇されていた。あいにく筆者はスタッフをしていたので聴講できなかったが、会場で何度もお見かけしていたので、サムネからすぐにピンときた。


0:00 – Introduction & Agenda

  • SwiftとJavaの相互運用(インターオペラビリティ)を紹介
  • Swiftを他言語の既存コードベースに段階的に導入できるメリット
    • 書き換えずそのままに、Swiftでの新しい機能追加や置き換えが可能
    • Swiftで多言語のライブラリ、多言語でSwiftのライブラリを利用可能
  • Swiftと他言語の連携は言語だけでなく、CMakeやGradleなど各エコシステムのビルドツールとも統合
  • SwiftのC言語はじめ多言語との相互運用の歴史
  • 相互運用の方向性:Java interoperability は両方向に対応
    • Call Java from Swift
    • Call Swift from Java

2:41 – Runtime differences

  • JavaとSwiftのランタイムの違いを解説
  • 両言語ともクラス継承、メモリ管理、ジェネリクス、例外処理など多くの共通点がある
  • 違いを意識しつつAPIを設計すれば、相互運用が可能

3:31 – Java Native methods

  • Java Native Interface(JNI)を使ったJavaからネイティブコード(Swift)呼び出しの仕組み
    • Java のネイティブメソッドは JNI API に含まれている
    • JNIは歴史が長く、パフォーマンス向上や既存ネイティブライブラリ利用のために使われる
  • ライブラリやツールを使わない従来手順で JNI を使うデモ
    • Java でネイティブ関数を定義、ネイティブコードを浸かって実装
    • 例では、Java オブジェクトである Integer を引数・戻り値に使用
    • Java コンパイラを使用:-h フラグ → Cヘッダーファイルが生成
      • JVM が呼び出すファイル
      • インターフェイスの命名が長い
    • これを Swift で実装
  • JNIの利用は手順が多く、Cヘッダーやシグネチャの一致などミスが起きやすい
  • オブジェクトのライフタイム管理も難しい

6:29 – SwiftJava

  • Swift と Java の相互運用を支援する新プロジェクト「SwiftJava」を紹介
    • Swift パッケージ(JavaKit)
    • Javaライブラリ(SwiftKit)
    • コマンドラインツール (swift-java) で構成
  • swift-java コマンドによる生成結果(Swift ファイル)
    • インポートされたJavaクラスの定義が含まれている
    • @JavaMethod マクロで示される Java 型のメンバーメソッド経由で、Swift コードからアクセスできる
    • JNIExampleNativeMethods プロトコル:C ヘッダの代わり
    • @JavaImplementation でネイティブ関数を実装。必要な関数シグネチャはコンパイラが実装
    • @JavaMethod マクロの関数定義内で、Swift コード/Swift ライブラリを利用した実装が可能
  • JNI の煩雑さを解消し、ボイラープレートを削減し、安全かつ効率的な連携を実現
  • SwiftJava を使うことで、型安全なコード生成やオブジェクト管理が容易に

10:13 – Call Java from Swift

  • Swift から Java ライブラリを利用する方法
  • Gradle 連携で Java の依存解決も自動化
  • 依存関係の3つの要素:Artifact ID, Group ID, Version をコロンで繋ぎ、 swift-java.config の dependencies に追加
  • Swift Package Manager プラグインやコマンドラインツールで Java ライブラリを Swift から簡単に呼び出せる(トレードオフあり)
    • swift build --disable-sandbox : セキュリティサンドボックス無効化が必要
    • swift-java resolve --module-name <module_name> : 依存関係の解決を手動起動する必要あり
  • JavaKit による JDK ラッパー型やオブジェクトのライフタイム管理もサポート
    • Swift プロセスで JVM 起動
      • let jvm = try JavaVirtualMachine.shared()

14:01 – Call Swift from Java

  • Java から Swift ライブラリを利用する方法
  • Swift の型や関数を Java クラスとして自動生成し、Java からシームレスに呼び出し可能
  • JNIではなく、Java 22 以降の Foreign Function and Memory API を活用
  • 例:struct SwiftyBusiness – 構造体定義で、プロパティ、イニシャライザ、メソッドを持つ
    • struct は値型で、安定したオブジェクトIDがない → Java オブジェクトで表現不可
    • swift-java コマンド:Swift 型ヘのアクセサである .java ファイル(Java クラス)生成
    • .swift も含めた .jar ファイルが生成
    • 構造体が Java クラスとして実装され、メソッドも Java シグネチャで定義される
      • 内部的に Foreign Function API でネイティブ呼び出しされる
  • Confined な SwiftArena(メモリ管理、有効期限管理)の使用で、安全かつ効率的なリソース解放を実現
    • SwiftArena.ofConfined() による、try-with-resource を使用したメモリ管理
    • GCに依存せず最善のパフォーマンスを実現可能

おまけ

ChatGPT が案出ししてくれた、SwiftJava の実験案10選。

iOS兼Androidアプリエンジニアとしては、Android 開発と連動できれば嬉しいが、、Kotlin が主流な昨今において果たして。Jetpack Compose のコード生成はできないと思う、、

1. “書いた Swift をそのまま Android でも”
  • ドメインロジックやアルゴリズムを Swift で実装し、SwiftJava CLI で Java ラッパを吐き出して Android に組み込む。Gradle が依存解決・ビルドを面倒見てくれるので iOS ⇄ Android の 100 % 共有コード が現実的に。 
2. Java ライブラリをサクッと呼ぶ Swift サーバー
  • Vapor や Hummingbird など Swift サーバーアプリから Apache Lucene/Kafka/Spark まで JAR ごとインポート。swift-java resolve がトランジティブ依存を丸ごと解決し、Swift 側は import JavaLucene で即検索エンジン化。 
3. Swift 製暗号モジュールを Java へ“輸出”
  • セキュアかつ GC フリーな Swift ライブラリを生成し、JVM とは Java 22 の Foreign Function & Memory API で橋渡し。Java 側は try-with-resources で自動メモリ管理、Swift 側は Arena で安全――金融/ブロックチェーン案件に映える。 
4. Jetpack Compose コンポーネントを Swift マクロで自動生成
  • SwiftUI ライクな DSL → マクロ展開で Compose UI を吐くツールチェインを自作。デザイナーが SwiftUI プレビューで確認 → ボタン一発で Android 版 UI を生成、という“プラットフォーム超えデザインシステム”を実現。
5. JVM 大規模データ処理をローカル ML 推論に転用
  • Java の Deeplearning4j モデルを iOS アプリに同梱し、Swift から呼び出して 完全オフラインの画像分類。モバイルでも GDPR/個人情報保護の要件をクリアしつつ高精度推論。
6. Minecraft/IntelliJ プラグインを Swift で書く
  • プラグイン API は Java だが、Swift 側でコアロジックを書くことで Swift Concurrency で並列 AIResult Builders で DSL などモダン機能をプラグインにも注入。
7. Spring Boot × Swift で“二刀流”マイクロサービス
  • コントローラ層は Java(Spring)、ドメイン層を Swift で実装。Swift の値型 & 不変データでビジネスロジックを堅牢にしつつ、既存の Spring インフラ(Actuator/Observability)をそのまま享受。
8. JUnit ↔︎ XCTest 相互呼び出しでクロスプラットフォーム CI
  • SwiftJava で JUnit テストから Swift の XCTest を直接呼び出し、“片方落ちたら両方真っ赤”な 一体化テストレポート を生成。モノレポの CI をシンプルに。
9. SwiftArena × Project Loom で“協調コルーチン”
  • Java 側の仮想スレッド(Loom)と Swift の Structured Concurrency を相互ラップし、クロスランタイムの高スループット IO を研究。フルスタック並列処理オタク歓喜。
10. “Swift 製 DSL→JVM バイトコード”コンパイラ
  • Swift Macro で DSL を解析、SwiftJava で ASM(Java バイトコード生成ライブラリ)を呼び出して ネイティブに JVM バイトコードを吐く。Swift 製ビルドツールやスクリプトエンジンだって夢じゃない。

WWDC25:Create icons with Icon Composer

前回に続き、新たなアイコンデザインを出力するための Icon Composer の使い方。視覚的効果や配色は Icon Composer で完結。デザイナーがこのツールにキャッチアップするのももちろん良いが、開発者も触ってみてどのような調整が可能かを理解するのも重要そう。


0:51 – Overview

  • アイコン作成の歴史的変遷:従来は様々なサイズで作成が必要だったが、解像度向上によりひとつの解像度で完結するよう簡素化
  • 2025年、ダークモード・ティントモードの拡張により、再度プロセス簡素化の転換点
  • Icon Composer により、1つのファイルで全てのプラットフォーム・外観に対応可能
    • 図解的、複雑なアイコンは従来通り個別画像でXcodeにアップロード可能:鏡面ハイライトが自動適用
  • よりグラフィックなアイコンは Icon Composer で Liquid Glass の新機能を活用可能
    • アートワークひとつから、各プラットフォームで一貫したデザインが提供可能
    • 動的なグラスプロパティを活かした、リアルタイムな見た目の確認
    • 6種のアピアランスのチェック(Default, Dark, Clear light/dark,  Tinted light/dark)

3:55 – Design

  • ベクターツール(SVG出力可能)の使用を推奨
  • Apple Design Resources からアイコンテンプレート(Figma、Sketch、Photoshop、Illustrator対応)をダウンロード
    • iPhone、iPad、Mac は 1024px、Watch は 1088px のキャンバスサイズ
    • グリッドは共通、デザインの流用が容易
  • レイヤー設計:Z深度で背景から前面へ積層、色分けも重要
    • レイヤー分け、色分けをしておくと、Icon Composer でコントロール可能な幅が広がる
    • 例:Translate アイコンでは吹き出しとテキストを別レイヤーに分離 → レイヤごとのぼかし・影を、鏡面、透過度/不透明度と同様に、動的プロパティで設定
  • グラフィックエッセンスを重視(フラット、不透明、制御しやすい状態)

6:10 – Export Layers

  • レイヤーをSVG形式でエクスポート(Z順で番号付けしネーミング)
  • Illustrator 用のレイヤー → SVG自動変換スクリプトを提供。
  • 背景色・グラデーションは Icon Composer で直接追加するためエクスポート不要
  • テキストはアウトライン化してからエクスポート(SVGではフォント維持できない)
  • カスタムグラデーション・ラスター画像はPNG形式でエクスポート(透明な背景も維持可能)
  • 角丸矩形・円形マスクは含めない(後で自動トリミングされるため)

7:22 – Icon Composer

  • 3つのパネル構成:左側(キャンバス・グループ・レイヤー)、中央(プレビュー)、右側(インスペクター)。
  • 背景色設定:システムプリセット(最適化済み)またはカスタム色・グラデーション
  • グループ:最大4つまで(視覚的複雑さの適切な範囲)
  • 外観モード:Default、Dark、Mono
  • Liquid Glass プロパティ:レイヤーレベルとグループレベルで制御可能
  • プロパティ設定:外観別・全体共通の設定が可能
    • Color
    • Composition
    • モードを跨いで一貫性を保つために予備設定してあるが、詳細コントロールも可能
  • シャドウ:Neutral(汎用)とChromatic(色付き)から選択
    • CHromaticで、素材の明るさや物理特性が際立つ
  • Dark モード:フィル・不透明度・ブレンドモードの調整で最適化
  • Mono モード:少なくとも一番目立つ/みやすい要素を白に設定
  • プラットフォーム間調整:Watch 用の円形と他の角丸矩形の光学調整
    • Composition で円形に合うよう見た目の調整

13:16 – Delivery

  • .icon ファイルとして保存し、Xcode にドラッグ&ドロップ
  • プロジェクトエディターでアイコンを選択
  • ビルド・実行でプラットフォーム・外観への適応を確認
  • Icon Composer はベータ版で提供、Feedback Assistant でフィードバック可能

WWDC25:Say hello to the new look of app icons

Liquid Glass に対応したアイコンデザインについて。「等間隔になった」デザイングリッドについて、たしかに以前はそうでなかったことを思い出した。レイアウトがしやすくなりそう(どれだけのデザイナーが従来のグリッドを尊重してデザインしていたかは不明だが、、) これまで自社アプリはダークテーマにも対応できてない状態だったが、強制的に Liquid Glass の視覚効果が与えられることによって従来のままではやや不恰好に見えてしまっている。Icon Composer も用意され、これを機に自社他社問わず、放置されていたアイコンの最適化が促進されるかもしれない。


0:00 – Intro

  • visionOS のレイヤーアイコンと実際のガラス特性を研究して生まれた「Liquid Glass」マテリアル
  • エッジハイライト、曇り(frosty)、透過性を組み合わせて奥行きと内側からの照明効果を実現
  • iOSホーム画面ではジャイロ入力に基づいて光が動き、周囲の世界を反射しているような感覚
  • 新しい外観モード:
    • モノクロガラス(ライト・ダーク)
    • ティントモード(ダーク・ライト)
      • ダーク:前傾にカラー
      • ライト:背景ガラスにカラーが注入
  • 全ての外観モードが iPhone、iPad、Mac で利用可能。Apple Watch でもライトモードアイコンが更新された外観で表示
  • App Store 商品ページでも更新されたアイコンが反映

2:20 – Design System

  • 統一されたアイコン言語により、デバイス間でのデザインが容易になった
  • 角丸四角型 (macOS, iOS):1024px キャンバスで、よりシンプルで均等に配置され余裕のあるデザイングリッド、より同心円状で丸い角半径
    • macOS では従来、アイコン形状から一部はみ出すケースがあった
    • 形状がキャンバス形状がマスクとして機能し、不規則な形状を回避
    • 既存のアイコンは自動的にリサイズ、マスクまたは拡張されて、新しいマテリアルを適用
  • 円型 (watchOS):1088px キャンバスで、角丸矩形よりも広く、プラットフォーム間の一貫性を実現しやすい
  • 新しいテンプレート(Figma、Sketch、Photoshop、Illustrator対応)をApple Design Resourcesで提供

5:18 – Drawing Icons

  • レイヤリング:背景と前面レイヤーの基本構造、複数レイヤーの積層で奥行きを表現
    • 1枚の背景レイヤーと、1枚以上の前面レイヤーで構成可能
      • Messages: 背景1枚、前面1枚
      • Podcasts: 背景1枚、前面3枚として立体感ある奥行きを実現
  • シンプルさの重視:複雑な3Dオブジェクトや遠近法は避け、フロントビューとフラットな外観を推奨 (e.g. Chess)
  • 透過性:新しいマテリアルでの透過性とブラー効果で軽やかさと奥行きを追加
  • 「少ないほど良い」原則:重複を減らし、Liquid Glass の効果を活かす(透明感、レイヤーごとの影やスペキュラハイライト)e.g. Photos
  • レイヤーの数を減らし、形状に丸みを持たせ、視覚的効果を削除 → Liquid Glass の処理にゆだねる (e.g. Home)
  • 細部の配慮:鋭いエッジや細い線を避け、丸い角を使用して光の流れを滑らかに → 要素端の光の動きが滑らかになる (e.g. Settings の歯車)
  • 背景:ソフトな明暗グラデーションに加え、白黒背景の代わりに使えるシステムライト・ダークグラデーションを用意
    • グラデーションは、上から下に、明 → 暗
    • 色付き背景を推奨。ライト・ダークモード間の区別を明確にできる

WWDC25:What’s new in SF Symbols 7

SF Symbols アップデート。もはや高機能すぎて数年前から使いこなせる気がしていない、、が Draw 機能によって、ものによっては Lottie に依存する必要がなくなったかもしれない。グラデーションもシンプルながら表現力を底上げできるので嬉しい。


2:19 – 描画(Draw)

  • 新機能「Draw」追加。手書き風アニメーションでシンボルをパスに沿って描画
  • Draw On(登場)と Draw Off(消失)の2つのアニメーションプリセット
    • それぞれ既存の再生オプションをサポート
      • By Layer:デフォルト、レイヤーごとに開始時点が異なる
      • Whole Symbol:すべてのレイヤーをまとめて描画、各パスのアニメーションが同時開始終了し、素早い
      • Individually:新しいオプション、レイヤーごと逐次的にアニメーション実行する
  • シンボルごとに描画方向を柔軟に設定可能(例:左右、中心から外など)
  • 複雑なシンボルもサポート
    • 例:矢印の矢を遷移沿って移動させる
  • Variable Draw(進捗や強度を描画で表現)も新たに追加
    • 例:ダウンロードやワークアウトの進捗、温度計
    • SF Symbols app で確認可能

6:02 – マジック置換

  • Magic Replaceが強化され、関連シンボル間のアニメーション遷移がより滑らかに
  • 同じエンクロージャ(囲い)を持つシンボル間で、囲いを維持しつつ他の部分を置換
  • Drawアニメーションと組み合わせて、より表現力豊かな遷移が可能に

7:01 – グラデーション

  • シンボルにグラデーション(線形グラデーション)を適用可能に
    • 光が当たっているような印象を与えられる
  • すべてのレンダリングモードで利用可能
  • 特に大きなサイズで立体感や奥行きを強調したい場合に有効

8:02 – カスタムシンボル

  • カスタムシンボルにもDrawやグラデーションなど新機能を活用可能
  • Drawアニメーションには「ガイドポイント」を描画パス上に配置して描画経路を指定(パスに少なくとも2つ必要)
  • ガイドポイントには開始点・終了点に加え、中間点を加えて複雑なパスを構成する
  • ガイドポイントには複数種類があり、複雑なパスや複数サブパスにも対応
    • 複数のサブパスで開始・終了点を共有
    • コーナーポイント:急カーブや鋭い角に特別な処理が求められるため指定
  • 複数パスが存在する場合は、それぞれに描画パスと方向のルールセットを指定
  • 中心からアニメーションする場合、双方向描画をアノテート
    • 開始点の両側にガイドポイントを配置するとシステムが自動的に双方向性を認識する
  • 適応型(addaptive)エンドキャップ
  • アタッチメント(例:矢印の先端)も火病が要素としてガイドポイントに紐付けてアニメーション可能
  • 重なり合うパスや複雑な形状にも柔軟に対応するための詳細設定が用意
  • カスタムシンボルは Regular、Ultralight、Black の3つのウェイトでガイドポイントを設定すれば、他のウェイトは自動補間される
    • Regular 以外でガイドポイントが不正になった際調整が必要、その時ガイドポイントの順序に注意(ポイント番号を表示可能)
  • 可変描画(Variable Draw)もカスタムシンボルで利用可能

20:52 – 新しいAPI

  • SwiftUIでは symbolEffect モディファイアで Draw アニメーションを適用
    • .symbolEffect(.drawOn, isActive: isHidden)
    • .symbolEffect(.drawOn.indicidually, …)
  • AppKit・UIKit でもDraw On/Off を指定してアニメーション可能
  • Variable Draw やグラデーションも API で簡単に指定可能
    • .symbolVariableValueMode(.draw)
    • .symbolColorRenderingMode(.gradient)
  • コード例は SF Symbols アプリの「Copy Code」ボタンから取得可能
  • 新機能を活用するには SF Symbols 7 ベータ版のダウンロードと、カスタムシンボルの再設計・注釈付けが推奨

WWDC25:Explore large language models on Apple Silicon with MLX

以前 Foundation Models framework を実際に使ってみたという投稿をした。

Foundation Models framework の最大のメリットはオンデバイスのLLMを非常に手軽に扱えるという点だが、一方で高度な推論に不向きであったり、独自データによる追加学習といった高度なユースケースには対応していない → できるらしい。(追記: 2025/07/08)オンデバイスかつ手軽に追加学習を行いたい場合には、このMLXを使えばよさそう。


0:00 – イントロダクション

  • MLX は Apple Silicon 向けに設計されたオープンソースの機械学習ライブラリ
  • Apple Silicon 上で大規模言語モデル(LLM)の推論とファインチューニングを実行可能
  • Metal を使用して GPU で高速化し、統一メモリを活用して CPU と GPU が同時に同じデータで動作可能
  • Python、Swift、C++、C の API を提供
  • DeepSeek AI の6700億パラメータモデルを4.5ビット量子化で380GBのメモリを使用して実行可能(M3 Ultraの512GB統一メモリを活用)

3:07 – MLX LMの概要

  • MLX LM は MLX 上に構築された Python パッケージで、大規模言語モデルの実行と実験に特化
  • コマンドラインツールを提供し、コードを書かずにテキスト生成やファインチューニングが可能
  • Python API も提供し、生成やトレーニングプロセスなど詳細な制御を実装可能
  • Hugging Face と密接に統合されており、数千のモデルをダウンロード可能
  • インストールは pip install mlx-lm で簡単

3:51 – テキストの生成

  • コマンドライン:
    • mlx_lm.generate コマンドで Hugging Face のモデルまたはローカルパス、テキストプロンプトを指定して生成
    • サンプリング温度、top-p、最大トークン数などのフラグで動作を調整可能
    • mlx_lm.generate —help
  • Python API:
    • load 関数でモデルとトークナイザーを読み込み、設定
    • generate 関数でトークン生成ループを実行し、出力テキストを返す
    • モデルは完全に構造化された MLX ニューラルネットワークで、層の構造やパラメータを検査・修正可能
      • print(model)
      • print(model.parameters()) で学習した重みづけを確認
  • 会話の維持:
    • Key-Value Cache(KV Cache)を使用して複数ターンの会話を中間結果として維持
      • キャッシュを再利用し、時間と処理を節約、マルチターンの会話に有効
    • make_prompt_cache 関数でキャッシュを作成し、generate 関数に渡すことで履歴を保持

8:42 – 量子化

  • 目的: モデルの精度を落とすことでメモリ使用量削減と推論速度向上(多くは品質に影響しない)
  • MLX LMの利点: 量子化が組み込まれており、追加ツールや変換スクリプトが不要
  • 使用方法:
    • mlx_lm.convertコマンドで Hugging Face からモデルをダウンロード、変換、ローカル保存を1ステップ実行
    • 例:  16ビットMistralモデルを4ビットに量子化して大幅にサイズ削減
  • Python APIでの細かい制御:
    • quant_predicate を使用。例: 埋め込み層と最終投影層を6ビット、その他を4ビットに設定可能
      • 最後の埋め込み投射層は量子化の影響を受けやすいため高精度を維持したい
    • 品質と効率のバランスを最適化

11:39 – ファインチューニング

  • 目的: 大規模言語モデルを特定のドメインやタスクに適応させる
  • MLXの利点: クラウド不要でローカルMac上でファインチューニング可能
    • 外部で実行するコストがかからない
    • データがデバイスから出ない
  • 2つのアプローチ:
    • 完全ファインチューニング: 事前学習済みモデルの全パラメータを更新。最大の柔軟性だがリソース消費量増える
    • 低ランクアダプター(LoRA): 少数の新しいパラメータを追加し、元のネットワークを凍結したままそれらのみをトレーニング。高速、軽量、メモリ効率的
  • 実装:
    • mlx_lm.lora コマンドでひとつでファインチューニング開始
    • 量子化されたモデルのアダプタをトレーニング可能(メモリ使用量を劇的削減)
    • 設定ファイルで学習率、オプティマイザー設定、評価間隔などを細かく制御
  • アダプターの融合:
    • mlx_lm.fuse コマンドでアダプターをベースモデルに融合
    • 単一の自己完結型モデルを生成し、配布と使用が容易
      • --upload-repo に Hugging Face のリポジトリ名を指定するだけでアップロード可能

17:02 – MLXSwiftでのLLM

  • Swiftでの実装: 例: 28行のコードで量子化Mistralモデルを読み込み、テキスト生成を実行
  • 主要コンポーネント:
    • ModelContainer: モデルとトークナイザーへの並行アクセスを安全に管理するアクター
    • プロンプトのトークン化
    • 生成ループの実行
  • 会話履歴の維持:
    • Key-Value Cacheを明示的に作成。
      • GenerateParameters の生成
      • キャッシュの抽出
      • TokenIterator を使用して生成をステップバイステップで制御
  • 利点: Pythonと同じワークフローと機能を、Swiftで完全にネイティブに実現

WWDC25:Explore spatial accessory input on visionOS

visionOS 26 におけるスタイラスやゲームコントローラへの対応について。コントローラには興味なかったが、近い将来 Apple Pencil が 6DoF 対応し、Vision Pro でも利用可能になる伏線と見てチェックした。

実は、XRコンテンツにおけるコントローラ/ハンドトラッキングの是非については過去にも(当時)Oculus Quest での体験をもとに考察したことがあった。

Oculus: ハンドトラッキングに感じる課題

パススルーしない没入型VRコンテンツ内において、コンテンツへ対しての触覚やグリップ感を違和感なく表現するにはコントローラが優位だと考えた。ハンドジェスチャーにはその正確さや、触覚を伴う繊細なフィードバックに限界があるので(コントローラ一辺倒な体験設計は好ましくないだろうが)空間アクセサリを伴うユースケースの充実に期待したい。


0:00 – スタート

  • visionOSでは「目と手」による入力が基本だが、より細かい制御、ボタン入力、触覚フィードバックを可能にする空間アクセサリのサポートを追加。
  • サポートされるアクセサリ:
    • PlayStation VR2 Sense controller: ゲームに適したボタン、ジョイスティック、トリガーを搭載。標準ジェスチャー(タップなど)でシステムナビゲーションも可能
    • Logitech Muse: 先端とサイドボタンで可変入力が可能なフォースセンサーと強力な触覚フィードバックを搭載。生産性・クリエイティブアプリに適した精度
  • アクセサリは full space アプリ、shared space アプリの両方で使用可能。
  • Apple Vision Proのカメラとアクセサリのセンサーを組み合わせて位置と回転をトラッキング

2:41 – 彫刻アプリの構築

  • セットアップ:
    • Xcodeの機能エディタで「Spatial Gamepad」にチェックを入れて空間ゲームコントローラーサポートを追加
    • アプリのplistで「Accessory Tracking Usage」の説明を記述(例:「Tracking accessory movements to carve into virtual clay」)
  • アクセサリの接続:
    • GameController フレームワークを使用して空間アクセサリとの接続を検出
    • GCController(ゲームコントローラー)と GCStylus(スタイラス)の両方がGCDevice プロトコルに準拠。
    • 接続・切断イベントをリッスンし、productCategory が「Spatial Stylus」または「Spatial Controller」かどうかを確認
  • 仮想コンテンツの表示:
    • full space / shared space 両方で使え、プライバシー保護のため認証されたアプリのみ動き追跡可
    • AccessoryAnchoringSource を作成し、アクセサリの「aim」位置にターゲット
    • AnchorEntity を作成し、accessory ターゲット、aim 位置、トラッキングモードを指定
    • トラッキングモード:
      • predicted: 低遅延だが急激な動きでオーバーシュートする可能性。
      • continuous: 高精度だが高遅延
  • インタラクションの実装:
    • SpatialTrackingSession.accessory を追加してアクセサリの AnchorEntity のトランスフォームを取得。
    • 実装例
      • アクセサリが粘土に入った時に素材を削除し、触覚フィードバックを発生

13:37 – ARKitによるアクセサリのトラッキング

  • ARKit AccessoryAnchorの4つのプロパティ:
    • handedness: アクセサリを握っている手(左/右)
    • relativeMotion: 空間内での相対的な動き。
    • relativeRotationalMovement: 空間内での相対的な回転運動。
    • trackingState: トラッキング品質(センサーやカメラのカバレッジが低下すると品質も低下)
  • RealityKitとARKitの連携:
    • SpatialTrackingSession が実行中で設定されている場合、RealityKit AnchorEntity から ARKit AccessoryAnchor を取得可能
    • AnchorEntityARKitAnchorComponent にアクセスし、ARKitAnchorを取得して AccessoryAnchor にキャスト
  • リアクティブツールバーの表示:
    • アクセサリアンカーからheld chirality(利き手)を取得。
    • 左利きの場合は正のX方向、右利きの場合は負のX方向にツールバーを表示

14:45 – デザインに関する考慮事項

  • UIとの相互作用:
    • ビューにゲームコントローラー入力(ボタンやトリガー)をジェスチャーの代わりに受信するよう指示可能
    • 標準の手ジェスチャーとゲームコントローラーの両方を入力として処理可能
    • SwiftUIビューで .receivesEventsInView 修飾子を設定してジェスチャーイベントも受信
  • 没入感の向上:
    • 完全空間アプリでは .persistentSystemOverlays APIでホームインジケーターを非表示
    • .upperLimbVisibility APIで上肢とアクセサリを非表示
  • 適応的サポート:
    • 空間アクセサリと手の両方に対応することで、より多くのユーザーをサポート
    • ARKit は今年さらに高速で手をネイティブトラッキング
  • App Store バッジ:
    • 「Spatial game controller support」: 空間アクセサリトラッキング付きゲームコントローラーをサポート
    • 「Spatial game controller required」: 空間アクセサリトラッキング付きゲームコントローラーが必須