39 votes

Qu'est-ce qui peut provoquer le message "binaire invalide" sans suivi par e-mail d'iTunes Connect ?

J'essaie de soumettre une mise à jour d'une application existante pour le compte d'un de mes clients, et je reçois des échecs "Invalid Binary" de la part d'iTunes Connect, sans explication de l'erreur. Je pars demain pour deux semaines de vacances sans accès au réseau, je suis donc un peu désespéré pour trouver une solution. Je vous serais reconnaissant de bien vouloir me faire part de vos commentaires.

Cette mise à jour change le nom de l'application et corrige quelques bogues mineurs. J'ai fait des soumissions précédentes via l'iTunes Connect, mais je soumets cette mise à jour via Xcode comme Apple l'exige maintenant.

Je me suis configuré en tant que contact technique pour ce client, et je reçois donc une notification lorsque je place la nouvelle version dans un état "En attente de téléchargement" via iTunes Connect. Lorsque je valide ensuite le binaire via l'organisateur Xcode, l'outil indique finalement que le binaire est valide. Lorsque je soumets le binaire via l'organisateur Xcode, il revient finalement et indique que le binaire a été téléchargé avec succès. Ces deux étapes prennent un certain temps (peut-être 15 minutes chacune), probablement parce que le paquet d'applications fait 63 mégaoctets avec des milliers de ressources.

Pendant l'heure ou les deux heures suivantes, le portail iTunes Connect indique toujours que l'application est dans l'état "Waiting for Upload". Je pense qu'une certaine latence est normale entre le moment où le téléchargement est terminé dans Xcode et celui où l'état change dans iTunes Connect. Ces heures de latence semblent excessives, mais pas entièrement surprenantes, je suppose, étant donné la taille de l'application.

Finalement, l'état passe silencieusement à "Invalid Binary" dans iTunes connect. Je comprends qu'iTunes Connect est censé envoyer un e-mail expliquant l'erreur lorsque cela se produit, mais je ne reçois rien, et mon client non plus. (Je suppose qu'il devrait être envoyé à tous les utilisateurs marqués pour la notification des changements d'état des applications dans iTunes Connect. Cette supposition est-elle correcte ?)

Voici les paramètres de construction copiés et collés de ma configuration de distribution App Store :

