Códigos de erro NSURLErrorDomain não documentados (-1001, -1003 e -1004) usando StoreKit


107

Estou escrevendo um código relacionado ao StoreKit e recebo alguns códigos de erro bastante preocupantes quando tento adicionar uma compra à fila.

Até agora, encontrei os códigos de erro -1003 e -1004 e não consigo encontrar nada sobre esses códigos na Internet.

Executar uma solicitação de produto retorna números de produto válidos, então não sei por que as chamadas para [[SKPaymentQueue defaultQueue] addPayment:aPayment];falhariam com este problema não documentado.

O mesmo código também funciona sem erros em um dispositivo, mas não em outro.

As perguntas que tenho estão, ainda, sem resposta:

O que esses códigos significam? Como posso atenuar esse problema? Por que eles estão acontecendo para tentativas de compra e não para solicitações de produtos?

A solução de problemas que fiz inclui a regeneração de um certificado de assinatura e perfil de provisionamento, alteração de redes WiFi, limpeza, criação e reinstalação de todos os softwares e componentes relacionados, e nenhuma dessas coisas individualmente ou em conjunto ajudaram a resolver o problema.

EDITAR:

Encontrei uma discussão sobre isso nos fóruns de desenvolvimento da Apple, mas ninguém da Apple respondeu: https://devforums.apple.com/thread/107121?tstart=75 (conta de desenvolvedor iOS necessária para visualizar)

EDITAR:

Fui atingido com o código de erro -1001 hoje, para adicionar a esta lista de problemas inexplicáveis ​​e intermitentes. Ainda não há responsabilidade da Apple, pelo que posso descobrir.

EDITAR:

Suspeito que esses códigos de erro sejam gerados aleatoriamente e realmente apenas indicam que o Sandbox está inativo. Alguém mais experimentou este problema?

Respostas:


342

Todos os códigos de erro estão em "Referências de códigos de erros CFNetwork" na documentação ( link )

Uma pequena extração para erros CFURL e CFURLConnection:

  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,

2
Eles estão dentro da estrutura CFNetwork> cabeçalho CFNetworkErrors.h.
— Tom Pace

1
Este documento tem mais informações sobre quando os erros ocorrem: família NSURLError
— nove pedras

Essas constantes não compilam no Swift, mas, por exemplo, NSURLErrorUnknownsim. Alguma pista?
— Nicolas Miari,

Oh, deixa
— pra

25

Tenho problemas semelhantes, no meu caso parecem estar relacionados à conectividade de rede:

Error Domain = NSURLErrorDomain Code = -1001 "A solicitação expirou."

Coisas a verificar:

  • Existe alguma chance de seu servidor não ser capaz de responder dentro de algum limite de tempo? Tipo 60 segundos ou 4 minutos?
  • Existe a possibilidade de seu dispositivo estar trocando de rede (WiFi, 3G, VPN)?
  • Alguém (cliente x servidor) está esperando pela autenticação?

Desculpe, não tenho ideias de como consertar. Apenas depurando isso, tentando descobrir qual é o problema (-1021, -1001, -1009)

Atualização: a pesquisa do Google foi muito gentil em encontrar isto:

  • -1001 TimedOut - demorou mais do que o tempo limite alotado.
  • -1003 CannotFindHost - o host não foi encontrado.
  • -1004 CannotConnectToHost - o host não nos permitiu estabelecer uma conexão.

1
"Existe alguma chance de seu servidor não ser capaz de responder dentro de algum limite de tempo?" Você sabe, esse é o assassino, é o servidor da Apple que estou tentando entrar em contato com este código, então não é o meu servidor que está soluçando.
— Hipérbole de

Ei Jom, no iPhone está funcionando bem para nós, mas no iPad às vezes estamos travando, esta mensagem mostra, por exemplo, a mensagem "-1001 TimedOut". Mas minha pergunta é, se o TimedOut deveria vir no iPhone e no iPad. Agradecimentos antecipados @JOM
— Babul

21

veja 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,

3

Eu uso o seguinte método no meu projeto

-(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;
}

Então, eu apenas verifico o código de erro e mostro um alerta se estiver na lista

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

Mas como você pode ver, comentei códigos que acho que não se encaixam na minha definição de NENHUMA INTERNET. Por exemplo, o código -1012 (Falha na autenticação.) Você pode editar a lista como desejar.

No meu projeto, eu uso a entrada de nome de usuário / senha do usuário. E, na minha opinião, erros de conexão de rede (física) podem ser o único motivo para mostrar a exibição de alerta em seu aplicativo baseado em rede. Em qualquer outro caso (por exemplo, par nome de usuário / senha incorreto) eu prefiro fazer alguma animação personalizada amigável, OU apenas repetir a tentativa falhada novamente sem qualquer atenção do usuário. Especialmente se o usuário não iniciou explicitamente uma chamada de rede.

Atenciosamente à martinezdelariva por um link para a documentação.


Isso poderia ser um método de aula!
— ilnar_al

2

Encontrei um novo código de erro que não está documentado acima: 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."

forums.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
— Lakshmi de

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.