From 7b7d91a5e18459d306938b59f800d3b3ac3c07cf Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 15 Oct 2025 12:36:52 -0500 Subject: [PATCH] fix: get all assets for the Recents album on iOS (#22956) --- mobile/ios/Runner.xcodeproj/project.pbxproj | 8 -------- mobile/ios/Runner/Sync/MessagesImpl.swift | 21 ++++++++++++++++----- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index 92306acb29..3f00b6c6aa 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -530,14 +530,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; @@ -566,14 +562,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; diff --git a/mobile/ios/Runner/Sync/MessagesImpl.swift b/mobile/ios/Runner/Sync/MessagesImpl.swift index c9f58398b6..75981fb7ea 100644 --- a/mobile/ios/Runner/Sync/MessagesImpl.swift +++ b/mobile/ios/Runner/Sync/MessagesImpl.swift @@ -103,7 +103,9 @@ class NativeSyncApiImpl: ImmichPlugin, NativeSyncApi, FlutterPlugin { let options = PHFetchOptions() options.sortDescriptors = [NSSortDescriptor(key: "modificationDate", ascending: false)] options.includeHiddenAssets = false - let assets = PHAsset.fetchAssets(in: album, options: options) + + let assets = getAssetsFromAlbum(in: album, options: options) + let isCloud = album.assetCollectionSubtype == .albumCloudShared || album.assetCollectionSubtype == .albumMyPhotoStream var domainAlbum = PlatformAlbum( @@ -201,7 +203,7 @@ class NativeSyncApiImpl: ImmichPlugin, NativeSyncApi, FlutterPlugin { let options = PHFetchOptions() options.predicate = NSPredicate(format: "localIdentifier IN %@", assets.map(\.id)) options.includeHiddenAssets = false - let result = PHAsset.fetchAssets(in: album, options: options) + let result = self.getAssetsFromAlbum(in: album, options: options) result.enumerateObjects { (asset, _, _) in albumAssets[asset.localIdentifier, default: []].append(album.localIdentifier) } @@ -219,7 +221,7 @@ class NativeSyncApiImpl: ImmichPlugin, NativeSyncApi, FlutterPlugin { var ids: [String] = [] let options = PHFetchOptions() options.includeHiddenAssets = false - let assets = PHAsset.fetchAssets(in: album, options: options) + let assets = getAssetsFromAlbum(in: album, options: options) assets.enumerateObjects { (asset, _, _) in ids.append(asset.localIdentifier) } @@ -236,7 +238,7 @@ class NativeSyncApiImpl: ImmichPlugin, NativeSyncApi, FlutterPlugin { let options = PHFetchOptions() options.predicate = NSPredicate(format: "creationDate > %@ OR modificationDate > %@", date, date) options.includeHiddenAssets = false - let assets = PHAsset.fetchAssets(in: album, options: options) + let assets = getAssetsFromAlbum(in: album, options: options) return Int64(assets.count) } @@ -253,7 +255,7 @@ class NativeSyncApiImpl: ImmichPlugin, NativeSyncApi, FlutterPlugin { options.predicate = NSPredicate(format: "creationDate > %@ OR modificationDate > %@", date, date) } - let result = PHAsset.fetchAssets(in: album, options: options) + let result = getAssetsFromAlbum(in: album, options: options) if(result.count == 0) { return [] } @@ -375,4 +377,13 @@ class NativeSyncApiImpl: ImmichPlugin, NativeSyncApi, FlutterPlugin { PHAssetResourceManager.default().cancelDataRequest(requestId) }) } + + private func getAssetsFromAlbum(in album: PHAssetCollection, options: PHFetchOptions) -> PHFetchResult { + // Ensure to actually getting all assets for the Recents album + if (album.assetCollectionSubtype == .smartAlbumUserLibrary) { + return PHAsset.fetchAssets(with: options) + } else { + return PHAsset.fetchAssets(in: album, options: options) + } + } }