PHPhotoLibrary.performChanges completionHandler not called when deleting assets on iOS 26

In my app, I use api provided in Photos framework to delete specified photo.

But after upgrading to iOS 26, the delete function in some iOS device no longer work.

The api will never triggers the system confirmation dialog, and the completionHandler is never called.

In the iOS Photos app, deletion works correctly on the same assets, but calling the API from my app does not work.

Steps to Reproduce

  • Make sure the app has Full Photo Library Access.
  • Execute the following code:
PHPhotoLibrary.shared().performChanges({
    let assetsToBeDeleted = PHAsset.fetchAssets(withLocalIdentifiers: delUrls, options: nil)
    PHAssetChangeRequest.deleteAssets(assetsToBeDeleted)
}, completionHandler: completionHandler)

Expected Behavior

  • The system should present a confirmation dialog asking the user to delete the selected photos.
  • After the user confirms, the deletion should occur, and the completionHandler should be called with success or error.

Actual Behavior

  • The system delete confirmation dialog does not appear.
  • The completionHandler is never called.

Environment

  • iOS Versions: 26.1 / 26.0.1

It looks like api bug. I want to check Is it a know issue and will be fixed. Thanks

Are you able to reproduce this in a small test application? If so that would be great to attach to a Feedback. There have not been widespread reports of this API not working on iOS 26.

In your specific code snippet, how are you populating the delURLs for the local identifiers. Have you confirmed that that fetch is returning assets?

Thanks for the follow-up.

The issue is currently observed on my user devices (only 3 users not all users are affected). Since I don’t have direct access to these devices, it’s difficult to install and test with a sample app. However, based on the app logs, I can confirm that the API was executed but the completionHandler was never called.

I’ve also noticed similar reports from other apps related to iOS 26, for example: https://support.google.com/photos/thread/380562887/cannot-delete-photos-directly-from-device-ios26?hl=en

For delUrls, the name might be a bit misleading, but it’s simply an array of PHAsset.localIdentifiers, and the format appears normal in the logs.

Even if the localIdentifiers were invalid, I expect that the completionHandler should still be invoked with an error rather than never being called at all.

We hit exactly this on iOS 18.6 (iPhone 15 Pro), and for us the trigger turned out to be very specific — maybe it helps narrow down the affected devices.

deleteAssets never presents the confirmation and never calls the completion handler, and afterwards every change request in that process — including PHAssetCreationRequest for new captures — is stuck behind it until the app is relaunched. Our users reported it as "deleting a photo stops the camera from saving anything".

The assets that wedge are 48 MP Apple ProRAW frames our camera saved WITHOUT an embedded JPEG preview. On the same device and the same library, deleting HEIC assets, or ProRAW assets that do carry a preview, presents the dialog instantly.

The fix on our side was to request the embedded preview at capture time:

if settings.availableRawEmbeddedThumbnailPhotoCodecTypes.contains(.jpeg) {
  settings.rawEmbeddedThumbnailPhotoFormat = [
    AVVideoCodecKey: AVVideoCodecType.jpeg,
    AVVideoWidthKey: 4032,
    AVVideoHeightKey: 3024,
  ]
}

Two caveats worth knowing:

  • Do not request the preview at full sensor resolution (8064x6048): on 18.6 that silently drops the whole capture to 12 MP (rawPhotoDimensions comes back 4032x3024, no error anywhere).
  • Assets already saved without a preview stay undeletable from third-party apps. They can still be removed from within the Photos app.

Even with the workaround this looks like a bug worth fixing: a missing preview should not deadlock the deletion path. The API should present the dialog, however slowly, or fail with an error — not hang forever and block every later library change in the process.

Filed as FB24503330, with a minimal sample project attached (one Swift file, plain AVCapturePhotoOutput + PhotoKit, no dependencies) that captures a frame in a chosen combination, saves it, and deletes it — it reproduces the hang on demand.

Hello,

This is an issue we're aware of (FB18720533), but we're not aware of any recommended workaround so far. @Kirill_A, thank you for demonstrating yours! If anyone else finds other methods that help you avoid the issue, please share it with the community by posting it here.

Even though we're aware of this issue, we still encourage you to open a bug report, and post the FB number here once you do. The specific info you include your bug report might help our investigation, and filing the bug report you to get notified when it is resolved.

Bug Reporting: How and Why? explains how you can open a bug report.

Cordially,

Richard Yeh  Developer Technical Support

PHPhotoLibrary.performChanges completionHandler not called when deleting assets on iOS 26
 
 
Q