Недокументированные коды ошибок NSURLErrorDomain (-1001, -1003 и -1004) с использованием StoreKit
Я пишу код, связанный с StoreKit, и я получаю некоторые довольно тревожные коды ошибок, когда пытаюсь добавить покупку в очередь.
до сих пор я испытал коды ошибок -1003 и -1004, и я ничего не могу найти об этих кодах в интернете.
запуск запроса продукта возвращает допустимые номера продуктов, поэтому я не знаю, почему вызовы [[SKPaymentQueue defaultQueue] addPayment:aPayment];
не удалось бы с этой недокументированной проблемой.
один и тот же код работает без ошибок на одном устройство, но не на другом.
вопросы, которые у меня есть, пока еще без ответа:
Что означают эти коды? Как я могу смягчить эту проблему? Почему они происходят для попыток покупки, а не для запросов продукта?
Устранение неполадок, которые я сделал, включает в себя восстановление сертификата подписи и профиля подготовки, изменение сетей WiFi, очистку, создание и переустановку всего связанного программного обеспечения и компонентов, и ни одна из этих вещей по отдельности или вместе помогли решить проблему.
изменить:
нашел обсуждение об этом на форумах Apple dev, но никто из Apple не ответил:https://devforums.apple.com/thread/107121?tstart=75 (учетная запись разработчика iOS требуется для просмотра)
изменить:
сегодня я был поражен кодом ошибки -1001, чтобы добавить к этому списку необъяснимых и прерывистых проблем. До сих пор нет отчетности от Apple, что я могу находить.
изменить:
У меня есть подозрение, что эти коды ошибок генерируются случайным образом и действительно указывают только на то, что песочница не работает. Кто-нибудь еще испытывает эту проблему?
6 ответов
все коды ошибок находятся на "ссылках кодов ошибок 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,
У меня похожие проблемы, в моем случае, похоже, связаны с сетевым подключением:
ошибка Domain=NSURLErrorDomain код=-1001 "время запроса истекло."
вещи для проверки:
- есть ли вероятность, что ваш сервер не сможет ответить в течение некоторого срока? 60 секунд или 4 минуты?
- есть ли вероятность, что ваше устройство переключает сети (WiFi, 3G, VPN)?
- кто-то может (клиент против сервера) ждет аутентификации?
извините, нет идей, как исправить. Просто отладка это, пытаясь выяснить, в чем проблема (-1021, -1001, -1009)
обновление: поиск Google был очень любезен, чтобы найти это:
- -1001 TimedOut - это заняло больше времени, чем тайм-аут, который, отведенное.
- -1003 CannotFindHost-хост не найден.
- -1004 CannotConnectToHost-хост не позволил нам установить связь.
см. 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,
Я использую следующий метод в моем проекте
-(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 для ссылки на документацию.
Я нашел эту страницу в документации, которая имеет перечисление objective-c для всех кодов ошибок под NSURLErrorDomain.
Я нашел новый код ошибки, которая не описана выше: 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."