From 27cedee6f29e8b27121b3389ab110fd0ce88c41f Mon Sep 17 00:00:00 2001 From: Harlan Haskins Date: Wed, 30 Apr 2025 09:42:16 -0500 Subject: [PATCH] Add a utility to detect App Clips and make a semantic check for background URL sessions --- .../Environment/GULAppEnvironmentUtil.m | 19 +++++++++++++++++++ .../GoogleUtilities/GULAppEnvironmentUtil.h | 7 +++++++ 2 files changed, 26 insertions(+) diff --git a/GoogleUtilities/Environment/GULAppEnvironmentUtil.m b/GoogleUtilities/Environment/GULAppEnvironmentUtil.m index 7aa58407..8170c6a4 100644 --- a/GoogleUtilities/Environment/GULAppEnvironmentUtil.m +++ b/GoogleUtilities/Environment/GULAppEnvironmentUtil.m @@ -217,6 +217,25 @@ + (BOOL)isAppExtension { #endif } ++ (BOOL)isAppClip { +#if TARGET_OS_IOS + // Documented by Apple + // App clips have an NSAppClip entry in the top level of their Info.plist. + NSDictionary *appClipEntry = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSAppClip"]; + return appClipEntry != nil; +#elif TARGET_OS_OSX || TARGET_OS_TV || TARGET_OS_WATCH || TARGET_OS_VISION + return NO; +#endif +} + ++ (BOOL)supportsBackgroundURLSessionUploads { + // Neither app extensions nor App Clips support background uploads. + BOOL isExtension = self.isAppExtension; + BOOL isAppClip = self.isAppClip; + return !(isExtension || isAppClip); +} + + (NSString *)applePlatform { NSString *applePlatform = @"unknown"; diff --git a/GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h b/GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h index dbce3631..6eea4a82 100644 --- a/GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h +++ b/GoogleUtilities/Environment/Public/GoogleUtilities/GULAppEnvironmentUtil.h @@ -46,6 +46,13 @@ NS_ASSUME_NONNULL_BEGIN /// Indicates whether it is running inside an extension or an app. + (BOOL)isAppExtension; +/// Indicates whether it is running inside an app clip or a full app. ++ (BOOL)isAppClip; + +/// Indicates whether the current target supports background URL session uploads. +/// App extensions and app clips do not support background URL sessions. ++ (BOOL)supportsBackgroundURLSessionUploads; + /// @return An Apple platform. Possible values "ios", "tvos", "macos", "watchos", "maccatalyst", and /// "visionos". + (NSString *)applePlatform;