Nieudokumentowane kody błędów NSURLErrorDomain (-1001, -1003 i -1004) przy użyciu StoreKit

107

Piszę kod związany z StoreKit i otrzymuję dość kłopotliwe kody błędów, gdy próbuję dodać zakup do kolejki.

Jak dotąd napotkałem kody błędów -1003 i -1004 i nie mogę znaleźć nic o tych kodach w Internecie.

Uruchomienie żądania produktu zwraca prawidłowe numery produktów, więc nie wiem, dlaczego wywołania do strony [[SKPaymentQueue defaultQueue] addPayment:aPayment];miałyby zakończyć się niepowodzeniem w przypadku tego nieudokumentowanego problemu.

Ten sam kod działa również bez błędów na jednym urządzeniu, ale nie na innym.

Pytania, które mam, na razie pozostają bez odpowiedzi:

Co oznaczają te kody? Jak mogę złagodzić ten problem? Dlaczego mają miejsce w przypadku prób zakupu, a nie próśb o produkty?

Rozwiązywanie problemów, które zrobiłem, obejmuje regenerację certyfikatu podpisywania i profilu aprowizacji, zmianę sieci Wi-Fi, czyszczenie i budowanie oraz ponowną instalację całego powiązanego oprogramowania i składników, a żadna z tych rzeczy, pojedynczo lub razem, nie pomogła w rozwiązaniu problemu.

EDYTOWAĆ:

Znalazłem dyskusję na ten temat na forach programistów Apple, ale nikt z Apple nie odpowiedział: https://devforums.apple.com/thread/107121?tstart=75 (do wyświetlenia wymagane jest konto programisty iOS)

EDYTOWAĆ:

Zostałem dzisiaj trafiony kodem błędu -1001, aby dodać do tej listy niewytłumaczalne i sporadyczne problemy. Wciąż nie mogę znaleźć żadnej odpowiedzialności ze strony Apple.

EDYTOWAĆ:

Podejrzewam, że te kody błędów są generowane losowo i tak naprawdę tylko wskazują, że piaskownica nie działa. Czy ktoś jeszcze ma ten problem?

Hiperbola
źródło

Odpowiedzi:

342

Wszystkie kody błędów znajdują się w sekcji „Odnośniki kodów błędów sieci CFNetwork” w dokumentacji ( łącze )

Małe wyodrębnienie błędów CFURL i 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
źródło
2
Znajdują się one w strukturze CFNetwork> nagłówka CFNetworkErrors.h.
Tom Pace,
1
Ten dokument zawiera więcej informacji o wystąpieniu błędów: NSURLError family
dziewięć kamieni
Te stałe nie kompilują się w Swift, ale np NSURLErrorUnknown. Tak. Jakieś wskazówki?
Nicolas Miari,
Och, nieważne ... znalazłem wersję Swift tutaj: developer.apple.com/library/mac/documentation/Networking/…
Nicolas Miari
25

Mam podobne problemy, w moim przypadku wydają się być związane z łącznością sieciową:

Error Domain = NSURLErrorDomain Code = -1001 "Przekroczono limit czasu żądania."

Rzeczy do sprawdzenia:

  • Czy jest szansa, że ​​Twój serwer nie będzie w stanie odpowiedzieć w określonym czasie? Jak 60 sekund czy 4 minuty?
  • Czy istnieje możliwość, że Twoje urządzenie przełącza sieci (WiFi, 3G, VPN)?
  • Czy ktoś (klient kontra serwer) mógł czekać na uwierzytelnienie?

Przepraszamy, brak pomysłów, jak to naprawić. Po prostu debuguję to, próbując dowiedzieć się, w czym jest problem (-1021, -1001, -1009)

Aktualizacja: wyszukiwarka Google była bardzo miła, aby znaleźć to:

  • -1001 TimedOut - trwało to dłużej niż wyznaczony limit czasu.
  • -1003 CannotFindHost - nie można znaleźć hosta.
  • -1004 CannotConnectToHost - host nie pozwolił nam nawiązać połączenia.
JOM
źródło
1
„Czy jest szansa, że ​​Twój serwer nie będzie w stanie odpowiedzieć w określonym czasie?” Wiesz, to zabójca, to serwer Apple, z którym próbuję się skontaktować za pomocą tego kodu, więc to nie mój serwer czuje.
Hyperbole,
Hej Jom, w iPhonie to działa dobrze, ale w iPadzie czasami dochodzi do awarii, ten komunikat pokazuje np. Komunikat „-1001 TimedOut”. Ale moje pytanie brzmi, jeśli TimedOut powinien być dostępny zarówno na iPhonie, jak i iPadzie. Dzięki z góry @JOM
Babul,
21

zobacz 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
źródło
3

W moim projekcie używam następującej metody

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

Następnie po prostu sprawdzam kod błędu i pokazuję alert, jeśli jest na liście

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

Ale jak widać, wykomentowałem kody, które moim zdaniem nie pasują do mojej definicji BRAKU INTERNETU. Np. Kod -1012 (Niepowodzenie uwierzytelnienia). Listę możesz dowolnie edytować.

W moim projekcie używam go przy wpisywaniu nazwy użytkownika / hasła od użytkownika. Moim zdaniem (fizyczne) błędy połączenia sieciowego mogą być jedynym powodem wyświetlania widoku alertów w aplikacji sieciowej. W każdym innym przypadku (np. Niepoprawna para nazwa użytkownika / hasło) wolę wykonać niestandardową, przyjazną dla użytkownika animację LUB po prostu powtórzyć nieudaną próbę ponownie bez żadnej uwagi użytkownika. Zwłaszcza jeśli użytkownik nie zainicjował jawnie połączenia sieciowego.

Pozdrawiam martinezdelariva za link do dokumentacji.

ilnar_al
źródło
To mogłaby być metoda klasowa!
ilnar_al
2

Znalazłem nowy kod błędu, który nie jest udokumentowany powyżej: 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
źródło
forums.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Lakshmi