Mã lỗi NSURLError không có giấy tờ (-1001, -1003 và -1004) bằng cách sử dụng StoreKit


107

Tôi đang viết mã liên quan đến StoreKit và tôi nhận được một số mã lỗi khá rắc rối khi tôi cố gắng thêm giao dịch mua vào hàng đợi.

Cho đến nay, tôi đã gặp phải mã lỗi -1003 và -1004 và tôi không thể tìm thấy bất kỳ điều gì về những mã đó trên internet.

Việc chạy một yêu cầu sản phẩm trả về số sản phẩm hợp lệ, vì vậy tôi không biết tại sao các cuộc gọi đến [[SKPaymentQueue defaultQueue] addPayment:aPayment];lại không thành công với sự cố không có giấy tờ này.

Mã tương tự cũng hoạt động mà không có lỗi trên thiết bị này nhưng không hoạt động trên thiết bị khác.

Những câu hỏi tôi có, cho đến nay, vẫn chưa được trả lời:

Những mã này có nghĩa là gì? Làm cách nào để giảm thiểu vấn đề này? Tại sao chúng xảy ra cho các nỗ lực mua hàng chứ không phải cho các yêu cầu sản phẩm?

Khắc phục sự cố mà tôi đã thực hiện bao gồm tạo lại chứng chỉ ký và hồ sơ cấp phép, thay đổi mạng WiFi, dọn dẹp và xây dựng cũng như cài đặt lại tất cả phần mềm và thành phần liên quan và không điều nào trong số này giúp khắc phục sự cố.

BIÊN TẬP:

Đã tìm thấy một cuộc thảo luận về điều này trên các diễn đàn dành cho nhà phát triển của Apple, nhưng không ai từ Apple trả lời: https://devforums.apple.com/thread/107121?tstart=75 (cần có tài khoản nhà phát triển iOS để xem)

BIÊN TẬP:

Tôi đã gặp phải mã lỗi -1001 ngày hôm nay, để thêm vào danh sách các sự cố không thể giải thích được và không liên tục này. Vẫn không có trách nhiệm giải trình từ Apple, mà tôi có thể tìm thấy.

BIÊN TẬP:

Tôi nghi ngờ rằng những mã lỗi này được tạo ngẫu nhiên và chỉ thực sự cho thấy rằng Hộp cát bị lỗi. Có ai khác gặp vấn đề này không?

Câu trả lời:


342

Tất cả các mã lỗi đều có trên "Tài liệu tham khảo về mã lỗi CFNetwork" trên tài liệu ( liên kết )

Một trích xuất nhỏ cho các lỗi kết nối CFURL và 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
Chúng nằm trong tiêu đề CFNetwork framework> CFNetworkErrors.h.
Tom Pace

1
Tài liệu này có thêm thông tin về thời điểm xảy ra lỗi: Gia đình NSURLError
nine stone.

Các hằng số này không biên dịch trong Swift, nhưng chẳng hạn NSURLErrorUnknown. Bất kì manh mối nào?
Nicolas Miari

Ồ, đừng bận tâm ... đã tìm thấy phiên bản Swift ở đây: developer.apple.com/library/mac/documentation/Networking/…
Nicolas Miari 17/09/15

25

Tôi gặp sự cố tương tự, trong trường hợp của tôi dường như liên quan đến kết nối mạng:

Tên miền lỗi = NSURLErrorDomain Code = -1001 "Yêu cầu đã hết thời gian chờ."

Những điều cần kiểm tra:

  • Có bất kỳ cơ hội nào mà máy chủ của bạn không thể phản hồi trong một số thời hạn không? Như 60 giây hay 4 phút?
  • Có khả năng thiết bị của bạn đang chuyển đổi mạng (WiFi, 3G, VPN) không?
  • Có thể ai đó (máy khách so với máy chủ) đang chờ xác thực?

Xin lỗi, không có ý tưởng làm thế nào để sửa chữa. Chỉ cần gỡ lỗi này, cố gắng tìm ra vấn đề là gì (-1021, -1001, -1009)

Cập nhật: Tìm kiếm của Google rất tốt khi tìm thấy điều này:

  • -1001 TimedOut - mất nhiều thời gian hơn thời gian chờ đã được báo trước.
  • -1003 CannotFindHost - không thể tìm thấy máy chủ.
  • -1004 CannotConnectToHost - máy chủ lưu trữ sẽ không cho phép chúng tôi thiết lập kết nối.

1
"Có bất kỳ khả năng nào mà máy chủ của bạn không thể phản hồi trong một số thời hạn không?" Bạn biết đấy, đó là kẻ giết người, đó là máy chủ của Apple mà tôi đang cố gắng liên hệ với mã này, vì vậy không phải máy chủ của tôi bị trục trặc.
Hyperbole

Hey Jom, Trong iPhone, nó đang hoạt động tốt cho chúng tôi nhưng trong iPad, đôi khi chúng tôi gặp sự cố, thông báo này hiển thị tức là, thông báo "-1001 TimedOut". Nhưng câu hỏi của tôi là, Nếu TimedOut, nó sẽ có trong cả iPhone và iPad. Cảm ơn trước @JOM
Babul

21

xem NSURLError.h Define

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

Tôi sử dụng phương pháp sau trong dự án của mình

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

Sau đó, tôi chỉ cần kiểm tra mã lỗi và hiển thị cảnh báo nếu nó có trong danh sách

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

Nhưng như bạn có thể thấy, tôi đã nhận xét ra những mã mà tôi nghĩ không phù hợp với định nghĩa của tôi về KHÔNG CÓ INTERNET. Ví dụ: mã -1012 (Xác thực không thành công.) Bạn có thể chỉnh sửa danh sách theo ý muốn.

Trong dự án của tôi, tôi sử dụng nó tại tên người dùng / mật khẩu nhập từ người dùng. Và theo quan điểm của tôi, lỗi kết nối mạng (vật lý) có thể là lý do duy nhất để hiển thị chế độ xem cảnh báo trong ứng dụng dựa trên mạng của bạn. Trong bất kỳ trường hợp nào khác (ví dụ: cặp tên người dùng / mật khẩu không chính xác), tôi thích thực hiện một số hoạt ảnh thân thiện với người dùng tùy chỉnh, HOẶC chỉ lặp lại lần thử không thành công một lần nữa mà không có sự chú ý của người dùng. Đặc biệt nếu người dùng không bắt đầu cuộc gọi mạng một cách rõ ràng.

Trân trọng martinezdelariva cho một liên kết đến tài liệu.


Đó có thể là một phương thức lớp!
ilnar_al

2

Tôi đã tìm thấy mã lỗi mới không được ghi ở trên: 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."

Forum.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Lakshmi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.