Photo Editing Extension — je mechanismus iOS, který umožňuje aplikacím třetích stran přidávat nástroje pro úpravy přímo do systémové aplikace Fotky. Na rozdíl od plnohodnotných editorů rozšíření nenačítá snímek do samostatné aplikace — uživatel aplikuje filtry, koriguje barvy nebo přidává efekty, aniž by opouštěl standardní rozhraní. Podle Apple Developer Documentation (2025) poskytuje PhotoKit více než 40 API pro práci s fotografickými zdroji, včetně PHAdjustmentData a PHContentEditingController.
Hlavní body
Photo Editing Extension — je typ rozšíření aplikace v iOS, které zavádí nástroje pro zpracování obrázků do standardního rozhraní aplikace Fotky. Uživatel otevře snímek, stiskne tlačítko „Upravit“ a vybere požadované rozšíření ze seznamu nainstalovaných. Po úpravě je výsledek uložen zpět do knihovny a původní soubor zůstává k dispozici pro obnovení.
Taková architektura řeší klíčový problém uživatelské zkušenosti: není třeba přepínat mezi aplikacemi, exportovat a importovat obrázky ani sledovat verze. Podle WWDC 2025 všechna rozšíření pracují v izolovaném procesu s vlastním sandboxem a omezenou dobou provádění — až 30 sekund na operaci úpravy.
Rozšíření nemá přístup k libovolným souborům v paměti zařízení — pouze k tomu snímku, který uživatel explicitně předal přes rozhraní výběru. To zajišťuje bezpečnost uživatelských dat při používání nástrojů třetích stran.
PhotoKit — je framework Apple pro práci s mediální knihovnou zařízení, který se objevil v iOS 8. Poskytuje programový přístup ke zdrojům Fotek, včetně snímků, videí, alb a metadat. Pro rozšíření pro úpravy slouží PhotoKit jako mezivrstva mezi úložištěm a rozhraním pro úpravy.
PHAsset představuje jednotlivý mediální objekt v knihovně — fotografii nebo video. Prostřednictvím PHAsset lze získat metadata: datum pořízení, typ souboru, polohu na mapě a orientaci kamery. PHAssetResource poskytuje přístup k základním zdrojům — například k původnímu souboru snímku ve formátu RAW nebo HEIC.
Pro rozšíření pro úpravy je kriticky důležitý PHContentEditingInput — objekt, který obsahuje kompletní soubor obrázku (nebo videa) dostupný pro čtení a zpracování. Rozšíření získává tento objekt v okamžiku aktivace a používá jej jako zdrojový materiál.
PHImageManager spravuje načítání a ukládání obrázků do mezipaměti. Pro rozšíření pro úpravy se nepoužívá přímo — rozšíření získává kompletní soubor přes PHContentEditingInput. PHImageRequestOptions však umožňuje konfigurovat parametry požadavku: velikost, typ doručení (synchronní nebo asynchronní) a formát výsledku.
Podle Apple PHImageManager automaticky ukládá miniatury obrázků do paměti RAM, což urychluje opětovné zobrazení náhledů. Pro rozšíření pro úpravy se doporučuje používat PHImageRequestOptionsDeliveryModeHighQualityFormat pro dosažení nejlepší kvality snímku.
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
// použijte obrázek pro zobrazení
}
Každé Photo Editing Extension implementuje protokol PHContentEditingController — centrální prvek řízení rozšíření. Protokol definuje metody pro zobrazení rozhraní, získání vstupních dat a uložení výsledku.
beginContentEditing(with:) se volá při spuštění relace úprav. Rozšíření obdrží PHContentEditingInput a musí zobrazit rozhraní s původním obrázkem. finishContentEditing(completionHandler:) dokončí úpravy — rozšíření vrátí PHContentEditingOutput s upraveným souborem a AdjustmentData. cancelContentEditing() zruší změny bez uložení.
Důležitá nuance: v okamžiku volání beginContentEditing má rozšíření přístup pouze k jedné verzi snímku — té, kterou uživatel požadoval. Nelze přistupovat k jinému snímku nebo albu. Toto je omezení sandboxu zavedené Apple pro bezpečnost.
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 odděluje rozhraní pro úpravy od logiky ukládání. Hlavní proces iOS volá beginContentEditing, rozšíření zobrazí své UI, uživatel provede změny, poté finishContentEditing vygeneruje nový soubor. Apple doporučuje veškeré náročné zpracování — filtry CIFilter, manipulace s Core Image — provádět na pozadí, nikoli v hlavním vlákně, aby nedocházelo k blokování rozhraní.
PHAdjustmentData — klíčový mechanismus zajišťující nedestruktivní úpravy v Photo Editing Extension. Je to objekt obsahující informace o provedených změnách v libovolném formátu. Rozšíření serializuje parametry filtrů, masky a nastavení do AdjustmentData a ukládá je spolu s upraveným obrázkem.
Při opětovném otevření snímku rozšíření načte AdjustmentData, obnoví předchozí stav rozhraní a umožní uživateli pokračovat v úpravách od stejného místa. Pokud rozšíření není nainstalováno — snímek se zobrazí v poslední uložené verzi a originál je uložen samostatně.
Podle Apple Documentation ukládá PHAdjustmentData formatIdentifier a formatVersion — řetězce pro identifikaci formátu dat. Při aktualizaci rozšíření je třeba zkontrolovat verzi a správně zpracovat staré formáty.
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
V okamžiku finishContentEditing zapisuje rozšíření AdjustmentData do objektu PHContentEditingOutput spolu s upraveným souborem obrázku. Systém poté uloží obě složky: verzi pro zobrazení a metadata pro obnovení relace úprav.
Photo Editing Extension se automaticky objeví v nabídce aplikace Fotky po instalaci aplikace, která jej obsahuje. Uživatel otevře snímek, vybere „Upravit“ a ve spodní řadě nástrojů se zobrazí všechna nainstalovaná rozšíření pro úpravy — jak systémová, tak od třetích stran.
Rozšíření se registruje prostřednictvím Info.plist hlavní aplikace s klíčem NSExtensionActivationRule, který určuje, jaké typy obsahu rozšíření aktivují. Pro editor fotografií ActivationRule obvykle vyžaduje image — rozšíření se nezobrazí pro videa nebo živé fotografie.
Apple doporučuje uvádět konkrétní typy aktivace, aby nedošlo k přetížení nabídky úprav. Pokud rozšíření podporuje pouze JPEG a HEIC, vyplatí se omezit aktivaci na tyto formáty.
<!-- 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>
Po výběru rozšíření iOS vytvoří samostatný proces s vlastním UIViewController, který se zobrazí nad rozhraním Fotek. Uživatel vidí svůj snímek, nástroje rozšíření a tlačítka „Zrušit“ / „Hotovo“. Rozšíření nemůže změnit navigaci mimo svůj controller ani získat přístup k jiným částem systému.
Podle Human Interface Guidelines od Apple by rozhraní rozšíření mělo být minimální a funkční — bez reklam, externích odkazů a zbytečných navigačních prvků. Doporučuje se používat UIScrollView pro zobrazení palety nástrojů, aby nedocházelo k přeplnění obrazovky.
Často kladené otázky
Rozšíření obdrží PHContentEditingInput s URL kompletního souboru obrázku prostřednictvím metody beginContentEditing(with:). Přístup je poskytnut pouze k jednomu vybranému snímku — bez práv k ostatním zdrojům knihovny.
Ne, originál není nikdy měněn. Rozšíření vytváří novou verzi prostřednictvím PHContentEditingOutput a AdjustmentData uchovává parametry změn pro možnost návratu k původnímu stavu.
Rozšíření pracuje se všemi formáty, které podporuje PhotoKit: JPEG, HEIC, RAW, PNG, TIFF a Live Photos. Omezení se nastavují prostřednictvím NSExtensionActivationRule v Info.plist rozšíření.
iOS přiděluje až 30 sekund na provedení operace finishContentEditing. Při překročení limitu je rozšíření násilně ukončeno a změny nejsou uloženy. Zpracování na pozadí s CIFilter tento čas neprodlužuje.
Ano, Core Image (CIFilter) a Metal (pro vlastní shadery) jsou plně podporovány. Apple doporučuje přesouvat náročné výpočty do vláken na pozadí prostřednictvím Grand Central Dispatch.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také