Photo Editing Extension: iOS用拡張機能の概要と能力

著者: IT Sectr 公開日: 2026-06-15 読了時間: 9 分

Photo Editing Extensionは、サードパーティアプリがシステムの写真アプリに直接編集ツールを追加できるようにするiOSのメカニズムです。フル機能のエディタとは異なり、拡張機能は写真を別のアプリに読み込みません。ユーザーは標準インターフェースから離れることなく、フィルターを適用したり、色を調整したり、エフェクトを追加したりできます。Apple Developer Documentation(2025)によると、PhotoKitはPHAdjustmentDataやPHContentEditingControllerを含む40以上のAPIを写真リソースの操作に提供しています。

重要なポイント

  • Photo Editing Extensionは、プログラムを切り替えることなく、標準のiOS写真アプリに編集ツールを埋め込みます
  • アーキテクチャはPHContentEditingControllerプロトコルに基づいて構築されており、インターフェースの表示と元の画像の取得を管理します
  • 拡張機能は非破壊編集を使用します — すべての変更はAdjustmentDataとして保存され、オリジナルはそのまま残ります
  • 画像を操作するために、拡張機能は完全な写真ファイルとメタデータを含むPHContentEditingInputを受け取ります
  • PhotoKitはPHAsset、PHAssetResource、PHImageManagerを通じて写真リソースへのアクセスを提供します

iOSにおけるPhoto Editing Extensionとは

Photo Editing Extensionは、写真アプリの標準インターフェースに画像処理ツールを埋め込むiOSのアプリ拡張機能の一種です。ユーザーは写真を開き、編集ボタンをタップし、インストール済みの拡張機能のリストから目的の拡張機能を選択します。編集後、結果はライブラリに保存され、元のファイルは元に戻すために利用可能なまま残ります。

このアーキテクチャはユーザーエクスペリエンスの重要な問題を解決します:アプリ間の切り替え、画像のエクスポートとインポート、バージョン管理が不要になります。WWDC 2025によると、すべての拡張機能は独自のサンドボックスと制限された実行時間を持つ分離されたプロセスで実行されます — 編集操作あたり最大30秒です。

拡張機能はデバイスメモリ内の任意のファイルにアクセスできません — ユーザーが選択インターフェースを通じて明示的に渡した写真のみにアクセスできます。これにより、サードパーティツール使用時のユーザーデータのセキュリティが確保されます。

PhotoKit: アーキテクチャと主要コンポーネント

PhotoKitは、iOS 8で導入されたデバイスのメディアライブラリを操作するためのAppleフレームワークです。画像、ビデオ、アルバム、メタデータを含む写真リソースへのプログラムによるアクセスを提供します。編集拡張機能にとって、PhotoKitはストレージと変更インターフェースの間の中間層として機能します。

PHAssetとPHAssetResource

PHAssetはライブラリ内の個別のメディアオブジェクト(写真またはビデオ)を表します。PHAssetを通じて、撮影日、ファイルタイプ、地図上の位置、カメラの向きなどのメタデータを取得できます。PHAssetResourceは基盤となるリソースへのアクセスを提供します — 例えば、RAWまたはHEIC形式の元の写真ファイルなどです。

編集拡張機能にとって、PHContentEditingInputは極めて重要です — 読み取りと処理が可能な完全な画像(またはビデオ)ファイルを含むオブジェクトです。拡張機能はアクティベーション時にこのオブジェクトを受け取り、それをソース素材として使用します。

PHImageManagerとキャッシング

PHImageManagerは画像の読み込みとキャッシングを管理します。編集拡張機能の場合、直接使用されません — 拡張機能はPHContentEditingInputを通じて完全なファイルを受け取ります。ただし、PHImageRequestOptionsを使用すると、リクエストパラメータ(サイズ、配信タイプ(同期または非同期)、結果の形式)を設定できます。

