酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

DevelopersIOで2025年12月に執筆した記事

技術系の記事はDevelopersIOで執筆することにした。一方、すぐに修正されそうなトピックやワークアラウンド的な内容は記事の寿命が短くなる可能性があるため、引き続き「酢ろぐ!」で書くことにしている。

毎月の終わりに、DevelopersIOで執筆した記事へのリンクをまとめる。以下は2025年12月に執筆した記事の一覧である。

iOSでAndroidのSSAIDのような取得可能な識別子はあるのか調査してみた

Android開発経験者からよく聞かれる「iOSにもSSAIDのような永続する識別子はあるのか」という疑問に答える記事を執筆した。

結論として、iOSには公式にサポートされた「再インストール後も永続する識別子」は存在しない。これはAppleのプライバシーファースト設計による意図的なものである。記事では、IDFV、IDFA、DeviceCheck、App Attestなど各種識別子の特徴と用途、AndroidのSSAIDとの違いについて詳しく解説した。

dev.classmethod.jp

macOS 26.2でXcode 16.4は使えるのか検証してみた

macOS 26.2がリリースされたことを受け、Xcode 16.4が使用可能か調査した。

Apple公式サイトで確認したところ、Xcode 16.4のサポートOSは「macOS 15.3〜macOS 26.1.x」となっており、macOS 26.2では起動できないことが判明した。記事では、xcodereleases.comやApple公式サイトを使ってOSアップデート前にXcodeの互換性を事前確認する方法を紹介した。

dev.classmethod.jp

iOSアプリ開発者による2025年のふりかえり

2025年をiOSアプリ開発者目線で振り返った記事を執筆した。

iOS 26への大幅なバージョンジャンプと「Liquid Glass」デザインの登場、CocoaPods Trunk読み取り専用化に伴うSPM移行準備、Excluded Architectures問題の解決、GitHub Actionsによるブランチマージ自動化など、一年を通じて取り組んだトピックをまとめた。

dev.classmethod.jp

その他

DevelopersIOで2025年11月に執筆した記事

技術系の記事はDevelopersIOで執筆することにした。一方、すぐに修正されそうなトピックやワークアラウンド的な内容は記事の寿命が短くなる可能性があるため、引き続き「酢ろぐ!」で書くことにしている。

毎月の終わりに、DevelopersIOで執筆した記事へのリンクをまとめる。以下は2025年11月に執筆した記事の一覧である。

iOS 26.1でApple Payボタンの日本語ラベル表記が変更された

iOS 26.1で動作確認したところ、Apple Payボタンの日本語ラベル表記が変更されていることを発見した。

日本語設定のiOS 26.1環境では、.buy.inStoreタイプで「この方法で〜: Apple Pay」という新しい表記が採用されている。この変更はシステムレベルのものであるためアプリ側での対応は不要だが、UIレイアウトの崩れやApp Storeスクリーンショットの更新が必要かどうか確認することを推奨した。

dev.classmethod.jp

1Password Environmentsで.envファイルを管理できるようになったので試してみた

2025年10月にリリースされた1Passwordの新機能「1Password Environments」を試してみた。

この機能を使うと、.envファイルを仮想的にマウントし、シークレット情報をディスクに書き込まずに管理できる。Arkanaと組み合わせることで、既存のワークフローを維持したまま安全性を向上できた。誤ってGitにコミットしてしまう不安から解放されるのが大きなメリットだ。

dev.classmethod.jp

その他

DevelopersIOで2025年09月〜10月に執筆した記事

技術系の記事はDevelopersIOで執筆することにした。一方、すぐに修正されそうなトピックやワークアラウンド的な内容は記事の寿命が短くなる可能性があるため、引き続き「酢ろぐ!」で書くことにしている。

毎月の終わりに、DevelopersIOで執筆した記事へのリンクをまとめる。以下は2025年09月〜10月に執筆した記事の一覧である。

iPhone 17 の購入準備!デバイス上で物理SIMをeSIMへ変換した

iPhone 17で物理SIMスロットが廃止されたため、iPhone単体で物理SIMをeSIMに変換する手順を紹介した。

iOS 16以降で追加された機能を使用することで、通信事業者に連絡することなく、iPhone上で直接変換が可能だった。povo 2.0の場合は約2〜5分で完了し、iPhone 17への移行準備が整った。eSIMクイック転送機能で新しいiPhoneへ簡単に移行できる。

dev.classmethod.jp

iOS 26でSwiftUIのactionSheetが表示崩れする問題をconfirmationDialogで解決した

iOS 26.0でactionSheetが表示崩れする問題を発見し、confirmationDialogへの移行で解決した。

