Codes d'erreur NSURLErrorDomain non documentés (-1001, -1003 et -1004) à l'aide de StoreKit

107

J'écris du code lié à StoreKit et j'obtiens des codes d'erreur assez troublants lorsque j'essaye d'ajouter un achat à la file d'attente.

Jusqu'à présent, j'ai rencontré les codes d'erreur -1003 et -1004 et je ne trouve rien à propos de ces codes sur Internet.

L'exécution d'une demande de produit renvoie des numéros de produit valides, donc je ne sais pas pourquoi les appels à [[SKPaymentQueue defaultQueue] addPayment:aPayment];échoueraient avec ce problème non documenté.

Le même code fonctionne également sans les erreurs sur un appareil mais pas sur un autre.

Les questions que j'ai sont, pour l'instant, sans réponse:

Que signifient ces codes? Comment puis-je atténuer ce problème? Pourquoi se produisent-ils pour les tentatives d'achat et non pour les demandes de produits?

Le dépannage que j'ai effectué comprend la régénération d'un certificat de signature et d'un profil de provisionnement, la modification des réseaux WiFi, le nettoyage, la création et la réinstallation de tous les logiciels et composants associés, et aucune de ces choses individuellement ou ensemble n'a aidé à résoudre le problème.

ÉDITER:

J'ai trouvé une discussion à ce sujet sur les forums de développement Apple, mais personne d'Apple n'a répondu: https://devforums.apple.com/thread/107121?tstart=75 (compte de développeur iOS requis pour afficher)

ÉDITER:

J'ai reçu le code d'erreur -1001 aujourd'hui, pour ajouter à cette liste des problèmes inexplicables et intermittents. Toujours aucune responsabilité d'Apple, que je puisse trouver.

ÉDITER:

Je soupçonne que ces codes d'erreur sont générés aléatoirement et n'indiquent vraiment que le bac à sable est en panne. Quelqu'un d'autre rencontre ce problème?

Hyperbole
la source

Réponses:

342

Tous les codes d'erreur se trouvent sur «Références des codes d'erreur CFNetwork» dans la documentation ( lien )

Une petite extraction pour les erreurs de connexion CFURL et CFURLC:

  kCFURLErrorUnknown   = -998,
  kCFURLErrorCancelled = -999,
  kCFURLErrorBadURL    = -1000,
  kCFURLErrorTimedOut  = -1001,
  kCFURLErrorUnsupportedURL = -1002,
  kCFURLErrorCannotFindHost = -1003,
  kCFURLErrorCannotConnectToHost    = -1004,
  kCFURLErrorNetworkConnectionLost  = -1005,
  kCFURLErrorDNSLookupFailed        = -1006,
  kCFURLErrorHTTPTooManyRedirects   = -1007,
  kCFURLErrorResourceUnavailable    = -1008,
  kCFURLErrorNotConnectedToInternet = -1009,
  kCFURLErrorRedirectToNonExistentLocation = -1010,
  kCFURLErrorBadServerResponse             = -1011,
  kCFURLErrorUserCancelledAuthentication   = -1012,
  kCFURLErrorUserAuthenticationRequired    = -1013,
  kCFURLErrorZeroByteResource        = -1014,
  kCFURLErrorCannotDecodeRawData     = -1015,
  kCFURLErrorCannotDecodeContentData = -1016,
  kCFURLErrorCannotParseResponse     = -1017,
  kCFURLErrorInternationalRoamingOff = -1018,
  kCFURLErrorCallIsActive               = -1019,
  kCFURLErrorDataNotAllowed             = -1020,
  kCFURLErrorRequestBodyStreamExhausted = -1021,
  kCFURLErrorFileDoesNotExist           = -1100,
  kCFURLErrorFileIsDirectory            = -1101,
  kCFURLErrorNoPermissionsToReadFile    = -1102,
  kCFURLErrorDataLengthExceedsMaximum   = -1103,
martinezdelariva
la source
2
Ceux-ci se trouvent dans le cadre CFNetwork> l'en-tête CFNetworkErrors.h.
Tom Pace du
1
Ce document contient plus d'informations sur les erreurs: NSURLError family
nine stones
Ces constantes ne se compilent pas dans Swift, mais par exemple NSURLErrorUnknown. Des indices?
Nicolas Miari
Oh, tant pis ... retrouvez la version Swift ici: developer.apple.com/library/mac/documentation/Networking/...
Nicolas Miari
25