Appleによると、PHImageManagerは画像のサムネイルをRAMに自動的にキャッシュし、プレビューの繰り返し表示を高速化します。編集拡張機能では、最高の画質を得るためにPHImageRequestOptionsDeliveryModeHighQualityFormatを使用することをお勧めします。

swift
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isSynchronous = true

PHImageManager.default().requestImage(
    for: asset,
    targetSize: .init(width: 1024, height: 1024),
    contentMode: .aspectFill,
    options: options
) { image, _ in
    // use image for display
}

拡張機能の作成: PHContentEditingController

各Photo Editing ExtensionはPHContentEditingControllerプロトコルを実装します — 拡張機能の中心的な制御要素です。プロトコルは、インターフェースの表示、入力データの受信、結果の保存のためのメソッドを定義します。

プロトコルの主要メソッド

beginContentEditing(with:)は編集セッション開始時に呼び出されます。拡張機能はPHContentEditingInputを受け取り、元の画像とともにインターフェースを表示する必要があります。finishContentEditing(completionHandler:)は編集を完了します — 拡張機能は変更されたファイルとAdjustmentDataを含むPHContentEditingOutputを返します。cancelContentEditing()は保存せずに変更をキャンセルします。

重要な注意点:beginContentEditingの呼び出し時点で、拡張機能は写真の1つのバージョン(ユーザーがリクエストしたもの)にのみアクセスできます。別の写真やアルバムにはアクセスできません。これはAppleがセキュリティのために導入したサンドボックス制限です。

swift
class PhotoEditingViewController: UIViewController {

    override func beginContentEditing(
        with input: PHContentEditingInput
    ) {
        guard let url = input.fullSizeImageURL else { return }
        let image = CIImage(contentsOf: url)
        displayImage.image = UIImage(ciImage: image)
    }
}

分離アーキテクチャ

PHContentEditingControllerは編集インターフェースを保存ロジックから分離します。メインのiOSプロセスがbeginContentEditingを呼び出し、拡張機能が自身のUIを表示し、ユーザーが変更を加え、finishContentEditingが新しいファイルを生成します。Appleは、インターフェースをブロックしないように、メインスレッドではなくバックグラウンドスレッドでCIFilterフィルターやCore Image操作などのリソース集中型の処理をすべて実行することを推奨しています。

AdjustmentDataによる非破壊編集

PHAdjustmentDataはPhoto Editing Extensionで非破壊編集を可能にする主要なメカニズムです。これは任意の形式で適用された変更に関する情報を含むオブジェクトです。拡張機能はフィルターパラメータ、マスク、設定をAdjustmentDataにシリアライズし、変更された画像とともに保存します。

写真を再度開くと、拡張機能はAdjustmentDataを読み取り、前回のインターフェース状態を復元し、ユーザーが同じ場所から編集を続行できるようにします。拡張機能がインストールされていない場合、写真は最後に保存されたバージョンで表示され、オリジナルは別に保存されます。

Appleのドキュメントによると、PHAdjustmentDataはformatIdentifierとformatVersion(データ形式を識別するための文字列)を保存します。拡張機能を更新する際は、バージョンを確認し、古い形式を適切に処理する必要があります。

swift
let adjustmentData = PHAdjustmentData(
    formatIdentifier: "com.example.photoediting",
    formatVersion: "1.0",
    data: NSKeyedArchiver.archivedData(
        withRootObject: params,
        requiringSecureCoding: true
    )
)
output.adjustmentData = adjustmentData

finishContentEditingの時点で、拡張機能は変更された画像ファイルとともにPHContentEditingOutputオブジェクトにAdjustmentDataを書き込みます。システムは両方のコンポーネント(表示用のバージョンと編集セッション復元用のメタデータ)を保存します。

写真アプリとの統合

Photo Editing Extensionは、それを含むアプリをインストールすると自動的に写真アプリのメニューに表示されます。ユーザーが写真を開き、編集を選択すると、ツールの下部行にシステムとサードパーティの両方のインストール済み編集拡張機能がすべて表示されます。