ADDITIONAL_SDKS = 
ARCHS = $(ARCHS_STANDARD_32_BIT)
SDKROOT = iphoneos4.0
ONLY_ACTIVE_ARCH = YES
VALID_ARCHS = armv6 armv7
SYMROOT = /Users/cduhn/Documents/workspace/xcode_build_output
OBJROOT = $(SYMROOT)
CONFIGURATION_BUILD_DIR = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
SHARED_PRECOMPS_DIR = $(CACHE_ROOT)/SharedPrecompiledHeaders
BUILD_VARIANTS = normal
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
ENABLE_OPENMP_SUPPORT = NO
GENERATE_PROFILING_CODE = NO
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES
RUN_CLANG_STATIC_ANALYZER = NO
SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = NO
VALIDATE_PRODUCT = NO
CODE_SIGN_ENTITLEMENTS = Entitlements.plist
CODE_SIGN_IDENTITY = 
CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Distribution: Capturing Moments
CODE_SIGN_RESOURCE_RULES_PATH = 
OTHER_CODE_SIGN_FLAGS = 
STRIPFLAGS = 
ALTERNATE_GROUP = $(INSTALL_GROUP)
ALTERNATE_OWNER = $(INSTALL_OWNER)
ALTERNATE_MODE = $(INSTALL_MODE_FLAG)
ALTERNATE_PERMISSIONS_FILES = 
DEPLOYMENT_LOCATION = NO
DEPLOYMENT_POSTPROCESSING = NO
INSTALL_GROUP = $(GROUP)
INSTALL_OWNER = $(USER)
INSTALL_MODE_FLAG = u+w,go-w,a+rX
DSTROOT = /tmp/$(PROJECT_NAME).dst
INSTALL_PATH = $(HOME)/Applications
MACOSX_DEPLOYMENT_TARGET = $(inherited)
SKIP_INSTALL = YES
COPY_PHASE_STRIP = YES
STRIP_INSTALLED_PRODUCT = 
STRIP_STYLE = all
TARGETED_DEVICE_FAMILY = 1
SEPARATE_STRIP = NO
IPHONEOS_DEPLOYMENT_TARGET = 3.0
MODULE_NAME = 
MODULE_START = 
MODULE_STOP = 
MODULE_VERSION = 
BUNDLE_LOADER = 
STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic
DYLIB_COMPATIBILITY_VERSION = 
DYLIB_CURRENT_VERSION = 
LINKER_DISPLAYS_MANGLED_NAMES = NO
PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO
LD_DYLIB_INSTALL_NAME = 
EXPORTED_SYMBOLS_FILE = 
INIT_ROUTINE = 
LINK_WITH_STANDARD_LIBRARIES = YES
MACH_O_TYPE = mh_execute
LD_OPENMP_FLAGS = -fopenmp
ORDER_FILE = 
OTHER_LDFLAGS = -all_load -ObjC
LD_MAP_FILE_PATH = $(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt
GENERATE_MASTER_OBJECT_FILE = NO
PREBINDING = NO
PRELINK_LIBS = 
KEEP_PRIVATE_EXTERNS = NO
LD_RUNPATH_SEARCH_PATHS = 
SEPARATE_SYMBOL_EDIT = NO
PRELINK_FLAGS = 
SECTORDER_FLAGS = 
UNEXPORTED_SYMBOLS_FILE = 
WARNING_LDFLAGS = 
LD_GENERATE_MAP_FILE = NO
COMPRESS_PNG_FILES = YES
APPLY_RULES_IN_COPY_FILES = NO
EXECUTABLE_EXTENSION = 
EXECUTABLE_PREFIX = 
INFOPLIST_EXPAND_BUILD_SETTINGS = YES
GENERATE_PKGINFO_FILE = YES
FRAMEWORK_VERSION = A
INFOPLIST_FILE = iRevealMaui-Info.plist
INFOPLIST_OTHER_PREPROCESSOR_FLAGS = 
INFOPLIST_OUTPUT_FORMAT = binary
INFOPLIST_PREPROCESSOR_DEFINITIONS = 
INFOPLIST_PREFIX_HEADER = 
INFOPLIST_PREPROCESS = NO
COPYING_PRESERVES_HFS_DATA = NO
PRIVATE_HEADERS_FOLDER_PATH = $(CONTENTS_FOLDER_PATH)/PrivateHeaders
PRODUCT_NAME = iRevealMaui
PLIST_FILE_OUTPUT_FORMAT = binary
PUBLIC_HEADERS_FOLDER_PATH = $(CONTENTS_FOLDER_PATH)/Headers
STRINGS_FILE_OUTPUT_ENCODING = binary
WRAPPER_EXTENSION = app
ALWAYS_SEARCH_USER_PATHS = NO
FRAMEWORK_SEARCH_PATHS = 
HEADER_SEARCH_PATHS = ${SDKROOT}/usr/include/libxml2/** ../three20/Build/Products/three20
LIBRARY_SEARCH_PATHS = $(inherited) "$(SRCROOT)/../desiccant/Classes/External/google-analytics"
REZ_SEARCH_PATHS = 
EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = *.nib *.lproj *.framework *.gch (*) CVS .svn *.xcodeproj *.xcode *.pbproj *.pbxproj
INCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = 
OTHER_TEST_FLAGS = 
TEST_HOST = 
TEST_RIG = 
CURRENT_PROJECT_VERSION = 
VERSION_INFO_FILE = $(PRODUCT_NAME)_vers.c
VERSION_INFO_EXPORT_DECL = 
VERSION_INFO_PREFIX = 
VERSION_INFO_SUFFIX = 
VERSIONING_SYSTEM = 
VERSION_INFO_BUILDER = $(USER)
GCC_FAST_OBJC_DISPATCH = YES
GCC_AUTO_VECTORIZATION = NO
GCC_OBJC_CALL_CXX_CDTORS = YES
GCC_ENABLE_SSE3_EXTENSIONS = NO
GCC_ENABLE_SSE41_EXTENSIONS = NO
GCC_ENABLE_SSE42_EXTENSIONS = NO
GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = NO
GCC_STRICT_ALIASING = NO
GCC_FEEDBACK_DIRECTED_OPTIMIZATION = Off
GCC_ENABLE_FIX_AND_CONTINUE = NO
GCC_GENERATE_DEBUGGING_SYMBOLS = YES
GCC_DYNAMIC_NO_PIC = YES
GCC_GENERATE_TEST_COVERAGE_FILES = NO
GCC_INLINES_ARE_PRIVATE_EXTERN = YES
GCC_MODEL_TUNING = G4
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO
GCC_ENABLE_KERNEL_DEVELOPMENT = NO
GCC_DEBUGGING_SYMBOLS = default
GCC_REUSE_STRINGS = YES
GCC_NO_COMMON_BLOCKS = NO
GCC_ENABLE_OBJC_GC = unsupported
GCC_OPTIMIZATION_LEVEL = s
GCC_FAST_MATH = NO
GCC_ENABLE_SYMBOL_SEPARATION = YES
GCC_THREADSAFE_STATICS = YES
GCC_SYMBOLS_PRIVATE_EXTERN = YES
GCC_UNROLL_LOOPS = NO
GCC_MODEL_PPC64 = NO
GCC_CHAR_IS_UNSIGNED_CHAR = NO
GCC_ENABLE_ASM_KEYWORD = YES
GCC_C_LANGUAGE_STANDARD = c99
GCC_CHECK_RETURN_VALUE_OF_OPERATOR_NEW = NO
GCC_CW_ASM_SYNTAX = YES
GCC_INPUT_FILETYPE = automatic
GCC_ALTIVEC_EXTENSIONS = NO
GCC_ENABLE_CPP_EXCEPTIONS = YES
GCC_ENABLE_CPP_RTTI = YES
GCC_LINK_WITH_DYNAMIC_LIBRARIES = YES
GCC_ENABLE_OBJC_EXCEPTIONS = YES
GCC_ENABLE_TRIGRAPHS = NO
GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS = NO
GCC_USE_INDIRECT_FUNCTION_CALLS = NO
GCC_USE_REGISTER_FUNCTION_CALLS = NO
GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO
OTHER_CPLUSPLUSFLAGS = $(OTHER_CFLAGS)
GCC_PRECOMPILE_PREFIX_HEADER = YES
GCC_PREFIX_HEADER = iRevealMaui_Prefix.pch
GCC_ENABLE_BUILTIN_FUNCTIONS = YES
GCC_ENABLE_PASCAL_STRINGS = YES
GCC_FORCE_CPU_SUBTYPE_ALL = NO
GCC_SHORT_ENUMS = NO
GCC_ONE_BYTE_BOOL = NO
GCC_USE_STANDARD_INCLUDE_SEARCHING = YES
GCC_PREPROCESSOR_DEFINITIONS = 
GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = 
GCC_WARN_CHECK_SWITCH_STATEMENTS = NO
GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO
GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO
GCC_WARN_ABOUT_GLOBAL_CONSTRUCTORS = NO
GCC_WARN_SHADOW = NO
GCC_WARN_64_TO_32_BIT_CONVERSION = NO
GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES
GCC_WARN_INHIBIT_ALL_WARNINGS = NO
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = NO
GCC_WARN_ABOUT_RETURN_TYPE = YES
GCC_WARN_MISSING_PARENTHESES = NO
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO
GCC_WARN_ABOUT_MISSING_NEWLINE = NO
GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO
WARNING_CFLAGS = 
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO
GCC_WARN_PEDANTIC = NO
GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES
GCC_WARN_PROTOTYPE_CONVERSION = NO
GCC_WARN_SIGN_COMPARE = NO
GCC_WARN_STRICT_SELECTOR_MATCH = NO
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = NO
GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = NO
GCC_TREAT_WARNINGS_AS_ERRORS = NO
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES
GCC_WARN_UNDECLARED_SELECTOR = NO
GCC_WARN_UNINITIALIZED_AUTOS = NO
GCC_WARN_UNKNOWN_PRAGMAS = NO
GCC_WARN_UNUSED_FUNCTION = NO
GCC_WARN_UNUSED_LABEL = NO
GCC_WARN_UNUSED_PARAMETER = NO
GCC_WARN_UNUSED_VALUE = NO
GCC_WARN_UNUSED_VARIABLE = YES
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES
GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES
IBC_FLATTEN_NIBS = YES
IBC_OTHER_FLAGS = 
IBC_PLUGIN_SEARCH_PATHS = 
IBC_PLUGINS = 
IBC_ERRORS = YES
IBC_NOTICES = YES
IBC_WARNINGS = YES

Voici le contenu de mon Info.plist :

Tout commentaire est le bienvenu.

EDIT - Explication de la latence du changement d'état apparent

D'après l'historique de mon statut, il semble que le statut "Invalid Binary" soit en fait établi en quelques minutes, mais qu'iTunes Connect dissimule ce fait avec une stratégie de mise en cache mal conçue.

Pour surveiller un changement d'état, j'ai rafraîchi et cliqué entre quatre pages : "Gérer vos applications", la page "Informations sur les applications", "Afficher les détails" et "Historique de l'état". Lorsque l'historique de l'état se met enfin à jour, il montre que l'application est passée à l'état "Invalid Binary" environ une heure auparavant.

A titre expérimental, j'ai essayé de changer l'ID de mon application et de soumettre le binaire comme une nouvelle application. Cette fois, j'ai cliqué sur la page "View Details" quelques minutes après avoir soumis le binaire. Son statut indiquait "Upload Received". Un progrès apparent ! Quelques minutes plus tard, j'ai cliqué sur "Status History", qui affichait "Invalid Binary" quelques minutes seulement après la fin du téléchargement. Puis je suis revenu en arrière et j'ai rafraîchi ma page "View Details". Elle affiche toujours "Upload Received", malgré le fait que l'historique d'état affiche "Invalid Binary". C'est une preuve assez claire que toutes ces pages sont mises en cache et affichent des données périmées pendant de longues périodes. Je ne m'en suis aperçu que lorsque j'ai soumis à nouveau le binaire en tant que nouvelle application, car je chargeais les pages de cette application pour la première fois.

Cela ne résout pas mon problème de "Invalid Binary" et n'explique pas non plus pourquoi je ne reçois pas d'e-mails, mais cela permet d'écarter certaines hypothèses.

1 votes

Vous dites que vous soumettez cette mise à jour via Xcode, utilisez-vous Application Loader ? Il donne des erreurs plus descriptives lors du téléchargement vers iTunes Connect.

32voto

Sasho Points 883

Après 16 heures de recherches incessantes, d'essais et d'erreurs, et de prises de tête, j'ai trouvé une solution sur le forum des développeurs Apple.

Apparemment, il existe un bogue permettant à votre binaire de passer la vérification et le téléchargement, mais d'être ensuite rejeté par le système iTunes Connect. Et vous ne recevez pas d'email vous expliquant ce qui s'est passé !

Si votre application est destinée à la fois à l'iPhone et à l'iPad, vous avez probablement quelque chose comme ceci dans le fichier Info.plist :

screenshot before

Vous devez retirer complètement le CFBundleIconFiles~ipad et inclure l'icône de l'iPad dans le paramètre Icons files comme ici :

screenshot after fix

C'est tout, les amis !

Faites-moi savoir si cela vous a aidé !

0 votes

+1 pour une réponse qui semble aider d'autres personnes, bien qu'elle n'ait pas résolu le problème dans mon cas. Je vais poster une réponse avec la solution qui a fonctionné pour moi.

0 votes

D'où vient cette syntaxe XxY_pixels_iPad ? Ou cela n'a-t-il pas d'importance ?

0 votes

Il se trouve dans le fichier "Info.plist" de votre projet (ou le nom que vous avez donné à votre fichier info.plist). Le fichier peut s'appeler '[votre_nom_d'application]_info.plist' ou autre... vous devriez pouvoir le trouver dans l'arbre de votre projet dans XCode.

10voto

rjobidon Points 1717

J'ai eu la même erreur INVALID BINARY de iTunes Connect même si Application Loader a accepté mon binaire. La solution était très simple...

Ouvrez votre info.plist, faites un clic droit et vérifiez Afficher les clés/valeurs brutes :

  • CFBundleIconFile \= Icon.png (l'icône PNG de mon iPhone 57x57)
  • CFBundleIconFile~ipad \= Icon-72.png (mon icône PNG 72x72 de l'ipad)
  • CFBundleIconFiles \= tableau
    • Article 0 \= Icon.png
    • Point 1 \= Icon@2x.png (mon icône PNG 114x114 de l'iPhone 4)
    • Point 2 \= Icon-72.png

Enregistrez, nettoyez toutes les cibles, construisez et analysez, compressez dans le Finder et soumettez à nouveau !

L'erreur a été provoquée parce que j'ai tapé la touche "Icon Files". Dans la vue brute, cela a été mis en correspondance avec "Icon Files" au lieu de CFBundleIconFiles. J'ai Xcode 3.2.3, je suppose que Xcode 3.2.4 a une meilleure correspondance avec cet identifiant clé.

Bonne chance à tous !

Source : Q&A technique QA1686 : Icônes d'application sur l'iPad et l'iPhone

0 votes

Ma situation est similaire à la vôtre. J'ai supprimé certaines icônes dans le xcode mais les CFBundleIconFiles conservent le nom du fichier.

8voto

cduhn Points 11229

Merci à tous ceux qui ont proposé des solutions. Il s'avère qu'aucune de vos suggestions ne m'a aidé dans mon cas, mais j'ai résolu le problème. Voici ce qui a fonctionné pour moi :

Supprimez Entitlements.plist de votre projet. Ensuite, faites Ajouter -> Nouveau fichier et ajoutez à nouveau Entitlements.plist.

Le format du fichier Entitlements.plist a changé entre le SDK 3.1.3 et 3.2. Si votre Entitlements.plist a été créé avec un SDK antérieur à 3.2 et que vous essayez maintenant de mettre à jour votre application en utilisant le SDK 3.2 ou supérieur, il semble que vous deviez supprimer le Entitlements.plist et le réinsérer en utilisant le nouveau format. Sinon, Apple rejettera votre mise à jour en la qualifiant de "binaire non valide".

7voto

Aaron Points 337

J'ai le même problème depuis quelques jours. Il semble que cette erreur puisse être causée par de nombreux problèmes différents, c'est pourquoi il est dommage qu'Apple n'élabore pas l'erreur par un e-mail.

Pour moi, la solution a été de ne pas utiliser du tout "Application Loader" !

Faites plutôt ce qui suit dans Xcode :

  • Sélectionnez votre application et allez dans Build > Build & Archive.
  • Une fois l'opération terminée, allez dans Fenêtre > Organiseur.
  • Sélectionnez votre demande sous "Demandes archivées".
  • Cliquez sur "Valider
  • Si la validation est un succès (comme la mienne) :
  • cliquez sur "Soumettre".

Cela soumettra ensuite la demande à Apple. Dans mon cas, après quelques secondes, le statut est passé à "Waiting for review" (en attente d'examen) au lieu de "Invalid Binary" (binaire non valide).

0 votes

Cela a fonctionné pour moi - et aussi, merci de m'avoir montré une nouvelle façon de soumettre mes applications. Je n'ai jamais vraiment aimé utiliser Application Loader !

1 votes

Ça m'a beaucoup aidé ! Cela n'a pas résolu mon problème directement, mais au moins j'ai enfin commencé à recevoir des e-mails d'Apple me disant ce qui n'allait pas, un fichier PNG "corrompu" (qui bizarrement s'ouvre dans tous les éditeurs d'images que j'ai ainsi que dans l'aperçu). Je préfère définitivement cette méthode de soumission à celle d'Application Launcher. Merci !

3voto

Utilisez les outils de construction et d'archivage de Xcode comme décrit dans une autre réponse ici.

Pour une raison quelconque, l'outil d'archivage a déclenché quelque chose chez Apple qui m'a renvoyé un courriel m'indiquant ce qui n'allait pas (fichier PNG corrompu).

Mon problème ? Xcode corrompt certains fichiers PNG lorsqu'il les compresse. Allez dans Build Settings, regardez dans la section Packaging et mettez "Compresser les fichiers PNG" sur non.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X