Недокументированные коды ошибок NSURLErrorDomain (-1001, -1003 и -1004) с использованием StoreKit

107

Я пишу код, связанный с StoreKit, и при попытке добавить покупку в очередь получаю довольно неприятные коды ошибок.

До сих пор я сталкивался с кодами ошибок -1003 и -1004, и я ничего не могу найти об этих кодах в Интернете.

Выполнение запроса продукта возвращает действительные номера продуктов, поэтому я не знаю, почему при [[SKPaymentQueue defaultQueue] addPayment:aPayment];вызове этой недокументированной проблемы не удается выполнить вызовы .

Тот же код также работает без ошибок на одном устройстве, но не на другом.

Вопросы, которые у меня есть, пока остаются без ответа:

Что означают эти коды? Как я могу решить эту проблему? Почему они происходят для попыток покупки, а не для запросов продукта?

Устранение неполадок, которое я сделал, включает в себя восстановление сертификата подписи и профиля обеспечения, изменение сетей Wi-Fi, очистку, создание и переустановку всего связанного программного обеспечения и компонентов, и ни одно из этих действий по отдельности или вместе не помогло решить проблему.

РЕДАКТИРОВАТЬ:

Нашел обсуждение этого вопроса на форумах разработчиков Apple, но никто из Apple не ответил: https://devforums.apple.com/thread/107121?tstart=75 (для просмотра требуется учетная запись разработчика iOS)

РЕДАКТИРОВАТЬ:

Сегодня я получил код ошибки -1001, чтобы добавить к этому списку необъяснимых и периодически возникающих проблем. По-прежнему никакой ответственности от Apple, насколько я могу судить.

РЕДАКТИРОВАТЬ:

У меня есть подозрение, что эти коды ошибок генерируются случайным образом и на самом деле указывают только на то, что песочница не работает. Кто-нибудь еще испытывает эту проблему?

Гипербола
источник

Ответы:

342

Все коды ошибок находятся в «Справочниках по кодам ошибок CFNetwork» в документации ( ссылка ).

Небольшое извлечение для ошибок подключения CFURL и 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
источник
2
Они находятся в рамках CFNetwork framework> заголовок CFNetworkErrors.h.
Том Пейс
1
В этом документе есть дополнительная информация о том, когда возникают ошибки: Семейство NSURLError
девять камней
Эти константы не компилируются в Swift, но, например, компилируются NSURLErrorUnknown. Какие-нибудь подсказки?
Николас Миари
Ой, неважно ... нашел версию Swift здесь: developer.apple.com/library/mac/documentation/Networking/ ...
Николас Миари
25

У меня похожие проблемы, в моем случае, похоже, связанные с подключением к сети:

Ошибка домена = NSURLErrorDomain Code = -1001 «Истекло время ожидания запроса».

Что нужно проверить:

  • Есть ли вероятность, что ваш сервер не сможет ответить в течение определенного времени? Как 60 секунд или 4 минуты?
  • Есть ли вероятность, что ваше устройство переключает сети (WiFi, 3G, VPN)?
  • Может ли кто-то (клиент или сервер) ждать аутентификации?

Извините, нет идей, как исправить. Просто отлаживайте это, пытаясь выяснить, в чем проблема (-1021, -1001, -1009)

Обновление: поиск Google был очень любезен, чтобы найти это:

  • -1001 TimedOut - это заняло больше времени, чем выделенный тайм-аут.
  • -1003 CannotFindHost - хост не найден.
  • -1004 CannotConnectToHost - хост не позволяет нам установить соединение.
JOM
источник
1
«Есть ли шанс, что ваш сервер не сможет ответить в течение определенного времени?» Вы знаете, это убийца, это сервер Apple, с которым я пытаюсь связаться с этим кодом, так что это не мой сервер икает.
Hyperbole
Привет, Джом, в iPhone это работает хорошо, но в iPad иногда возникают сбои, это сообщение показывает, например, сообщение «-1001 TimedOut». Но мой вопрос: если TimedOut должен быть и на iPhone, и на iPad. Заранее спасибо @JOM
Babul
21

см. NSURLError.h Определить

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
источник
3

Я использую в своем проекте следующий метод

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

Затем я просто проверяю код ошибки и показываю предупреждение, если он есть в списке

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

Но, как вы можете видеть, я закомментировал коды, которые, на мой взгляд, не подходят под мое определение ОТСУТСТВИЯ ИНТЕРНЕТА. Например, код -1012 (Ошибка аутентификации). Вы можете редактировать список по своему усмотрению.

В своем проекте я использую его при вводе имени пользователя / пароля от пользователя. И, на мой взгляд, (физические) ошибки сетевого подключения могут быть единственной причиной для отображения представления предупреждений в вашем сетевом приложении. В любом другом случае (например, неверная пара имени пользователя и пароля) я предпочитаю сделать некоторую настраиваемую, удобную для пользователя анимацию ИЛИ просто повторить неудачную попытку снова без какого-либо внимания пользователя. Особенно, если пользователь явно не инициировал сетевой вызов.

С уважением к martinezdelariva за ссылку на документацию.

ilnar_al
источник
Это может быть метод класса!
ilnar_al
2

Я обнаружил новый код ошибки, который не описан выше: 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."
Бен
источник
форумы.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Лакшми