Недокументированные коды ошибок NSURLErrorDomain (-1001, -1003 и -1004) с использованием StoreKit
Я пишу код, связанный с StoreKit, и я получаю некоторые довольно тревожные коды ошибок, когда я пытаюсь добавить покупку в очередь.
До сих пор я встречал коды ошибок -1003 и -1004, и я не могу найти ничего об этих кодах в Интернете.
Запуск запроса продукта возвращает допустимые номера продуктов, поэтому я не знаю, почему вызовы [[SKPaymentQueue defaultQueue] addPayment:aPayment];
завершились с этой недокументированной проблемой.
Тот же код также работает без ошибок на одном устройстве, но не на другом.
Вопросы, которые у меня есть, пока остаются без ответа:
Что означают эти коды?
Как я могу смягчить эту проблему?
Почему они происходят для покупок, а не для запросов продукта?
Устранение неполадок, которые я выполнил, включает в себя восстановление сертификата подписи и профиля предоставления услуг, изменение сетей Wi-Fi, очистку и сборку и переустановку всех связанных программ и компонентов, и ни одна из этих вещей индивидуально или совместно не помогла устранить проблему.
EDIT:
Нашел обсуждение об этом на форумах Apple dev, но никто из Apple не ответил: https://devforums.apple.com/thread/107121?tstart=75 (учетная запись разработчика iOS требуется для вид)
EDIT:
Сегодня меня поразил код ошибки -1001, чтобы добавить к этому списку необъяснимых и прерывистых проблем. Тем не менее, я не могу отчитываться перед Apple.
EDIT:
У меня есть подозрение, что эти коды ошибок генерируются случайным образом и на самом деле указывают только на то, что песочница выключена. Кто-нибудь еще испытывает эту проблему?
Ответы
Ответ 1
Все коды ошибок включены в "Ссылки на коды ошибок 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,
Ответ 2
У меня похожие проблемы, в моем случае, похоже, связаны с сетевыми подключениями:
Ошибка домена = NSURLErrorDomain Code = -1001 "Тайм-аут запроса".
Что нужно проверить:
- Есть ли вероятность, что ваш сервер не сможет ответить в течение определенного срока? Как 60 секунд или 4 минуты?
- Возможно ли, что ваше устройство переключает сети (WiFi, 3G, VPN)?
- Может ли кто-то (клиент или сервер) ждать аутентификации?
Извините, нет идей, как исправить. Просто отлаживайте это, пытаясь выяснить, в чем проблема (-1021, -1001, -1009)
Обновление: Поиск Google был очень добр, чтобы найти это:
- -1001 TimedOut - потребовалось больше времени, которое было выделено.
- -1003 CannotFindHost - хост не найден.
- -1004 CannotConnectToHost - хост не позволит нам установить соединение.
Ответ 3
см. 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,
Ответ 4
Я использую следующий метод в своем проекте
-(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
}
Но, как вы можете видеть, я прокомментировал коды, которые, как мне кажется, не соответствуют моему определению NO INTERNET. Например, код -1012 (Ошибка аутентификации).
Вы можете редактировать список по своему усмотрению.
В моем проекте я использую его при вводе имени пользователя и пароля от пользователя. И, по моему мнению, (физическое) сетевое подключение может быть единственной причиной, чтобы показывать предупреждение в приложении на базе сети. В любом другом случае (например, неправильная пара слов пользователя/пароля) я предпочитаю делать какую-то пользовательскую дружественную анимацию, ИЛИ просто повторять неудачную попытку снова без какого-либо внимания пользователя. Особенно, если пользователь явно не инициировал сетевой вызов.
Относительно martinezdelariva для ссылки на документацию.
Ответ 5
Я нашел эту страницу в документации, которая содержит перечисление objective-c для всех кодов ошибок в NSURLErrorDomain.
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/index.html#//apple_ref/doc/constant_group/URL_Loading_System_Error_Codes
Ответ 6
Я нашел новый код ошибки, который не описан выше:
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."