How to share PHAsset with UIActivityViewController like Photos App?

I am building an app about photos and I want to create a photo sharing feature like Apple's Photos App.

Please see Steps to Reproduce and attached project.

The current share method has the following issues

  • The file name of the shared photo changes to “FullSizeRender”.
  • The creation and update dates of shared photos will change to the date they were edited or shared.

I want to ensure that the following conditions are definitely met

  • Share the latest edited version.
  • The creation date should be when the original photo was first created.

How can I improve the code?

STEPS TO REPRODUCE


class PHAssetShareManager {
    static func shareAssets(_ assets: [PHAsset], from viewController: UIViewController, sourceView: UIView) {
        let manager = PHAssetResourceManager.default()
        var filesToShare: [URL] = []
        let group = DispatchGroup()
        
        for asset in assets {
            group.enter()
            getAssetFile(asset, resourceManager: manager) { fileURL in
                if let fileURL = fileURL {
                    filesToShare.append(fileURL)
                }
                group.leave()
            }
        }
        
        group.notify(queue: .main) {
            self.presentShareSheet(filesToShare, from: viewController, sourceView: sourceView)
        }
    }
    
    private static func getAssetFile(_ asset: PHAsset, resourceManager: PHAssetResourceManager, completion: @escaping (URL?) -> Void) {
        print("getAssetFile")
        let resources: [PHAssetResource]
        
        switch asset.mediaType {
        case .image:
            if asset.mediaSubtypes.contains(.photoLive) {
//                let editedResources = PHAssetResource.assetResources(for: asset).filter { $0.type == .fullSizePairedVideo }
//                let originalResources = PHAssetResource.assetResources(for: asset).filter { $0.type == .pairedVideo }
                let editedResources = PHAssetResource.assetResources(for: asset).filter { $0.type == .fullSizePhoto }
                let originalResources = PHAssetResource.assetResources(for: asset).filter { $0.type == .photo }
                resources = editedResources.isEmpty ? originalResources : editedResources
            } else {
                let editedResources = PHAssetResource.assetResources(for: asset).filter { $0.type == .fullSizePhoto }
                let originalResources = PHAssetResource.assetResources(for: asset).filter { $0.type == .photo }
                resources = editedResources.isEmpty ? originalResources : editedResources
            }
        case .video:
            let editedResources = PHAssetResource.assetResources(for: asset).filter { $0.type == .fullSizeVideo }
            let originalResources = PHAssetResource.assetResources(for: asset).filter { $0.type == .video }
            resources = editedResources.isEmpty ? originalResources : editedResources
        default:
            print("Unsupported media type")
            completion(nil)
            return
        }
        
        guard let resource = resources.first else {
            print("No resource found")
            completion(nil)
            return
        }
        
        let fileName = resource.originalFilename
        let tempDirectoryURL = FileManager.default.temporaryDirectory
        let localURL = tempDirectoryURL.appendingPathComponent(fileName)
        
        // Delete existing files and reset cache
        if FileManager.default.fileExists(atPath: localURL.path) {
            do {
                try FileManager.default.removeItem(at: localURL)
            } catch {
                print("Error removing existing file: \(error)")
            }
        }
        
        let options = PHAssetResourceRequestOptions()
        options.isNetworkAccessAllowed = true
        
        resourceManager.writeData(for: resource, toFile: localURL, options: options) { (error) in
            if let error = error {
                print("Error writing asset data: \(error)")
                completion(nil)
            } else {
                completion(localURL)
            }
        }
    }
    
    private static func presentShareSheet(_ items: [Any], from viewController: UIViewController, sourceView: UIView) {
        print("presentShareSheet")
        let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil)
        if UIDevice.current.userInterfaceIdiom == .pad {
            activityViewController.popoverPresentationController?.sourceView = sourceView
            activityViewController.popoverPresentationController?.sourceRect = sourceView.bounds
        }
        viewController.present(activityViewController, animated: true, completion: nil)
    }
}```

How to share PHAsset with UIActivityViewController like Photos App?
 
 
Q