How to fix duplication error of GoogleUtilities Swift?

Viewed 5090

I am using firebase for tracking crashes in my project and i am using the below pods in my project.

 pod 'FirebaseCore', '6.6.4'
 pod 'FirebaseMessaging', '4.3.0'
 pod 'FirebaseAnalytics','6.3.1'

While archieving this project for placing the testflight build, i am getting duplication error below for google utilities :

 Multiple commands produce '/Path/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/GoogleUtilities.framework':
 1) Target 'GoogleUtilities-00567490' has create directory command with output '/Path//IntermediateBuildFilesPath/UninstalledProducts/iphoneos/GoogleUtilities.framework'
 2) Target 'GoogleUtilities-54e75ca4' has create directory command with output '/Path//IntermediateBuildFilesPath/UninstalledProducts/iphoneos/GoogleUtilities.framework'

When I checked my Pods settings in my build setting, I saw google utilities added twice in project. I have removed the one of the GoogleUtilities it's getting an error.

Note: I can able to run the build and I can't able to archive it. Is there any fix for achieving this build, without changing the legacy build system?

Because I have enabled the library distribution for my SDK, so when I made changes into legacy its throws an error.

6 Answers

Update the Podfile to explicitly request all the needed GoogleUtilties subspecs. Examine the Podfile.lock to find the list.

There is a lot more detail at this CocoaPods issue.

Adding pod 'GoogleUtilities', '~> 7.7.0' to all the targets that use Firebase pods will make it work. In my case, this included 3 targets: iOS app, iMessage Extension and UnitTests.

No need to add this part explicitly:

def google_utilites
  pod 'GoogleUtilities/AppDelegateSwizzler'
  pod 'GoogleUtilities/Environment'
  pod 'GoogleUtilities/Logger'
  pod 'GoogleUtilities/MethodSwizzler'
  pod 'GoogleUtilities/NSData+zlib'
  pod 'GoogleUtilities/Network'
  pod 'GoogleUtilities/Reachability'
  pod 'GoogleUtilities/UserDefaults'
end

This issue occurred to me when i added a new target to my project using very similar but not equal firebase dependencies, so GoogleUtilities was duplicated because my other target doesn't need as much dependencies from utilities as the main one so, basically (with the help of Paul Beusterien answer) went to the Pods project and look at both targets (GoogleUtilities-xxx) -> Build Phases -> Compile Sources and look at the differences in files added, basically in the new target was missing 'GoogleUtilities/UserDefaults' and 'GoogleUtilities/MethodSwizzler' but this can be different in any case, so i just did a compilation like this

platform :ios, '13.0'

def google_utilites
  pod 'GoogleUtilities/AppDelegateSwizzler'
  pod 'GoogleUtilities/Environment'
  pod 'GoogleUtilities/Logger'
  pod 'GoogleUtilities/MethodSwizzler'
  pod 'GoogleUtilities/NSData+zlib'
  pod 'GoogleUtilities/Network'
  pod 'GoogleUtilities/Reachability'
  pod 'GoogleUtilities/UserDefaults'
end

abstract_target 'AggregatedPodsTarget' do
  use_frameworks!

  google_utilites
  
  pod 'FirebaseCore'
  pod 'FirebaseAuth'
  pod 'FirebaseFirestore'
  pod 'FirebaseStorage'
  pod 'FirebaseFunctions'
  pod 'FirebaseAnalytics'
  pod 'FirebaseMessaging'
  pod 'Firebase/Crashlytics'
  
  pod 'Google-Mobile-Ads-SDK'


  
  target 'MainApp' do
  end
  
  target 'MainApp Dev' do
  end
  
end

abstract_target 'ExtensionPodsTarget' do
  use_frameworks!
  
  google_utilites
  
  pod 'FirebaseAuth'
  pod 'FirebaseFunctions'
  
  target 'Extension' do
  end
  
  target 'Extension Dev' do
  end
end

after this i just did pod install and i went back to have only one GoogleUtilities Dependency

I saw this error when I tried archiving one of my projects where I had recently introduced another new target.

Going into the pod settings for this new target, I noticed that the iOS deployment version was different (14.4) from the iOS deployment version in the main Runner target (12.0) - something I had missed when I was initially configuring this new extension target.

The only difference between the iOS deployment versions I saw was that 14.4 had App Extensions enabled. Since that was something inconsequential to my project, I was happy matching the iOS deployment versions for both my targets so they could refer to only one set of dependencies. After that, I just removed the duplicate pods for the version that I had removed. And I could archive again.


For each of your Targets, got to Build Settings -> check the iOS Deployment Target -> change the version so that they match.

For most circumstances, there is no reason why they should be different. But if for some reason you deem they should be different, checkout Paul Beusterien's answer and follow that.

We had the similar issue on Flutter project using firebase_core and firebase_analytics dependencies. Adding pod 'GoogleUtilities', '~> 7.7.0' in all the targets in the Podfile under ios folder.

target 'Runner' do
  use_frameworks!
  use_modular_headers!

  pod 'GoogleUtilities', '7.7.0'
  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
  end
end

target 'customnotificationext' do
  use_frameworks!

  pod 'GoogleUtilities', '7.7.0'
end

This worked for me, it's similar to this Bogdan's answer

Summarising steps

  1. Add pod 'GoogleUtilities' so they don't clash from different targets enter image description here
  2. Clean install your pods (pod deintegrate and pod install)
  3. Might need pod repo update.
  4. Reopen xcode and archive, you would see single GoogleUtilities now enter image description here
Related