iOS 15.0でdeprecatedになったactionSheetを使い続けていたが、iOS 26.0ではダイアログが不自然に圧縮される問題が発生した。iOS 26.0以降ではtoolbarBackgroundとtoolbarBackgroundVisibilityを使用し、iOS 18以前では従来通りUINavigationBarAppearanceを使用することで両OSバージョンで動作するようになった。

dev.classmethod.jp

Xcode 16.4 + macOS 26.0環境のXcode Cloudでbundle installに失敗する

Xcode CloudがmacOS 26.0をデフォルト環境に切り替えたことで、bundle installが失敗する問題が発生した。

Xcode 16.4とmacOS 26.0の組み合わせでは、SDKパスの不整合によりfastlaneやCocoaPodsなどのRuby gemのネイティブ拡張のビルド時にエラーが発生する。当面の回避策としてXcode CloudでmacOS 15.6を明示的に指定することで解決したが、長期的にはCocoaPodsからSPMへの移行が推奨される。

dev.classmethod.jp

iOSシミュレータの位置情報をコマンドラインから制御する

ジオフェンス機能のテストで複数の地点を検証する際、xcrun simctlコマンドを使えばコマンドラインから直接位置情報を制御できることを紹介した。

従来はDebugメニューから手動で位置情報を切り替えていたが、xcrun simctl location bootedコマンドを使用することで、効率的に複数のテストポイントを順番に確認できるようになった。位置情報を使用する機能の開発やテストの効率向上につながる。

dev.classmethod.jp

Xcode 26.0 + iOS 26.0 で、NavigationStackのラージタイトルが消えてしまう問題

Xcode 26.0とiOS 26.0の組み合わせで、NavigationStackのLarge Titleが表示されなくなる問題を発見し、解決策を見つけた。

UINavigationBarAppearanceのbackgroundColorを使用してナビゲーションバーに背景色を設定すると、Large Titleが背景の裏側に隠れてしまう。iOS 26.0以降ではtoolbarBackgroundを使用し、iOS 18以前ではbackgroundColorを使用する条件分岐により、両OSバージョンで動作するようになった。

dev.classmethod.jp

その他

DevelopersIOで2025年07月〜08月に執筆した記事

技術系の記事はDevelopersIOで執筆することにした。一方、すぐに修正されそうなトピックやワークアラウンド的な内容は記事の寿命が短くなる可能性があるため、引き続き「酢ろぐ!」で書くことにしている。

毎月の終わりに、DevelopersIOで執筆した記事へのリンクをまとめる。以下は2025年07月〜08月に執筆した記事の一覧である。

Xcode 16.3以降でビルドしたアプリでNavigationStackのonAppearが予期しないタイミングで発火する問題

Xcode 16.3以降でビルドしたアプリにおいて、SwiftUIのNavigationStackでカスタムBindingを使用している場合、onAppearが予期しないタイミングで発火する問題が発生することを発見した。

この問題は、カスタムBindingの使用が原因と考えられ、解決策として@Publishedプロパティへの直接バインディングへ変更することで正常動作することを確認した。Xcode 26.0 Beta 2でも同様の問題が発生しており、NavigationStackの仕様変更と捉えるべきだろう。

dev.classmethod.jp

Claude Codeなんもわからんので、AI縛りでiOSアプリを開発してみた

Claude Codeを使って、できる限りAIにコーディングを任せてiOSアプリ(スクワットカウンターアプリ)を開発する実験をおこなった。

ポン出しでもクオリティの高いアプリの基盤ができる一方で、Xcodeのプロジェクトファイルや設定ファイルの編集はAIには難しく、「AI主導+人間サポート」という形になった。完全なAI縛りは現時点では困難だが、コア機能の実装においてClaude Codeの生産性は想像以上に高いことが分かった。

dev.classmethod.jp

Apple Developer DocumentationをAIエージェントで検索できるapple-doc-mcpを試した

サードパーティ製のMCPサーバー「apple-doc-mcp」を使って、Apple Developer DocumentationをAIツールから検索できるようにした。

Claude for DesktopとGitHub Copilot for Xcodeの両方で動作を検証し、設定方法と使用方法を紹介した。最新のAPI仕様を確認する際に特に威力を発揮するが、日本語での質問には期待通りの回答が得られないケースもあった。

dev.classmethod.jp

Claude Codeを使って大量の写真にIPTCキーワードを自動設定してみた

Claude Codeを活用して、大量の写真にIPTCキーワードを自動的に設定する方法を紹介した。

従来は手動でのタグ付け作業が必要だったが、Claude Codeを使うことで画像解析とExifToolによるメタデータ書き込みを自動化できた。CLAUDE.mdファイルで処理ルールを定義し、安全な段階的処理フローを実現した。

dev.classmethod.jp

iOSエンジニアがAWS Certified AI Practitioner (AIF-C01)を受けてみた

