web-dev-qa-db-fra.com

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

J'écris du code lié à StoreKit et j'obtiens des codes d'erreur plutôt troublants lorsque j'essaie 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 sur ces codes sur Internet.

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

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

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

Que signifient ces codes? Comment puis-je résoudre 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é inclut la régénération d'un certificat de signature et d'un profil d'approvisionnement, la modification de réseaux WiFi, le nettoyage, la construction et la réinstallation de tous les logiciels et composants associés. Aucune de ces choses, individuellement ou conjointement, n'a permis de résoudre le problème.

MODIFIER:

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

MODIFIER:

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

MODIFIER:

Je soupçonne que ces codes d'erreur sont générés de manière aléatoire et indiquent uniquement que la Sandbox est en panne. Quelqu'un d'autre a ce problème?

102
Hyperbole

Tous les codes d'erreur figurent dans "Références des codes d'erreur CFNetwork" dans la documentation ( lien ).

Une petite extraction pour CFURL et CFURLConnection Erreurs:

  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,
332
martinezdelariva

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

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

Choses à vérifier:

  • Est-il possible que votre serveur ne soit pas en mesure de répondre dans un délai donné? Comme 60 secondes ou 4 minutes?
  • Est-il possible que votre appareil change de réseau (WiFi, 3G, VPN)?
  • Quelqu'un (client ou serveur) est-il en attente d'authentification?

Désolé, pas d'idées pour résoudre ce problème. Juste en train de déboguer ceci, en essayant de trouver le problème (-1021, -1001, -1009)

Mise à jour: La recherche Google était très gentille de trouver ceci:

  • -1001 TimedOut - il a fallu plus de temps que le délai imparti.
  • -1003 CannotFindHost - L'hôte n'a pas pu être trouvé.
  • -1004 CannotConnectToHost - l'hôte ne nous a pas laissé établir une connexion.
25
JOM

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,
17
Acorld

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 montre l'alerte si elle se trouve dans la liste.

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

Mais comme vous pouvez le constater, j'ai commenté des codes qui, à mon avis, ne correspondent pas à ma définition de NO INTERNET. Par exemple, le code -1012 (échec de l’authentification.) Vous pouvez modifier la liste à votre guise.

Dans mon projet, je l’utilise avec un nom d’utilisateur/mot de passe. Et à mon avis, les erreurs de connexion réseau (physiques) pourraient être la seule raison d'afficher un affichage d'alerte dans votre application réseau. Dans tous les autres cas (par exemple, une paire nom d'utilisateur/mot de passe incorrect), je préfère effectuer une animation personnalisée conviviale, OR, il suffit de répéter la tentative infructueuse à nouveau, sans que l'utilisateur se préoccupe de rien. En particulier si l'utilisateur n'a pas pas explicitement lancé un appel réseau.

Cordialement à martinezdelariva pour un lien vers la documentation.

3
ilnar_al

J'ai trouvé cette page dans la documentation qui a un objectif-c enum pour tous les codes d'erreur sous le NSURLErrorDomain.

https://developer.Apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Fiscation/Foundation_Constants/index.html#//Apple_ref/doc/constant_group/URL_Loading_System_Error_Codes

1
Jon

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."
0
ben