How to exclude Pods from Code Coverage in Xcode - ios

Is there a way to exclude Pods from Code Coverage?
I would like to see Code Coverage only for the code I've written.
Not that it should matter, but I'm using Xcode 8.

These steps will help:
1. add these lines to Podfile
# Disable Code Coverage for Pods projects
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['CLANG_ENABLE_CODE_COVERAGE'] = 'NO'
end
end
end
2. run pod install
Now you won't see pods in test coverage.
Note: It only excludes Objective-c pods but not Swift

XCode 10 Update
In Xcode 10 you can set which targets you want to enable code coverage for in
Edit Schemes > Test > Options
Just select 'Gather coverage for some targets' and add your main project.

To disable coverage for swift code you can use a wrapper for SWIFT_EXEC (I verified this so far with Xcode 9.3). Hence the complete solution (incl. Swift) would be the following:
Append to your Podfile (and invoke pod install after that):
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |configuration|
configuration.build_settings['CLANG_ENABLE_CODE_COVERAGE'] = 'NO'
configuration.build_settings['SWIFT_EXEC'] = '$(SRCROOT)/SWIFT_EXEC-no-coverage'
end
end
end
Place the following script (name it SWIFT_EXEC-no-coverage) at the root of your source tree (chmod +x as necessary):
#! /usr/bin/perl -w
use strict;
use Getopt::Long qw(:config pass_through);
my $profile_coverage_mapping;
GetOptions("profile-coverage-mapping" => \$profile_coverage_mapping);
exec(
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc",
#ARGV);
Here's a link to the corresponding gist: https://gist.github.com/grigorye/f6dfaa9f7bd9dbb192fe25a6cdb419d4

Click on your Pods project in the Project Navigator on the left
On the right hand side, open project and target list if it's not already open; then click on the Pods project name (NOT the targets).
Click Build Settings.
In the search bar, search for "CLANG_ENABLE_CODE_COVERAGE".
Change "Enable Code Coverage Support" to NO.
Re-run test.

If you are developing a pod and want to have code coverage just for yours:
# Disable Code Coverage for Pods projects except MyPod
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
if target.name == 'MyPod'
target.build_configurations.each do |config|
config.build_settings['CLANG_ENABLE_CODE_COVERAGE'] = 'YES'
end
else
target.build_configurations.each do |config|
config.build_settings['CLANG_ENABLE_CODE_COVERAGE'] = 'NO'
end
end
end
end

Based on answer of #Tung Fam adding exclusion list for some pods
# Disable Code Coverage for projects listed in excluded_pods
excluded_pods = ['Pod1', 'Pod2', 'Pod3']
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
next if !excluded_pods.include?(target.name)
target.build_configurations.each do |config|
config.build_settings['CLANG_ENABLE_CODE_COVERAGE'] = 'NO'
end
end
end

Related

Flutter IOS build error - "select a development team in the Signing & Capabilities editor."

The following error is displayed when attempting to build on an IOS device:
As shown in the picture below, the Signing setting in Xcode is well done.
Can you tell me the cause and solution of this?
Could not build the precompiled application for the device.
Error (Xcode): Signing for "GoogleSignIn-GoogleSignIn" requires a development team. Select a development team in the Signing & Capabilities editor.
/Users/home_1/StudioProjects/Example%20Project/app/ios/Pods/Pods.xcodeproj
Error (Xcode): Signing for "DKPhotoGallery-DKPhotoGallery" requires a development team. Select a development team in the Signing & Capabilities editor.
/Users/home_1/StudioProjects/Example%20Project/app/ios/Pods/Pods.xcodeproj
Error (Xcode): Signing for "DKImagePickerController-DKImagePickerController" requires a development team. Select a development team in the Signing & Capabilities editor.
/Users/home_1/StudioProjects/Example%20Project/app/ios/Pods/Pods.xcodeproj
Error (Xcode): Signing for "gRPC-C++-gRPCCertificates-Cpp" requires a development team. Select a development team in the Signing & Capabilities editor.
/Users/home_1/StudioProjects/Example%20Project/app/ios/Pods/Pods.xcodeproj
This happened to me today after switching to Xcode 14. Try adding this to your podfile
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.build_settings['WRAPPER_EXTENSION'] == 'bundle'
config.build_settings['DEVELOPMENT_TEAM'] = 'YOUR_DEVELOPMENT_TEAM_ID'
end
end
end
end
Don't forget to replace the YOUR_DEVELOPMENT_TEAM_ID with your actual development Team ID which you can find in developer.apple.com
This will permanently fix the issue.
If you don't want to use the Team ID you can do this instead:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
target.build_configurations.each do |config|
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
end
end
end
If you have other post_install steps, for example flutter_additional_ios_build_settings(target), make sure to keep them
I'm wondering when Apple is going to launch a new xCode version without breaking anything from previous ones!
Rants aside, this is how I fixed my Flutter project based on previous answers:
Open your awesome_flutter_project/ios/Podfile:
and replace these lines:
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end
for:
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
target.build_configurations.each do |config|
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
end
end
end
Just for everyone, who thinks the accepted solution is a hack, you are right. This is a known bug in the flutter framework which has been fixed in flutter 3.3.3 .
So I recommand everyone to upgrade to this version, if you are able/allowed to do so.
In case you can't upgrade to 3.3.3 then the accepted solution is your best bet ;)
It's a Flutter framework issue
Update Flutter version into 3.3.3
I also got this error after updating XCode to version 14.
Add the following to ios > podfile
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
if config.build_settings['WRAPPER_EXTENSION'] == 'bundle'
config.build_settings['DEVELOPMENT_TEAM'] = 'YOUR_DEVELOPMENT_TEAM_ID'
end
end
end
end
To get YOUR_DEVELOPMENT_TEAM_ID: https://developer.apple.com/account/#!/membership/
This will permanently fix the issue.
If you don't want to use the Team ID you can do this instead:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
target.build_configurations.each do |config|
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
end
end
end
I was able to solve the problem by doing the following:
Open project on xCode
Open Pods and find out "GoogleSignIn-GoogleSignIn" and other three on Pods > Target
Select Team on Signing & Capabilities
Open your flutter project in Xcode
Pods -> Targets -> Signing & Capabilities -> Select Team
Select Team for every Targets
I am using CodeMagic.io (CI/CD) and had this same problem, I found the issue to be the Xcode version: 14
I solved this at CodeMagic.io by doing this :
Go to the Workflow Editor
Go to 'Build'
Change the Xcode version: 13.4.1
If you are using another CI/CD try using Xcode version: 13.4.1
It was mentioned to solve this you can also update your Flutter version to 3.3.3 however if like me this is not an option for you try using Xcode version 13.4.1
adding following code solved issue in Xcode 14 and flutter version 2.8
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
When I put the the suggested changes in the pod file and run the flutter build ipa command, I am getting a different error.
Error:
In file included from /Volumes/Data/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/webview_flutter_wkwebview-2.9.3/ios/Classes/FWFUIViewHostApi.m:5:
/Volumes/Data/FlutterSDK/.pub-cache/hosted/pub.dartlang.org/webview_flutter_wkwebview-2.9.3/ios/Classes/FWFUIViewHostApi.h:5:9: fatal error: 'Flutter/Flutter.h' file not found
#import <Flutter/Flutter.h>
For CI/CD, this is the only solution that worked for me.
Update podfile.
target_is_resource_bundle = target.respond_to?(:product_type) && target.product_type == 'com.apple.product-type.bundle'
target.build_configurations.each do |build_configuration|
if target_is_resource_bundle
build_configuration.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
build_configuration.build_settings['CODE_SIGNING_REQUIRED'] = 'NO'
build_configuration.build_settings['CODE_SIGNING_IDENTITY'] = '-'
build_configuration.build_settings['EXPANDED_CODE_SIGN_IDENTITY'] = '-'
end
end
then go to the team drop list and select your team

Xcode 11.1 stuck on archiving

I'm using Xcode 11.1 and I'm trying to upload a testFlight
but it's stuck on the archiving.
the compile of the archiving stuck on specific log all the time 'Touch'
I've already tried to set this code in the PodFile:
post_install do |installer|
installer.pods_project.targets.each do |target|
next unless target.name == '<NAME OF POD>'
target.build_configurations.each do |config|
next unless config.name.start_with?('Release')
config.build_settings['SWIFT_OPTIMIZATION_LEVEL'] = '-Onone'
end
end
end
and tried to set ld_verify_bitcode == NO in the Build Settings.

How to build a xcode 9 project with Swift 4.0 using Pods in Swift 3?

I want the main module of my iOS App to compile Swift 4.0 while the CocoaPods module compiles swift 3.
PS: Using Xcode 9 beta 2.
If you are using some pods written in Swift 4, but some are Swift 3.2, here is the way you can specify the SWIFT_VERSION value for them:
swift_32 = ['Pod1', 'Pod2', 'Pod3'] # if these pods are in Swift 3.2
swift4 = ['Pod4', 'Pod5', 'Pod6'] # if these pods are in Swift 4
post_install do |installer|
installer.pods_project.targets.each do |target|
swift_version = nil
if swift_32.include?(target.name)
swift_version = '3.2'
end
if swift4.include?(target.name)
swift_version = '4.0'
end
if swift_version
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = swift_version
end
end
end
end
Finally I got it to work: All I had to do was to put this script in the end of Podfile:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end
Here is a far less verbose way to set the pods you need to 3.2 and leave all others at 4.0
post_install do |installer|
installer.pods_project.targets.each do |target|
if ['AirMapSDK', 'PhoneNumberKit', 'Lock', 'RxSwift', 'RxSwiftExt', 'RxCocoa', 'RxDataSources', 'ProtocolBuffers-Swift'].include? target.name
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end
end
Just modify the array in the if statement. everything else will default to 4.0
Project Navigator > Choose 'Pods' > Choose the Swift 3.2 Pod > 'Build Settings' > Scroll down and then set Swift Language Version to 3.2 in 'Swift Compiler - Language section'.
On doing this, Xcode will show one Buildtime issue. It will ask you to convert the source code of pods to Swift 4. Don't do that. Click on that issue > Uncheck 'Remind Me' > Click 'Convert Later'.
Project Navigator
Build Settings
Set Swift 4.0 for all the targets except that framework which should be Swift 3.2
It's what I'm currently doing in a project

How to use OTHER_SWIFT_FLAGS in a Pod

Has anybody tried to use build configuration flags in a Swift based Pod? I am trying to use a post_install hook to add "OTHER_SWIFT_FLAGS" to a private Swift pod that I'm working on. Basically, I want to be able to do something like #if DEV #elseif QA #else #endif to change endpoints based on the target that I'm using. The project I'm integrating the pod with also uses DEV & QA flags which work fine with corresponding DEV & QA targets.
Here is a post_install hook that I came up using help from other similar posts:
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == 'Pods-Test-QA'
puts "Found #{target.name}. Adding Swift Flag..."
target.build_configurations.each do |config|
puts "Configuration: #{config}"
config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['$(inherited)']
config.build_settings['OTHER_SWIFT_FLAGS'] << '-DQA'
puts "#{config.build_settings['OTHER_SWIFT_FLAGS'].inspect}"
end
end
if target.name == 'Pods-Test-DEV'
puts "Found #{target.name}. Adding Swift Flag..."
target.build_configurations.each do |config|
puts "Configuration: #{config}"
config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['$(inherited)']
config.build_settings['OTHER_SWIFT_FLAGS'] << '-DDEV'
puts "#{config.build_settings['OTHER_SWIFT_FLAGS'].inspect}"
end
end
end
end
After running pod install the post_install successfully adds the flags as shown in the image below for Pods-Test-QA & Pods-Test-DEV.
However, when I run the project using QA or DEV targets and use the following flags it always hits PROD:
#if DEV
print("DEV ENVIRONMENT")
#elseif QA
print("QA ENVIRONMENT")
#else
print("PROD ENVIRONMENT")
#endif
Is there something I'm missing?
Also, for some reason Pods-Test-QA.debug.xcconfig & DEV don't seem to be updated with the flags I've added. Does anyone have any idea why it's not updating in the .xcconfig files?
OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
Any help would be appreciated. Thanks in advance.
Using:
cocoapods (1.0.1)
Xcode 7.3.1
If you develop your own pod and would like to add some flags depending on the configuration you can do so by mentioning it in your podspec file.
My goal was to add 'BETA' flag to my pod if parent's project active configuration contains 'BETA' in its name without post-install hooks.
s.pod_target_xcconfig = {
'OTHER_SWIFT_FLAGS[config=*Beta*]' => '-DBETA',
}
Podspec not only allows to do add custom flags but gives an opportunity to use wildcards.
The result: if my parent project uses 'Extra Early Beta' configuration then the following fork in pod's sources goes to 'BETA'
#if BETA
// Beta related code
#else
// Code I don't need in beta.
#endif

How to add a folder reference in my the Pod project in post install?

So, I am trying to add a folder reference in a target that was created by cocoapods.
I found this solution, but it is not working for me. https://github.com/CocoaPods/CocoaPods/issues/3521
I am on cocoapods 0.39. And I only changed the projects to pods_project since that was deprecated.
Also how do you enable logging when running pod update. I tried pod update --verbose, but my puts is not being displayed. :/
=========== UPDATED ===========
post_install do |installer|
puts "printing tests"
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if target.name == "TargetWhereToAddTheFolderOrFileReference"
source_files = target.source_build_phase.files
folderReference = installer.project.add_file_reference("/AbsolutePath/To/FileOrFolder", installer.project.pod_group("PodGroupWhereToAddTheFileOrFolder"), true)
target.source_build_phase.add_file_reference(btsdata, true)
end
end
end
end
post_install do |installer|
// another post install script is here.
end
I've attached the script that is failing plus there was another post_install script below it. That puts "printing tests" is not being called as well....
=========== UPDATED ENDS ===========
Oh, I think the script will only execute the last post_install and not
both. Can you put the code inside the first post_install into the last one?

Resources