5
votes

Comment corriger l'erreur "Hash mismatch for chunk" avec iOS 13 + Apple On Demand Resources

Dans mon application, j'utilise les ressources Apple On Demand.

Je charge le contenu avec le code suivant:

currentRequest?.beginAccessingResources { (error: Error?) in
  if let error = error {
    onFailure(error as NSError)
    return
  }
  onSuccess()
}

Cela fonctionne bien avec iOS 12 et Xcode 10, mais avec les derniers iOS 13 et Xcode 11, j'obtiens l'erreur suivante:

Début: Demande 0x0x283c498c0 réponse: Erreur: Erreur de domaine = SZExtractorErrorDomain code = 4 "incompatibilité de hachage pour morceau contenant offset 0: edf8721781dca63db1671ee3f0c7f199 prévu, a 621dea3aab25ce02a382f155971034c3" UserInfo = {NSLocalizedDescription = décalage Hash pour morceau contenant décalage 0: edf8721781dca63db1671ee3f0c7f199 prévu, a 621dea3aab25ce02a382f155971034c3, SZExtractorActualHashValueErrorKey = 621dea3aab25ce02a382f155971034c3, SZExtractorFileOffsetErrorKey = 0, SZExtractorSourceFileLineErrorKey = 470, SZExtractorFunctionNameErrorKey = - [StreamingUnzipState 0CheckHashFor SashEset ''

J'ai supprimé les éléments, les ai rajoutés, les ai tagués, mais le problème persiste. Que signifie cette erreur?


2 commentaires

J'ai aussi vu cette erreur. En général, l'ODR semble se comporter différemment sur iOS 13, j'ai remarqué que les demandes se bloquent parfois sans aucun appel au gestionnaire d'achèvement, également sur un appareil. Je viens de voir une mise à jour d'application rejetée en raison de problèmes d'installation ODR - dans cette mise à jour, le code d'installation n'a pas été touché, il fonctionnait bien. L'avis était sur 13.1. Il semble donc qu'iOS 13 ait introduit des régressions liées à l'ODR.


Salut @JanBerkel, je rencontre également un problème où le gestionnaire de complétion beginAccessingResources n'est pas appelé (ni erreur ni succès) sur une version de vol d'essai pour tout iOS incluant 11 et 13. Il fonctionnait la veille, puis le lendemain il cessé de travailler. La version précédente du vol d'essai fonctionne cependant, ce qui se réduit au service hôte du vol d'essai. Nous avons également une version qui utilise notre propre service hôte avec la même base de code qui fonctionne. J'essaierai de reconstruire ce soir car il faut plus de 8 heures pour traiter sur l'App Store avec 6 Go de ressources.


3 Réponses :


1
votes

J'ai également rencontré cette erreur lors du développement d'une application sur un iPhone 6s avec iOS 13.1.2 en utilisant Xcode 11.0. Les ressources à la demande fonctionnaient bien, mais après avoir modifié le code non lié, le gestionnaire de beginAccessingResourcesWithCompletionHandler: de beginAccessingResourcesWithCompletionHandler: of NSBundleResourceRequest avec une erreur d'incompatibilité de hachage. Je suppose que l'erreur signifie que la requête n'a pas pu récupérer les ressources attendues, du moins en fonction du hachage des ressources, ce qui conduit à la conclusion que le problème ne provient pas des ressources, mais des hachages attendus.

Pour effacer les hachages attendus, j'ai supprimé mon application du périphérique de développement et après la reconstruction et le déploiement, les ressources à la demande se chargent à nouveau sans erreur.


0 commentaires

0
votes

D'après notre expérience, l'équipe de révision de l'AppStore rencontre également cette erreur de temps en temps. Si vous obtenez un rejet où la condition est causée par cette erreur, dites-leur de supprimer l'application de leur (s) appareil (s) avant de relancer leurs tests.

Cela peut prendre quelques tentatives, mais vous obtiendrez éventuellement un réviseur qui écoute.

La gestion des ressources à la demande sur iOS 13 semble être extrêmement peu fiable et sujette à ce problème de hachage. Le problème sous-jacent est que l'appareil tente de continuer le téléchargement d'une ancienne version en attente du package d'actifs et lorsqu'il tente de fusionner les paquets, il rencontre un hachage qu'il n'attend pas et casse la structure du fichier dans le package.


0 commentaires

0
votes

Cette erreur signifie que le hachage de l'actif dans la base de données interne ne correspond pas au hachage de l'actif téléchargé à partir de Xcode. Cela peut se produire si vous installez votre application via le magasin ou TestFlight, puis réinstallez-la dans Xcode. La solution la plus simple consiste à supprimer l'application de votre appareil. Si votre appareil est jailbreaké, vous pouvez exécuter la commande suivante via SSH:

sqlite3 /private/var/containers/Data/System/*/Documents/Persistence/storeSystem.db "delete from odr_asset_pack where bundle_key like 'app.ish.iSH.%'"


0 commentaires