From 8d7232450b44860ea3e6f4a8684f0bc4c6754b12 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Tue, 11 Aug 2026 20:47:31 -0400 Subject: [PATCH 1/3] [Photos] Update bindings up to Xcode 27.0 Beta 5 Bind the new asset-resource upload job options and photo-library configuration APIs introduced in Xcode 27 beta 5 for iOS, macOS, and Mac Catalyst. Update PHAsset and PHAssetResource nullability, filename, and deprecation metadata. Restore the legacy upload-job setter to its header-declared iOS-only availability, remove the resolved Photos xtro todo files, and update the cecil documentation baseline for the new public API surface. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 91ab847a-8bef-4f4b-9e3d-a617eadca998 --- src/photos.cs | 36 +++++++++++++++++-- .../Documentation.KnownFailures.txt | 7 ++++ .../MacCatalyst-Photos.todo | 10 ------ .../api-annotations-dotnet/iOS-Photos.todo | 11 ------ .../api-annotations-dotnet/macOS-Photos.todo | 10 ------ .../api-annotations-dotnet/tvOS-Photos.todo | 3 -- 6 files changed, 41 insertions(+), 36 deletions(-) delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-Photos.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/iOS-Photos.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/macOS-Photos.todo delete mode 100644 tests/xtro-sharpie/api-annotations-dotnet/tvOS-Photos.todo diff --git a/src/photos.cs b/src/photos.cs index e9219230f46..094deb5f024 100644 --- a/src/photos.cs +++ b/src/photos.cs @@ -188,7 +188,7 @@ interface PHAsset { UTType ContentType { get; } [TV (26, 0), Mac (26, 0), iOS (26, 0), MacCatalyst (26, 0)] - [Export ("addedDate", ArgumentSemantic.Strong)] + [NullAllowed, Export ("addedDate", ArgumentSemantic.Strong)] NSDate AddedDate { get; } [TV (27, 0), Mac (27, 0), iOS (27, 0), MacCatalyst (27, 0)] @@ -347,9 +347,17 @@ interface PHAssetResource { [Export ("uniformTypeIdentifier")] string UniformTypeIdentifier { get; } + [Deprecated (PlatformName.iOS, 27, 0, message: "Use 'Filename' instead.")] + [Deprecated (PlatformName.MacOSX, 27, 0, message: "Use 'Filename' instead.")] + [Deprecated (PlatformName.TvOS, 27, 0, message: "Use 'Filename' instead.")] + [Deprecated (PlatformName.MacCatalyst, 27, 0, message: "Use 'Filename' instead.")] [Export ("originalFilename")] string OriginalFilename { get; } + [TV (27, 0), Mac (27, 0), iOS (27, 0), MacCatalyst (27, 0)] + [NullAllowed, Export ("filename", ArgumentSemantic.Copy)] + string Filename { get; } + [Static] [Export ("assetResourcesForAsset:")] PHAssetResource [] GetAssetResources (PHAsset forAsset); @@ -1532,9 +1540,26 @@ interface PHPhotoLibrary { [Export ("uploadJobExtensionEnabled")] bool UploadJobExtensionEnabled { [Bind ("isUploadJobExtensionEnabled")] get; } - [NoTV, Mac (27, 0), iOS (26, 1), MacCatalyst (27, 0)] + [NoTV, NoMacCatalyst, NoMac, iOS (26, 1)] + [Deprecated (PlatformName.iOS, 27, 0, message: "Use 'EnableUploadJobExtension' and 'DisableUploadJobExtension' instead.")] [Export ("setUploadJobExtensionEnabled:error:")] bool SetUploadJobExtensionEnabled (bool enable, [NullAllowed] out NSError error); + + [NoTV, Mac (27, 0), iOS (27, 0), MacCatalyst (27, 0)] + [Export ("enableUploadJobExtensionWithOptions:error:")] + bool EnableUploadJobExtension ([NullAllowed] PHAssetResourceUploadJobOptions options, [NullAllowed] out NSError error); + + [NoTV, Mac (27, 0), iOS (27, 0), MacCatalyst (27, 0)] + [Export ("disableUploadJobExtensionWithError:")] + bool DisableUploadJobExtension ([NullAllowed] out NSError error); + + [NoTV, Mac (27, 0), iOS (27, 0), MacCatalyst (27, 0)] + [NullAllowed, Export ("uploadJobExtensionOptions")] + PHAssetResourceUploadJobOptions UploadJobExtensionOptions { get; } + + [NoTV, Mac (27, 0), iOS (27, 0), MacCatalyst (27, 0)] + [Export ("setUploadJobExtensionOptions:error:")] + bool SetUploadJobExtensionOptions (PHAssetResourceUploadJobOptions options, [NullAllowed] out NSError error); } [TV (15, 0), iOS (15, 0), MacCatalyst (15, 0)] @@ -2036,6 +2061,13 @@ interface PHAssetExtendedMetadata { string [] Keywords { get; } } + [NoTV, Mac (27, 0), iOS (27, 0), MacCatalyst (27, 0)] + [BaseType (typeof (NSObject))] + interface PHAssetResourceUploadJobOptions : NSCopying { + [Export ("preventsExpensiveNetworkAccess")] + bool PreventsExpensiveNetworkAccess { get; set; } + } + [NoTV, Mac (27, 0), iOS (26, 1), MacCatalyst (27, 0)] [BaseType (typeof (PHObject))] [DisableDefaultCtor] diff --git a/tests/cecil-tests/Documentation.KnownFailures.txt b/tests/cecil-tests/Documentation.KnownFailures.txt index db301a7f838..09e4774ccf6 100644 --- a/tests/cecil-tests/Documentation.KnownFailures.txt +++ b/tests/cecil-tests/Documentation.KnownFailures.txt @@ -23887,6 +23887,8 @@ M:Photos.PHPersistentChangeFetchResult.EnumerateChanges(Photos.PHPersistentChang M:Photos.PHPhotoLibrary_CloudIdentifiers.GetCloudIdentifierMappings(Photos.PHPhotoLibrary,System.String[]) M:Photos.PHPhotoLibrary_CloudIdentifiers.GetLocalIdentifierMappings(Photos.PHPhotoLibrary,Photos.PHCloudIdentifier[]) M:Photos.PHPhotoLibrary_CloudIdentifiers.GetLocalIdentifierMappingsForSyncedCloudIdentifiers(Photos.PHPhotoLibrary,Photos.PHCloudIdentifier[]) +M:Photos.PHPhotoLibrary.DisableUploadJobExtension(Foundation.NSError@) +M:Photos.PHPhotoLibrary.EnableUploadJobExtension(Photos.PHAssetResourceUploadJobOptions,Foundation.NSError@) M:Photos.PHPhotoLibrary.FetchPersistentChanges(Photos.PHPersistentChangeToken,Foundation.NSError@) M:Photos.PHPhotoLibrary.GetAuthorizationStatus(Photos.PHAccessLevel) M:Photos.PHPhotoLibrary.PerformChanges(System.Action,System.Action{System.Boolean,Foundation.NSError}) @@ -23898,6 +23900,7 @@ M:Photos.PHPhotoLibrary.RequestAuthorization(Photos.PHAccessLevel,System.Action{ M:Photos.PHPhotoLibrary.RequestAuthorization(System.Action{Photos.PHAuthorizationStatus}) M:Photos.PHPhotoLibrary.RequestAuthorizationAsync(Photos.PHAccessLevel) M:Photos.PHPhotoLibrary.SetUploadJobExtensionEnabled(System.Boolean,Foundation.NSError@) +M:Photos.PHPhotoLibrary.SetUploadJobExtensionOptions(Photos.PHAssetResourceUploadJobOptions,Foundation.NSError@) M:Photos.PHPhotoLibrary.Unregister(Photos.IPHPhotoLibraryAvailabilityObserver) M:Photos.PHPhotoLibrary.UnregisterChangeObserver(Photos.IPHPhotoLibraryChangeObserver) M:Photos.PHPhotoLibrary.UnregisterPersistentChangesObserver(Photos.IPHPhotoLibraryPersistentChangesObserver) @@ -46809,6 +46812,7 @@ P:Photos.PHAssetExtendedMetadata.OriginalFilename P:Photos.PHAssetResource.AssetLocalIdentifier P:Photos.PHAssetResource.ContentType P:Photos.PHAssetResource.DataSize +P:Photos.PHAssetResource.Filename P:Photos.PHAssetResource.OriginalFilename P:Photos.PHAssetResource.PixelHeight P:Photos.PHAssetResource.PixelWidth @@ -46826,6 +46830,7 @@ P:Photos.PHAssetResourceUploadJob.JobLimit P:Photos.PHAssetResourceUploadJob.Resource P:Photos.PHAssetResourceUploadJob.State P:Photos.PHAssetResourceUploadJob.Type +P:Photos.PHAssetResourceUploadJobOptions.PreventsExpensiveNetworkAccess P:Photos.PHCachingImageManager.AllowsCachingHighQualityImages P:Photos.PHCloudIdentifier.ArchivalStringValue P:Photos.PHCloudIdentifier.NotFoundIdentifier @@ -46922,6 +46927,7 @@ P:Photos.PHPhotoLibrary.CurrentChangeToken P:Photos.PHPhotoLibrary.SharedPhotoLibrary P:Photos.PHPhotoLibrary.UnavailabilityReason P:Photos.PHPhotoLibrary.UploadJobExtensionEnabled +P:Photos.PHPhotoLibrary.UploadJobExtensionOptions P:Photos.PHProject.HasProjectPreview P:Photos.PHProject.ProjectExtensionData P:Photos.PHProjectChangeRequest.ProjectExtensionData @@ -59287,6 +59293,7 @@ T:Photos.PHAssetRating T:Photos.PHAssetResourceUploadJob T:Photos.PHAssetResourceUploadJobAction T:Photos.PHAssetResourceUploadJobChangeRequest +T:Photos.PHAssetResourceUploadJobOptions T:Photos.PHAssetResourceUploadJobState T:Photos.PHChangeRequest T:Photos.PHCloudIdentifier diff --git a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-Photos.todo b/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-Photos.todo deleted file mode 100644 index 2c24ad29c66..00000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/MacCatalyst-Photos.todo +++ /dev/null @@ -1,10 +0,0 @@ -!deprecated-attribute-missing! PHAssetResource::originalFilename missing a [Deprecated] attribute -!missing-null-allowed! 'Foundation.NSDate Photos.PHAsset::get_AddedDate()' is missing an [NullAllowed] on return type -!missing-selector! PHAssetResource::filename not bound -!missing-selector! PHAssetResourceUploadJobOptions::preventsExpensiveNetworkAccess not bound -!missing-selector! PHAssetResourceUploadJobOptions::setPreventsExpensiveNetworkAccess: not bound -!missing-selector! PHPhotoLibrary::disableUploadJobExtensionWithError: not bound -!missing-selector! PHPhotoLibrary::enableUploadJobExtensionWithOptions:error: not bound -!missing-selector! PHPhotoLibrary::setUploadJobExtensionOptions:error: not bound -!missing-selector! PHPhotoLibrary::uploadJobExtensionOptions not bound -!missing-type! PHAssetResourceUploadJobOptions not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/iOS-Photos.todo b/tests/xtro-sharpie/api-annotations-dotnet/iOS-Photos.todo deleted file mode 100644 index 0360c125693..00000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/iOS-Photos.todo +++ /dev/null @@ -1,11 +0,0 @@ -!deprecated-attribute-missing! PHAssetResource::originalFilename missing a [Deprecated] attribute -!deprecated-attribute-missing! PHPhotoLibrary::setUploadJobExtensionEnabled:error: missing a [Deprecated] attribute -!missing-null-allowed! 'Foundation.NSDate Photos.PHAsset::get_AddedDate()' is missing an [NullAllowed] on return type -!missing-selector! PHAssetResource::filename not bound -!missing-selector! PHAssetResourceUploadJobOptions::preventsExpensiveNetworkAccess not bound -!missing-selector! PHAssetResourceUploadJobOptions::setPreventsExpensiveNetworkAccess: not bound -!missing-selector! PHPhotoLibrary::disableUploadJobExtensionWithError: not bound -!missing-selector! PHPhotoLibrary::enableUploadJobExtensionWithOptions:error: not bound -!missing-selector! PHPhotoLibrary::setUploadJobExtensionOptions:error: not bound -!missing-selector! PHPhotoLibrary::uploadJobExtensionOptions not bound -!missing-type! PHAssetResourceUploadJobOptions not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/macOS-Photos.todo b/tests/xtro-sharpie/api-annotations-dotnet/macOS-Photos.todo deleted file mode 100644 index 2c24ad29c66..00000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/macOS-Photos.todo +++ /dev/null @@ -1,10 +0,0 @@ -!deprecated-attribute-missing! PHAssetResource::originalFilename missing a [Deprecated] attribute -!missing-null-allowed! 'Foundation.NSDate Photos.PHAsset::get_AddedDate()' is missing an [NullAllowed] on return type -!missing-selector! PHAssetResource::filename not bound -!missing-selector! PHAssetResourceUploadJobOptions::preventsExpensiveNetworkAccess not bound -!missing-selector! PHAssetResourceUploadJobOptions::setPreventsExpensiveNetworkAccess: not bound -!missing-selector! PHPhotoLibrary::disableUploadJobExtensionWithError: not bound -!missing-selector! PHPhotoLibrary::enableUploadJobExtensionWithOptions:error: not bound -!missing-selector! PHPhotoLibrary::setUploadJobExtensionOptions:error: not bound -!missing-selector! PHPhotoLibrary::uploadJobExtensionOptions not bound -!missing-type! PHAssetResourceUploadJobOptions not bound diff --git a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-Photos.todo b/tests/xtro-sharpie/api-annotations-dotnet/tvOS-Photos.todo deleted file mode 100644 index 81820e6a74e..00000000000 --- a/tests/xtro-sharpie/api-annotations-dotnet/tvOS-Photos.todo +++ /dev/null @@ -1,3 +0,0 @@ -!deprecated-attribute-missing! PHAssetResource::originalFilename missing a [Deprecated] attribute -!missing-null-allowed! 'Foundation.NSDate Photos.PHAsset::get_AddedDate()' is missing an [NullAllowed] on return type -!missing-selector! PHAssetResource::filename not bound From 346ef39ba4eef4d39e550e0202f89fcbbe2d1837 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Tue, 11 Aug 2026 23:04:45 -0400 Subject: [PATCH 2/3] [Photos] Preserve upload job setter compatibility Keep the beta 4 macOS and Mac Catalyst API shape for SetUploadJobExtensionEnabled while marking those accidental platform variants unavailable from platform inception. Queue their removal behind XAMCORE_5_0 so the binding matches the beta 5 headers in the next breaking release without failing the current API compatibility gate. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 91ab847a-8bef-4f4b-9e3d-a617eadca998 --- src/photos.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/photos.cs b/src/photos.cs index 094deb5f024..cda3cae48ce 100644 --- a/src/photos.cs +++ b/src/photos.cs @@ -1540,7 +1540,13 @@ interface PHPhotoLibrary { [Export ("uploadJobExtensionEnabled")] bool UploadJobExtensionEnabled { [Bind ("isUploadJobExtensionEnabled")] get; } +#if XAMCORE_5_0 [NoTV, NoMacCatalyst, NoMac, iOS (26, 1)] +#else + [NoTV, iOS (26, 1)] + [Obsoleted (PlatformName.MacOSX, 10, 13, message: "Use 'EnableUploadJobExtension' and 'DisableUploadJobExtension' instead.")] + [Obsoleted (PlatformName.MacCatalyst, 13, 1, message: "Use 'EnableUploadJobExtension' and 'DisableUploadJobExtension' instead.")] +#endif [Deprecated (PlatformName.iOS, 27, 0, message: "Use 'EnableUploadJobExtension' and 'DisableUploadJobExtension' instead.")] [Export ("setUploadJobExtensionEnabled:error:")] bool SetUploadJobExtensionEnabled (bool enable, [NullAllowed] out NSError error); From 6d64785c3bca0c18276bd8fe58071bb763f4a6fa Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Wed, 12 Aug 2026 10:45:39 -0400 Subject: [PATCH 3/3] [Photos] Remove preview-only desktop setter Revert the compatibility shim introduced in 346ef39ba4. XAMCORE_5_0 shims protect API that shipped in a stable release, while the macOS and Mac Catalyst variants of SetUploadJobExtensionEnabled existed only in Xcode 27 beta 4. Match the Xcode 27 beta 5 headers directly and document the beta-to-beta availability correction. The previous-beta API diff is expected to report the two desktop removals, while the stable Xcode 26 comparison remains clean; no API diff suppression is added. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 91ab847a-8bef-4f4b-9e3d-a617eadca998 --- src/photos.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/photos.cs b/src/photos.cs index cda3cae48ce..5a2aed9b1a6 100644 --- a/src/photos.cs +++ b/src/photos.cs @@ -1540,13 +1540,9 @@ interface PHPhotoLibrary { [Export ("uploadJobExtensionEnabled")] bool UploadJobExtensionEnabled { [Bind ("isUploadJobExtensionEnabled")] get; } -#if XAMCORE_5_0 + // iOS-only per PHPhotoLibrary.h. Xcode 27 beta 4 briefly declared macOS and Mac Catalyst availability; + // beta 5 reverted to the Xcode 26 shape, so do not add [Mac] or [MacCatalyst]. [NoTV, NoMacCatalyst, NoMac, iOS (26, 1)] -#else - [NoTV, iOS (26, 1)] - [Obsoleted (PlatformName.MacOSX, 10, 13, message: "Use 'EnableUploadJobExtension' and 'DisableUploadJobExtension' instead.")] - [Obsoleted (PlatformName.MacCatalyst, 13, 1, message: "Use 'EnableUploadJobExtension' and 'DisableUploadJobExtension' instead.")] -#endif [Deprecated (PlatformName.iOS, 27, 0, message: "Use 'EnableUploadJobExtension' and 'DisableUploadJobExtension' instead.")] [Export ("setUploadJobExtensionEnabled:error:")] bool SetUploadJobExtensionEnabled (bool enable, [NullAllowed] out NSError error);