Undokumentierte NSURLErrorDomain-Fehlercodes (-1001, -1003 und -1004) mit StoreKit

106

Ich schreibe StoreKit-bezogenen Code und erhalte einige ziemlich problematische Fehlercodes, wenn ich versuche, der Warteschlange einen Kauf hinzuzufügen.

Bisher sind die Fehlercodes -1003 und -1004 aufgetreten, und ich kann im Internet nichts über diese Codes finden.

Wenn Sie eine Produktanforderung ausführen, werden gültige Produktnummern zurückgegeben. Daher weiß ich nicht, warum Anrufe [[SKPaymentQueue defaultQueue] addPayment:aPayment];bei diesem undokumentierten Problem fehlschlagen würden.

Der gleiche Code funktioniert auch ohne Fehler auf einem Gerät, jedoch nicht auf einem anderen.

Die Fragen, die ich habe, sind noch nicht beantwortet:

Was bedeuten diese Codes? Wie kann ich dieses Problem beheben? Warum treten sie bei Kaufversuchen und nicht bei Produktanfragen auf?

Die Fehlerbehebung, die ich durchgeführt habe, umfasst das Neuerstellen eines Signaturzertifikats und eines Bereitstellungsprofils, das Ändern von WiFi-Netzwerken, das Bereinigen und Erstellen sowie die Neuinstallation aller zugehörigen Software und Komponenten. Keines dieser Dinge einzeln oder zusammen hat zur Behebung des Problems beigetragen.

BEARBEITEN:

In den Apple-Entwicklerforen wurde eine Diskussion darüber gefunden, aber niemand von Apple hat geantwortet: https://devforums.apple.com/thread/107121?tstart=75 Entwicklerforen wurde (iOS-Entwicklerkonto zum Anzeigen erforderlich)

BEARBEITEN:

Ich wurde heute mit dem Fehlercode -1001 getroffen, um dieser Liste unerklärlicher und zeitweise auftretender Probleme hinzuzufügen. Immer noch keine Verantwortlichkeit von Apple, die ich finden kann.

BEARBEITEN:

Ich habe den Verdacht, dass diese Fehlercodes zufällig generiert werden und nur darauf hinweisen, dass die Sandbox nicht verfügbar ist. Hat noch jemand dieses Problem?

Hyperbel
quelle

Antworten:

341

Alle Fehlercodes finden Sie in der Dokumentation unter "CFNetwork Errors Codes References" ( Link ).

Eine kleine Extraktion für CFURL- und CFURLConnection-Fehler:

  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
quelle
2
Diese befinden sich im Header CFNetwork Framework> CFNetworkErrors.h.
Tom Pace
1
Dieses Dokument enthält weitere Informationen zum Auftreten von Fehlern: NSURLError-Familie
neun Steine
Diese Konstanten werden in Swift nicht kompiliert, aber z NSURLErrorUnknown. Irgendwelche Hinweise?
Nicolas Miari
Oh,
egal
25

Ich habe ähnliche Probleme, in meinem Fall scheint dies mit der Netzwerkkonnektivität zu tun zu haben:

Error Domain = NSURLErrorDomain Code = -1001 "Die Anforderung ist abgelaufen."

Dinge zu überprüfen:

  • Besteht die Möglichkeit, dass Ihr Server nicht innerhalb eines bestimmten Zeitraums antworten kann? Wie 60 Sekunden oder 4 Minuten?
  • Gibt es eine Möglichkeit, dass Ihr Gerät Netzwerke wechselt (WiFi, 3G, VPN)?
  • Könnte jemand (Client vs. Server) auf die Authentifizierung warten?

Sorry, keine Ideen, wie man das behebt. Debuggen Sie dies einfach und versuchen Sie herauszufinden, wo das Problem liegt (-1021, -1001, -1009).

Update: Die Google-Suche war sehr nett, dies zu finden:

  • -1001 TimedOut - Es dauerte länger als das festgelegte Timeout.
  • -1003 CannotFindHost - Der Host wurde nicht gefunden.
  • -1004 CannotConnectToHost - Der Host lässt uns keine Verbindung herstellen.
JOM
quelle
1
"Besteht die Möglichkeit, dass Ihr Server nicht innerhalb eines bestimmten Zeitraums antworten kann?" Weißt du, das ist der Mörder, es ist Apples Server, mit dem ich Kontakt aufnehmen möchte, also ist es nicht mein Server, der Schluckauf hat.
Übertreibung
Hey Jom, auf dem iPhone funktioniert es gut für uns, aber auf dem iPad kommt es manchmal zu Abstürzen. Diese Meldung zeigt die Meldung "-1001 TimedOut" an. Aber meine Frage ist, ob TimedOut sowohl auf dem iPhone als auch auf dem iPad verfügbar sein sollte. Vielen Dank im Voraus @JOM
Babul
21

siehe NSURLError.h Definieren

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
quelle
3

Ich verwende die folgende Methode in meinem Projekt

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

Dann überprüfe ich einfach den Fehlercode und zeige Alarm, wenn er in der Liste enthalten ist

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

Aber wie Sie sehen, habe ich Codes auskommentiert, die meiner Meinung nach nicht zu meiner Definition von NO INTERNET passen. ZB der Code -1012 (Authentifizierung fehlgeschlagen). Sie können die Liste nach Belieben bearbeiten.

In meinem Projekt verwende ich es unter Benutzername / Passwort, die vom Benutzer eingegeben werden. Meiner Ansicht nach können (physische) Netzwerkverbindungsfehler der einzige Grund sein, die Warnansicht in Ihrer netzwerkbasierten App anzuzeigen. In jedem anderen Fall (z. B. falsches Paar aus Benutzername und Passwort) bevorzuge ich eine benutzerdefinierte benutzerfreundliche Animation oder wiederhole den fehlgeschlagenen Versuch erneut, ohne dass der Benutzer darauf achtet. Insbesondere, wenn der Benutzer keinen Netzwerkanruf explizit initiiert hat.

Grüße an martinezdelariva für einen Link zur Dokumentation.

ilnar_al
quelle
Das könnte eine Klassenmethode sein!
ilnar_al
2

Ich habe einen neuen Fehlercode gefunden, der oben nicht dokumentiert ist: 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
quelle
forums.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Lakshmi