[ios] StoreKit을 사용하는 문서화되지 않은 NSURLErrorDomain 오류 코드 (-1001, -1003 및 -1004)

StoreKit 관련 코드를 작성 중이며 구매를 대기열에 추가하려고 할 때 다소 문제가되는 오류 코드가 표시됩니다.

지금까지 오류 코드 -1003 및 -1004가 발생했으며 인터넷에서 해당 코드에 대해 아무것도 찾을 수 없습니다.

제품 요청을 실행하면 유효한 제품 번호가 반환 [[SKPaymentQueue defaultQueue] addPayment:aPayment];되므로이 문서화되지 않은 문제로 인해 호출 이 실패하는 이유를 모르겠습니다 .

동일한 코드가 한 장치에서는 오류없이 작동하지만 다른 장치에서는 작동하지 않습니다.

내가 가진 질문은 아직 답이 없습니다.

이 코드는 무엇을 의미합니까? 이 문제를 어떻게 완화 할 수 있습니까? 제품 요청이 아닌 구매 시도에 대해 발생하는 이유는 무엇입니까?

내가 한 문제 해결에는 서명 인증서 및 프로비저닝 프로파일 재생성, WiFi 네트워크 변경, 모든 관련 소프트웨어 및 구성 요소 정리 및 구축 및 재설치가 포함되며 이러한 사항 중 어느 것도 개별적으로 또는 함께 문제를 해결하는 데 도움이되지 않았습니다.

편집하다:

Apple 개발자 포럼에서 이에 대한 토론을 찾았지만 Apple의 아무도 응답하지 않았습니다. https://devforums.apple.com/thread/107121?tstart=75 (보기하려면 iOS 개발자 계정 필요)

편집하다:

설명 할 수없고 간헐적 인 문제 목록에 추가하기 위해 오늘 오류 코드 -1001이 발생했습니다. 여전히 Apple의 책임이 없습니다.

편집하다:

이 오류 코드가 무작위로 생성되고 실제로 Sandbox가 다운되었음을 나타냅니다. 다른 사람이이 문제를 경험합니까?



답변

모든 오류 코드는 문서 ( 링크 )의 “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 코드 = -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."


답변

NSURLErrorDomain 아래의 모든 오류 코드에 대한 object-c 열거 형이있는 설명서에서이 페이지를 찾았습니다.

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


답변