Plateforms sockets en charge, SDK de base, création de parameters d'architecture active uniquement restaurés après la mise à jour de la nacelle

Mon équipe a récemment commencé à employer CocoaPods pour gérer la dépendance dans notre projet d'application iOS.

Voici le podfile:

platform :ios, '6.0' pod "UI7Kit" pod "AFNetworking", "~> 2.0" pod "TMCache" pod "SVProgressHUD" pod "SVPullToRefresh" 

Cependant, après avoir utilisé CocoaPods, la construction de cibles pour l'iPhone 5 échoue toujours, mais réussit pour le simulateur.

Voici le journal des erreurs:

 ld: warning: ignoring file [DerivedData directory]/libPods.a, file was built for archive which is not the architecture being linked (armv7): [DerivedData directory]/libPods.a Undefined symbols for architecture armv7: "_OBJC_CLASS_$_SVProgressHUD", referenced from: objc-class-ref in ....o "_OBJC_CLASS_$_TMCache", referenced from: objc-class-ref in ....o "_OBJC_CLASS_$_UI7Kit", referenced from: objc-class-ref in ....o ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

J'ai essayé les solutions mentionnées dans CocoaPods Troubleshooting , y compris l'ajout de la bibliothèque statique Pods en haut de la list, mais elle échoue toujours.

Plus tard, nous avons trouvé que dans "Pods Project Settings"> "Build Settings"> "Architectures", "Base SDK" est défini comme "Aucun SDK (dernier OS X)", "Build Active Architecture Only"> "Debug" Oui "et" Plates-forms sockets en charge "définies comme" OS X ". Après les avoir remplacés par "Dernier iOS (iOS 7.0)", "Non", "iOS" respectivement, la construction de l'iPhone 5 et du simulateur fonctionne bien.

Cependant, chaque fois que nous faisons une Pod update , tous les trois parameters sont ramenés à leurs états précédents, ce qui est ennuyeux.

Mes questions sont:

  1. Est-ce un cas de design ou quelque chose ne va pas avec mon projet / espace de travail?
  2. Comment empêcher ces parameters d'être rétablis aux mauvais états?

Toute aide serait appréciée.

Comme mentionné dans les problèmes de CocoaPods , vous pouvez append ceci à votre Podfile:

 post_install do |installer_representation| installer_representation.project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' end end end 

Cela fera que tous les modules seront construits pour tous les arcs.

Je me suis retrouvé dans cette situation en utilisant Cocoapods 0.36.3 et Xcode 6.2. Je doute fortement que c'est la meilleure solution, mais j'ai écrit un crochet pour aller au fond de mon Podfile qui réinitialise les parameters "BaseSDK", "Platform" et "Build Active Architecture Only" dans le projet Pods. J'ai également mis "Build Active Architecture Only" à "NO" pour chacune des cibles, pour faire bonne mesure (comme mentionné dans le post ci-dessus).

 post_install do |installer_representation| projectSDK = nil puts"Updating all of the POD targets to not default to ONLY_ACTIVE_ARCH for debug" installer_representation.project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' if projectSDK.nil? projectSDK = config.build_settings['SDKROOT'] end end end puts "Updating ONLY_ACTIVE_ARCH for the project, as well. While the project settings aren't supposed to matter, I've not found that to be the case." puts "Also setting the base SDK of the project to match that of the targets (doesn't matter which one); otherwise it defaults to No SDK (Latest OS X)" installer_representation.project.build_configurations.each do |config| config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' config.build_settings['SDKROOT'] = projectSDK end end 

J'avais l'habitude de suivre cette procédure … maintenant avec des cocoapodes et plus d'heures dans l'affaire, j'ai opté pour:

 # fixes required for xcode project post_install do |installer_representation| puts "" puts "Updating VALID_ARCHS, SUPPORTED_PLATFORMS, SDKROOT for the project..." installer_representation.pods_project.build_configurations.each do |config| # config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' config.build_settings['VALID_ARCHS'] = 'arm64 armv7 armv7s' config.build_settings['SUPPORTED_PLATFORMS'] = 'iphonesimulator iphoneos' # setting the base SDK of the project to match that of the project, # otherwise it defaults to No SDK (Latest OS X)" config.build_settings['SDKROOT'] = 'iphoneos' # it sets 'Valid Architectures' to '$(ARCHS_STANDARD)' to all pods # config.build_settings['SDKROOT'] = projectSDK end puts "" puts "Updating all of the watch POD targets with specific..." installer_representation.pods_project.targets.each do |target| target.build_configurations.each do |config| if (config.build_settings['SDKROOT'] == 'watchos') puts "fixing SUPPORTED_PLATFORMS & VALID_ARCHS for #{target.name} #{config.name}" config.build_settings['SUPPORTED_PLATFORMS'] = 'watchsimulator watchos' config.build_settings['VALID_ARCHS'] = 'arm64 armv7 armv7s armv7k i386' end # to not default to ONLY_ACTIVE_ARCH for debug" # config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' # config.build_settings['ENABLE_STRICT_OBJC_MSGSEND'] = "NO" end end puts "" end 

Les parameters du projet Pods n'ont pas d'importance, ce qui est important, ce sont les parameters Target pour la bibliothèque statique de pod. Mais vous ne devriez pas avoir à les toucher.

Pouvez-vous publier vos parameters de construction à partir de votre projet / cible? Le guide de dépannage suggère quelques parameters de construction en cas de construction échouée , aident-ils? Veillez à activer pour afficher tous les parameters de génération et vérifiez si certains parameters remplacent ceux spécifiés dans le file xcconfig que CocoaPods a généré.

Vérifiez également que votre projet est basé sur le file xcconfig dans l'onglet Infos du projet. entrez la description de l'image ici

J'espère que quelque chose de cela aidera.

Pour toute personne utilisant les dernières gousses de cacao

 post_install do |installer_representation| installer_representation.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' end end 

fin