Недокументированные коды ошибок NSURLErrorDomain (-1001, -1003 и -1004) с использованием StoreKit
Я пишу код, связанный с StoreKit, и получаю довольно тревожные коды ошибок, когда пытаюсь добавить покупку в очередь.
До сих пор я сталкивался с кодами ошибок -1003 и -1004 и ничего не могу найти об этих кодах в Интернете.
Запуск запроса продукта возвращает действительные номера продуктов, поэтому я не знаю, почему звонит [[SKPaymentQueue defaultQueue] addPayment:aPayment];
потерпит неудачу с этой недокументированной проблемой.
Этот код также работает без ошибок на одном устройстве, но не на другом.
На мои вопросы пока нет ответа:
Что означают эти коды? Как я могу смягчить эту проблему? Почему они происходят для попыток покупки, а не для запросов продукта?
Устранение неисправностей, которое я сделал, включает восстановление сертификата подписи и профиля обеспечения, изменение сетей WiFi, очистку, сборку и переустановку всего связанного программного обеспечения и компонентов, и ни одно из этих действий по отдельности или вместе не помогло решить проблему.
РЕДАКТИРОВАТЬ:
Обсудили это на форумах разработчиков Apple, но никто из Apple не ответил: https://devforums.apple.com/thread/107121?tstart=75 (для просмотра требуется учетная запись разработчика iOS)
РЕДАКТИРОВАТЬ:
Сегодня я получил код ошибки -1001, чтобы добавить в этот список необъяснимых и периодических проблем. До сих пор нет ответственности от Apple, которую я могу найти.
РЕДАКТИРОВАТЬ:
У меня есть подозрение, что эти коды ошибок генерируются случайным образом и действительно указывают только на то, что Песочница не работает. Кто-нибудь еще испытывает эту проблему?
7 ответов
Все коды ошибок указаны в разделе "Ссылки на коды ошибок 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,
У меня есть похожие проблемы, в моем случае, похоже, связаны с сетевым подключением:
Ошибка домена =NSURLErrorDomain Code=-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 для ссылки на документацию.
Я нашел новый код ошибки, который не задокументирован выше: 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."
Я нашел эту страницу в документации, которая содержит перечисление target-c для всех кодов ошибок в NSURLErrorDomain.
Следующий сайт также очень полезен для поиска недокументированных или труднодоступных кодов ошибок Apple API:
Вы можете указать только код ошибки (например, -1001 илиkCFURLErrorTimedOut
) или даже используемую вами платформу или API (например,CFNetwork
,NSURL
илиAVAudioSession
), и сайт отобразит все потенциальные ошибки, соответствующие вашему запросу, с указанием имен ошибок, соответствующей платформы и файлов заголовков, в которых определены ошибки.