J'ai des problèmes similaires, dans mon cas semblent être liés à la connectivité réseau:

Domaine d'erreur = NSURLErrorDomain Code = -1001 "La demande a expiré."

Choses à vérifier:

  • Y a-t-il un risque que votre serveur ne soit pas en mesure de répondre dans un certain délai? Comme 60 secondes ou 4 minutes?
  • Est-il possible que votre appareil change de réseau (WiFi, 3G, VPN)?
  • Quelqu'un (client ou serveur) pourrait-il attendre l'authentification?

Désolé, aucune idée de comment résoudre ce problème. Débogage juste ceci, essayant de découvrir quel est le problème (-1021, -1001, -1009)

Mise à jour: la recherche Google a été très gentille pour trouver ceci:

  • -1001 TimedOut - cela a pris plus de temps que le délai imparti.
  • -1003 CannotFindHost - l'hôte est introuvable.
  • -1004 CannotConnectToHost - l'hôte ne nous a pas laissé établir une connexion.
JOM
la source
1
"Y a-t-il une chance que votre serveur ne soit pas en mesure de répondre dans un certain délai?" Vous savez, c'est le tueur, c'est le serveur d'Apple que j'essaie de contacter avec ce code, donc ce n'est pas mon serveur qui a le hoquet.
Hyperbole
Hé Jom, dans l'iPhone, cela fonctionne bien pour nous, mais dans l'iPad, nous avons parfois des plantages, ce message affiche le message "-1001 TimedOut". Mais ma question est la suivante: si TimedOut, il devrait être disponible sur iPhone et iPad. Thanks in Advance @JOM
Babul
21

voir NSURLError.h Define

NSURLErrorUnknown =             -1,
NSURLErrorCancelled =           -999,
NSURLErrorBadURL =              -1000,
NSURLErrorTimedOut =            -1001,
NSURLErrorUnsupportedURL =          -1002,
NSURLErrorCannotFindHost =          -1003,
NSURLErrorCannotConnectToHost =         -1004,
NSURLErrorNetworkConnectionLost =       -1005,
NSURLErrorDNSLookupFailed =         -1006,
NSURLErrorHTTPTooManyRedirects =        -1007,
NSURLErrorResourceUnavailable =         -1008,
NSURLErrorNotConnectedToInternet =      -1009,
NSURLErrorRedirectToNonExistentLocation =   -1010,
NSURLErrorBadServerResponse =       -1011,
NSURLErrorUserCancelledAuthentication =     -1012,
NSURLErrorUserAuthenticationRequired =  -1013,
NSURLErrorZeroByteResource =        -1014,
NSURLErrorCannotDecodeRawData =             -1015,
NSURLErrorCannotDecodeContentData =         -1016,
NSURLErrorCannotParseResponse =             -1017,
NSURLErrorAppTransportSecurityRequiresSecureConnection NS_ENUM_AVAILABLE(10_11, 9_0) = -1022,
NSURLErrorFileDoesNotExist =        -1100,
NSURLErrorFileIsDirectory =         -1101,
NSURLErrorNoPermissionsToReadFile =     -1102,
NSURLErrorDataLengthExceedsMaximum NS_ENUM_AVAILABLE(10_5, 2_0) =   -1103,

// SSL errors
NSURLErrorSecureConnectionFailed =      -1200,
NSURLErrorServerCertificateHasBadDate =     -1201,
NSURLErrorServerCertificateUntrusted =  -1202,
NSURLErrorServerCertificateHasUnknownRoot = -1203,
NSURLErrorServerCertificateNotYetValid =    -1204,
NSURLErrorClientCertificateRejected =   -1205,
NSURLErrorClientCertificateRequired =   -1206,
NSURLErrorCannotLoadFromNetwork =       -2000,

// Download and file I/O errors
NSURLErrorCannotCreateFile =        -3000,
NSURLErrorCannotOpenFile =          -3001,
NSURLErrorCannotCloseFile =         -3002,
NSURLErrorCannotWriteToFile =       -3003,
NSURLErrorCannotRemoveFile =        -3004,
NSURLErrorCannotMoveFile =          -3005,
NSURLErrorDownloadDecodingFailedMidStream = -3006,
NSURLErrorDownloadDecodingFailedToComplete =-3007,

