Недокументовані коди помилок NSURLErrorDomain (-1001, -1003 та -1004) за допомогою StoreKit


107

Я пишу код, пов'язаний з StoreKit, і отримую досить тривожні коди помилок, коли намагаюся додати покупку до черги.

Поки я відчував коди помилок -1003 і -1004, і нічого не можу знайти про ці коди в Інтернеті.

Запуск запиту на продукт повертає дійсні номери продуктів, тому я не знаю, чому дзвінки [[SKPaymentQueue defaultQueue] addPayment:aPayment];не зможуть уникнути цієї недокументованої проблеми.

Цей же код також працює без помилок на одному пристрої, але не на іншому.

На сьогодні питання, на які я не відповів:

Що означають ці коди? Як я можу пом'якшити цю проблему? Чому вони трапляються для спроб придбання, а не для запитів товарів?

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

Редагувати:

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

Редагувати:

Я сьогодні потрапив з кодом помилки -1001, щоб додати до цього списку незрозумілих та переривчасті проблеми. Все ще немає відповідальності від Apple, яку я можу знайти.

Редагувати:

У мене є підозра, що ці коди помилок генеруються випадковим чином і насправді лише свідчать про те, що пісочниця вниз. Хтось ще відчуває цю проблему?

Відповіді:


342

Всі коди помилок знаходяться у "Посиланнях на коди помилок CFNetwork" у документації ( посилання )

Невеликий витяг для помилок CFURL та CFURLC:

  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
Вони знаходяться в рамках CFNetwork> заголовка CFNetworkErrors.h.
Том Пейс

1
Цей документ має більше інформації про те, коли трапляються помилки: Сім'я NSURLError
дев'ять каменів

Ці константи не компілюються в Swift, але, наприклад NSURLErrorUnknown, є. Будь-які підказки?
Nicolas Miari

О, неважливо ... знайшов тут версію Swift: developer.apple.com/library/mac/documentation/Networking/…
Nicolas Miari

25

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

Помилка помилки = NSURLErrorDomain Code = -1001 "Запит минув."

Що потрібно перевірити:

  • Чи є шанс, що ваш сервер не зможе відповісти протягом певного часу? Як 60 секунд чи 4 хвилини?
  • Чи є можливість вашого пристрою комутувати мережі (WiFi, 3G, VPN)?
  • Чи може хтось (клієнт проти сервера) чекати автентифікації?

Вибачте, немає ідей, як виправити. Просто налагоджуючи це, намагаючись з’ясувати, у чому проблема (-1021, -1001, -1009)

Оновлення: пошук Google був дуже люб'язним, щоб знайти це:

  • -1001 TimedOut - це зайняло більше часу, ніж відведений час.
  • -1003 CannotFindHost - хост не вдалося знайти.
  • -1004 CannotConnectToHost - хост не дозволить нам встановити з'єднання.

1
"Чи є шанс, що ваш сервер не зможе відповісти протягом певного часу?" Ви знаєте, це вбивця, це сервер Apple, який я намагаюся зв’язатися з цим кодом, так що не мій сервер ікотує.
Гіпербола

Ей Джом, в 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,

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 (автентифікація не вдалася.) Ви можете редагувати список, як вам подобається.

У своєму проекті я використовую його при введенні імені користувача / пароля від користувача. На мою думку, (фізичні) помилки підключення до мережі можуть бути єдиною причиною показу перегляду сповіщень у вашому мережевому додатку. У будь-якому іншому випадку (наприклад, неправильна пара імені користувача / пароля) я вважаю за краще зробити якусь власну зручну анімацію, АБО просто повторити невдалу спробу ще раз без будь-якої уваги користувача. Особливо, якщо користувач явно не ініціював мережевий дзвінок.

З повагою до мартінезделаріва за посиланням на документацію.


Це може бути метод класу!
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."

forums.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Лакшмі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.