Photo Editing Extension é um mecanismo do iOS que permite que aplicativos de terceiros adicionem ferramentas de edição diretamente no aplicativo Fotos do sistema. Ao contrário de editores completos, a extensão não carrega a foto em um aplicativo separado — o usuário aplica filtros, ajusta cores ou adiciona efeitos sem sair da interface padrão. De acordo com a Documentação para Desenvolvedores da Apple (2025), o PhotoKit fornece mais de 40 APIs para trabalhar com recursos fotográficos, incluindo PHAdjustmentData e PHContentEditingController.
Principais Pontos
Photo Editing Extension é um tipo de extensão de aplicativo no iOS que incorpora ferramentas de processamento de imagem na interface padrão do aplicativo Fotos. O usuário abre uma foto, pressiona o botão Editar e seleciona a extensão desejada na lista de instaladas. Após a edição, o resultado é salvo de volta na biblioteca e o arquivo original permanece disponível para reversão.
Esta arquitetura resolve um problema chave da experiência do usuário: não há necessidade de alternar entre aplicativos, exportar e importar imagens ou acompanhar versões. De acordo com a WWDC 2025, todas as extensões funcionam em um processo isolado com sua própria sandbox e tempo de execução limitado — até 30 segundos por operação de edição.
A extensão não tem acesso a arquivos arbitrários na memória do dispositivo — apenas à foto que o usuário passou explicitamente através da interface de seleção. Isso garante a segurança dos dados do usuário ao usar ferramentas de terceiros.
PhotoKit é um framework da Apple para trabalhar com a biblioteca de mídia do dispositivo, introduzido no iOS 8. Ele fornece acesso programático aos recursos do Fotos, incluindo imagens, vídeos, álbuns e metadados. Para extensões de edição, o PhotoKit serve como uma camada intermediária entre o armazenamento e a interface de modificação.
PHAsset representa um objeto de mídia individual na biblioteca — uma foto ou vídeo. Através do PHAsset, é possível obter metadados: data de captura, tipo de arquivo, localização no mapa e orientação da câmera. O PHAssetResource fornece acesso aos recursos subjacentes — por exemplo, ao arquivo de foto original no formato RAW ou HEIC.
Para uma extensão de edição, o PHContentEditingInput é de vital importância — um objeto que contém o arquivo completo de imagem (ou vídeo) disponível para leitura e processamento. A extensão recebe este objeto no momento da ativação e o utiliza como material de origem.
PHImageManager gerencia o carregamento e cache de imagens. Para uma extensão de edição, ele não é usado diretamente — a extensão recebe o arquivo completo através do PHContentEditingInput. No entanto, o PHImageRequestOptions permite configurar parâmetros de solicitação: tamanho, tipo de entrega (síncrona ou assíncrona) e formato do resultado.
De acordo com a Apple, o PHImageManager armazena automaticamente em cache as miniaturas de imagens na RAM, o que acelera a exibição repetida de pré-visualizações. Para extensões de edição, é recomendado usar PHImageRequestOptionsDeliveryModeHighQualityFormat para obter a melhor qualidade de imagem.
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
}
Cada Photo Editing Extension implementa o protocolo PHContentEditingController — o elemento central de controle da extensão. O protocolo define métodos para exibir a interface, receber dados de entrada e salvar o resultado.
beginContentEditing(with:) é chamado quando a sessão de edição começa. A extensão recebe PHContentEditingInput e deve exibir a interface com a imagem original. finishContentEditing(completionHandler:) finaliza a edição — a extensão retorna PHContentEditingOutput com o arquivo modificado e AdjustmentData. cancelContentEditing() cancela as alterações sem salvar.
Uma nuance importante: no momento da chamada beginContentEditing, a extensão obtém acesso apenas a uma versão da foto — aquela que foi solicitada pelo usuário. Ela não pode acessar outra foto ou álbum. Esta é uma restrição de sandbox introduzida pela Apple por segurança.
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 separa a interface de edição da lógica de salvamento. O processo principal do iOS chama beginContentEditing, a extensão mostra sua UI, o usuário faz alterações, então finishContentEditing gera um novo arquivo. A Apple recomenda realizar todo o processamento intensivo em recursos — filtros CIFilter, manipulações Core Image — em uma thread em segundo plano, não na principal, para não bloquear a interface.
PHAdjustmentData é o mecanismo chave que possibilita a edição não destrutiva no Photo Editing Extension. É um objeto que contém informações sobre as alterações aplicadas em um formato arbitrário. A extensão serializa parâmetros de filtros, máscaras e configurações em AdjustmentData e os salva junto com a imagem modificada.
Ao reabrir a foto, a extensão lê o AdjustmentData, restaura o estado anterior da interface e permite que o usuário continue a edição do mesmo ponto. Se a extensão não estiver instalada, a foto é exibida na última versão salva, enquanto o original é armazenado separadamente.
De acordo com a Documentação da Apple, PHAdjustmentData armazena formatIdentifier e formatVersion — strings para identificar o formato dos dados. Ao atualizar a extensão, você deve verificar a versão e manipular corretamente os formatos antigos.
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
No momento do finishContentEditing, a extensão escreve AdjustmentData no objeto PHContentEditingOutput junto com o arquivo de imagem modificado. O sistema então salva ambos os componentes: a versão para exibição e os metadados para restaurar a sessão de edição.
A Photo Editing Extension aparece automaticamente no menu do aplicativo Fotos após instalar o aplicativo que a contém. O usuário abre uma foto, seleciona Editar, e na fileira inferior de ferramentas são exibidas todas as extensões de edição instaladas — tanto do sistema quanto de terceiros.
A extensão é registrada através do Info.plist do aplicativo principal com a chave NSExtensionActivationRule, que especifica quais tipos de conteúdo ativam a extensão. Para um editor de fotos, o ActivationRule geralmente requer image — a extensão não aparecerá para vídeos ou Live Photos.
A Apple recomenda especificar tipos de ativação concretos para não sobrecarregar o menu de edição. Se a extensão suporta apenas JPEG e HEIC, vale a pena limitar a ativação a esses formatos.
<!-- 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>
Após selecionar uma extensão, o iOS cria um processo separado com um UIViewController personalizado que é exibido sobre a interface do Fotos. O usuário vê sua foto, as ferramentas da extensão e os botões Cancelar/Concluído. A extensão não pode alterar a navegação fora do seu próprio controlador nem acessar outras partes do sistema.
De acordo com as Diretrizes de Interface Humana da Apple, a interface da extensão deve ser mínima e funcional — sem anúncios, links estranhos ou elementos de navegação desnecessários. É recomendado usar UIScrollView para exibir a paleta de ferramentas e não sobrecarregar a tela.
Perguntas Frequentes
A extensão recebe PHContentEditingInput com o URL do arquivo de imagem completo através do método beginContentEditing(with:). O acesso é concedido apenas a uma foto selecionada — sem direitos sobre outros recursos da biblioteca.
Não, o original nunca é modificado. A extensão cria uma nova versão através do PHContentEditingOutput, e o AdjustmentData armazena os parâmetros das alterações para a capacidade de reverter ao estado original.
A extensão funciona com todos os formatos que o PhotoKit suporta: JPEG, HEIC, RAW, PNG, TIFF e Live Photos. As limitações são definidas através do NSExtensionActivationRule no Info.plist da extensão.
O iOS aloca até 30 segundos para a operação finishContentEditing. Se o limite for excedido, a extensão é encerrada à força e as alterações não são salvas. O processamento em segundo plano com CIFilter não prolonga este tempo.
Sim, Core Image (CIFilter) e Metal (para shaders personalizados) são totalmente suportados. A Apple recomenda descarregar cálculos pesados para threads em segundo plano através do Grand Central Dispatch.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também