NSURLErrorInternationalRoamingOff NS_ENUM_AVAILABLE(10_7, 3_0) =         -1018,
NSURLErrorCallIsActive NS_ENUM_AVAILABLE(10_7, 3_0) =                    -1019,
NSURLErrorDataNotAllowed NS_ENUM_AVAILABLE(10_7, 3_0) =                  -1020,
NSURLErrorRequestBodyStreamExhausted NS_ENUM_AVAILABLE(10_7, 3_0) =      -1021,

NSURLErrorBackgroundSessionRequiresSharedContainer NS_ENUM_AVAILABLE(10_10, 8_0) = -995,
NSURLErrorBackgroundSessionInUseByAnotherProcess NS_ENUM_AVAILABLE(10_10, 8_0) = -996,
NSURLErrorBackgroundSessionWasDisconnected NS_ENUM_AVAILABLE(10_10, 8_0)= -997,
Acorld
la source
3

J'utilise la méthode suivante dans mon projet

-(NSArray*)networkErrorCodes
{
    static NSArray *codesArray;
    if (![codesArray count]){
        @synchronized(self){
            const int codes[] = {
                //kCFURLErrorUnknown,     //-998
                //kCFURLErrorCancelled,   //-999
                //kCFURLErrorBadURL,      //-1000
                //kCFURLErrorTimedOut,    //-1001
                //kCFURLErrorUnsupportedURL, //-1002
                //kCFURLErrorCannotFindHost, //-1003
                kCFURLErrorCannotConnectToHost,     //-1004
                kCFURLErrorNetworkConnectionLost,   //-1005
                kCFURLErrorDNSLookupFailed,         //-1006
                //kCFURLErrorHTTPTooManyRedirects,    //-1007
                kCFURLErrorResourceUnavailable,     //-1008
                kCFURLErrorNotConnectedToInternet,  //-1009
                //kCFURLErrorRedirectToNonExistentLocation,   //-1010
                kCFURLErrorBadServerResponse,               //-1011
                //kCFURLErrorUserCancelledAuthentication,     //-1012
                //kCFURLErrorUserAuthenticationRequired,      //-1013
                //kCFURLErrorZeroByteResource,        //-1014
                //kCFURLErrorCannotDecodeRawData,     //-1015
                //kCFURLErrorCannotDecodeContentData, //-1016
                //kCFURLErrorCannotParseResponse,     //-1017
                kCFURLErrorInternationalRoamingOff, //-1018
                kCFURLErrorCallIsActive,                //-1019
                //kCFURLErrorDataNotAllowed,              //-1020
                //kCFURLErrorRequestBodyStreamExhausted,  //-1021
                kCFURLErrorFileDoesNotExist,            //-1100
                //kCFURLErrorFileIsDirectory,             //-1101
                kCFURLErrorNoPermissionsToReadFile,     //-1102
                //kCFURLErrorDataLengthExceedsMaximum,     //-1103
            };
            int size = sizeof(codes)/sizeof(int);
            NSMutableArray *array = [[NSMutableArray alloc] init];
            for (int i=0;i<size;++i){
                [array addObject:[NSNumber numberWithInt:codes[i]]];
            }
            codesArray = [array copy];
        }
    }
    return codesArray;
}

Ensuite, je vérifie simplement le code d'erreur et affiche l'alerte s'il est dans la liste

if ([[self networkErrorCodes] containsObject:[NSNumber
numberWithInt:[error code]]]){ 
// Fire Alert View Here
}

Mais comme vous pouvez le voir, j'ai commenté des codes qui, à mon avis, ne correspondent pas à ma définition de PAS D'INTERNET. Par exemple, le code -1012 (échec d'authentification.) Vous pouvez modifier la liste comme vous le souhaitez.

Dans mon projet, je l'utilise lors de la saisie du nom d'utilisateur / mot de passe de l'utilisateur. Et à mon avis, les erreurs de connexion réseau (physique) pourraient être la seule raison d'afficher la vue d'alerte dans votre application basée sur le réseau. Dans tous les autres cas (par exemple une paire nom d'utilisateur / mot de passe incorrecte), je préfère faire une animation conviviale personnalisée, OU simplement répéter la tentative infructueuse à nouveau sans aucune attention de l'utilisateur. Surtout si l'utilisateur n'a pas explicitement lancé un appel réseau.

Salutations à martinezdelariva pour un lien vers la documentation.

ilnar_al
la source
Cela pourrait être une méthode de classe!
ilnar_al
2

J'ai trouvé un nouveau code d'erreur qui n'est pas documenté ci-dessus: CFNetworkErrorCode -1022

Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection."
ben
la source
forums.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Lakshmi