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?

Hipérbole
fonte

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,
martinezdelariva
fonte
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.
JOM
fonte
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,
Acorld
fonte
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.

ilnar_al
fonte
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."
ben
fonte
forums.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Lakshmi de