AIコーディングツールの進化を受けて、AWS Certified AI Practitioner試験を受験し、合格した。

約11時間の学習で合格することができた。AI/MLの基礎知識は実務経験があったためスムーズだったが、AWSサービス名と機能の対応を覚えることに最も苦労した。試験ガイドラインからサービス一覧表を作成し、機能別に整理したことで正答率が劇的に改善した。

dev.classmethod.jp

その他

DevelopersIOで2025年06月に執筆した記事

技術系の記事はDevelopersIOで執筆することにした。一方、すぐに修正されそうなトピックやワークアラウンド的な内容は記事の寿命が短くなる可能性があるため、引き続き「酢ろぐ!」で書くことにしている。

毎月の終わりに、DevelopersIOで執筆した記事へのリンクをまとめる。以下は2025年06月に執筆した記事の一覧である。

GitHub Copilot for Xcode が Agent モードに対応したので試してみた

2025年5月のアップデートで、GitHub Copilot for Xcodeに「Agentモード」が追加された。

これにより、AIが複数ファイルを編集し、ターミナル操作まで自動で実行することが可能となった。この記事では、MCPサーバーを用意せず、Xcode拡張単体でどこまで活用できるかを検証した。

dev.classmethod.jp

iOS シミュレータにプッシュ通知を送る

プッシュ通知の受信や通知タップ時の処理を実装する際、APNsから直接通知を受け取る方法もあるが、遅延やタイミングの問題が生じることがある。この記事では、ターミナルからiOSシミュレータに対してプッシュ通知を送る方法を紹介した。

dev.classmethod.jp

その他

DevelopersIOで2025年05月に執筆した記事

技術系の記事はDevelopersIOで執筆することにした。一方、すぐに修正されそうなトピックやワークアラウンド的な内容は記事の寿命が短くなる可能性があるため、引き続き「酢ろぐ!」で書くことにしている。

毎月の終わりに、DevelopersIOで執筆した記事へのリンクをまとめる。以下は2025年05月に執筆した記事の一覧である。

cocoapods‑keys を使ってシークレット情報をソースコードと分離して安全に扱う

APIキーやシークレットをソースコードにハードコーディングすると流出リスクがある。 cocoapods‑keysは、キーの名前だけをPodfileに記述し、値は開発者のローカルKeychainに格納するCocoaPodsプラグインである。プロジェクト内へは難読化されたスタブだけが生成されるため、比較的安全にバイナリへ埋め込める。この記事では、cocoapods‑keysを導入する方法を紹介した。

dev.classmethod.jp

CocoaPods の終了に備えて、cocoapods‑keys から Arkana + SPMへ移行する

CocoaPodsは2026年12月でアーカイブ化(read‑onlyモード)される予定だ。これまでcocoapods‑keysプラグインで機密情報をKeychainに保存し、ソースへハードコーディングしない運用を行ってきたが、cocoapods‑keysはCocoaPods依存であるため、SPMへ切り替えるとそのままでは利用できない。

ArkanaはCLIツールかつSPMに対応しており、CocoaPods依存から脱却できる点が大きな利点である。この記事では、cocoapods‑keysからArkanaへ機密情報の管理を移行し、Xcode Cloudでも動かすまでの手順をまとめている。

dev.classmethod.jp

Xcode Cloudで任意のバージョンのRubyを使う

Xcode Cloudは便利なCI/CDサービスだが、ビルド環境にプリインストールされているRubyのバージョンが古いという課題がある。具体的にはRuby 2.6系であり、現在一般的に利用されているRuby 3系とは互換性に差がある。この記事では、ci_post_clone.shスクリプトを使い、Xcode Cloudで任意のバージョンのRubyを使う方法を紹介している。

dev.classmethod.jp

その他

DevelopersIOで2025年04月に執筆した記事

技術系の記事はDevelopersIOで執筆することにした。一方、すぐに修正されそうなトピックやワークアラウンド的な内容は記事の寿命が短くなる可能性があるため、引き続き「酢ろぐ!」で書くことにしている。

毎月の終わりに、DevelopersIOで執筆した記事へのリンクをまとめる。以下は2025年04月に執筆した記事の一覧である。

SwiftUIの @Environment(\.openURL) を使って URLをアプリ内ブラウザで開く

SwiftUIの@Environment(.openURL)をカスタマイズし、アプリ内ブラウザ(SFSafariViewController)でURLを開く方法を紹介した。

デフォルトでは、openURLはSafariアプリでWebページを開くが、アプリ内ブラウザで開くように変更できる。具体的には、OpenURLActionを使用してURLの処理をカスタマイズし、sheetモディファイアでSFSafariViewControllerを表示している。

dev.classmethod.jp

その他