拡張機能の登録

拡張機能はメインアプリのInfo.plistでNSExtensionActivationRuleキーを使用して登録され、どのタイプのコンテンツが拡張機能をアクティブにするかを指定します。写真エディタの場合、ActivationRuleは通常imageを必要とします — 拡張機能はビデオやLive Photosには表示されません。

Appleは編集メニューを過負荷にしないように、具体的なアクティベーションタイプを指定することを推奨しています。拡張機能がJPEGとHEICのみをサポートする場合、アクティベーションをこれらの形式に制限する価値があります。

xml
<!-- Info.plist -->
<key>NSExtension</key>
<dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.photo-editing</string>
    <key>NSExtensionActivationRule</key>
    <string>SUBQUERY (extensionItems,
        @count <= 1)</string>
</dict>

ユーザーとのインタラクション

拡張機能を選択すると、iOSは写真インターフェースの上に表示されるカスタムUIViewControllerを持つ別のプロセスを作成します。ユーザーは自分の写真、拡張機能のツール、キャンセル/完了ボタンを見ることができます。拡張機能は自身のコントローラの外側のナビゲーションを変更したり、システムの他の部分にアクセスしたりすることはできません。

Appleのヒューマンインターフェースガイドラインによると、拡張機能のインターフェースは最小限で機能的であるべきです — 広告、無関係なリンク、不要なナビゲーション要素は避けるべきです。画面を乱雑にしないように、ツールパレットを表示するにはUIScrollViewを使用することをお勧めします。

よくある質問

Photo Editing Extensionはどのように写真にアクセスしますか?

拡張機能はbeginContentEditing(with:)メソッドを通じて完全な画像ファイルのURLを含むPHContentEditingInputを受け取ります。アクセスは選択された1枚の写真にのみ許可されます — 他のライブラリリソースへの権限はありません。

拡張機能は元の写真を変更できますか?

いいえ、オリジナルが変更されることは決してありません。拡張機能はPHContentEditingOutputを通じて新しいバージョンを作成し、AdjustmentDataが元の状態に戻すための変更パラメータを保存します。

Photo Editing Extensionはどのファイルタイプをサポートしていますか?

拡張機能はPhotoKitがサポートするすべての形式(JPEG、HEIC、RAW、PNG、TIFF、Live Photos)で動作します。制限は拡張機能のInfo.plistのNSExtensionActivationRuleを通じて設定されます。

編集にどれくらいの時間が与えられますか?

iOSはfinishContentEditing操作に最大30秒を割り当てます。制限を超えると、拡張機能は強制終了され、変更は保存されません。CIFilterによるバックグラウンド処理はこの時間を延長しません。

拡張機能でCore ImageとMetalを使用できますか?

はい、Core Image(CIFilter)とMetal(カスタムシェーダー用)は完全にサポートされています。AppleはGrand Central Dispatchを使用して、重い計算をバックグラウンドスレッドにオフロードすることを推奨しています。

まとめ

  • Photo Editing Extensionは、アプリを切り替えることなく写真アプリ内で動作する埋め込み可能な編集ツールです
  • アーキテクチャはPHContentEditingControllerを使用して編集セッションを管理し、入力データを受け取ります
  • PhotoKitはデバイスのメディアリソースにアクセスするためのPHAsset、PHImageManager、PHContentEditingInputを提供します
  • PHAdjustmentDataは非破壊編集を可能にします — ロールバック機能を備えた変更パラメータのシリアライズ
  • 拡張機能はサンドボックス内で実行され、30秒の制限とセッションごとに1枚の写真のみへのアクセスが可能です
  • Core Image、Metal、およびすべてのPhotoKit形式(JPEG、HEIC、RAW、PNG、TIFF、Live Photos)をサポートしています

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください