使用StoreKit时出现未记录的NSURLErrorDomain错误代码(-1001、-1003和-1004)

112
我正在编写与StoreKit相关的代码,试图将购买添加到队列时出现了一些令人不安的错误代码。
到目前为止,我遇到了错误代码-1003和-1004,但在互联网上找不到这些代码的任何信息。
运行产品请求会返回有效的产品号码,所以我不知道为什么调用[[SKPaymentQueue defaultQueue] addPayment:aPayment]; 会因为这个未记录的问题而失败。
相同的代码在一个设备上没有错误地工作,但在另一个设备上却无法正常运行。
我有的问题到目前为止还没有得到答案:
这些代码是什么意思? 我该如何解决这个问题? 为什么它们会发生在购买尝试中而不是在产品请求中?
我所做的故障排除包括重新生成签名证书和配置文件、更改WiFi网络、清理和构建并重新安装所有相关软件和组件,但这些事情单独或一起都没有帮助解决问题。
编辑:
在Apple开发者论坛上找到了关于这个问题的讨论,但没有得到Apple的回复:https://devforums.apple.com/thread/107121?tstart=75(需要iOS开发者账户才能查看)
编辑:
今天我遇到了错误代码-1001,补充到这个莫名其妙和间歇性问题的列表中。到目前为止,我还没有找到来自苹果方面的解释。
编辑:
我怀疑这些错误代码是随机生成的,实际上只是表示沙盒停机。还有其他人遇到过这个问题吗?
7个回答

356

所有错误代码都在文档“CFNetwork Errors Codes References”中(链接)。

以下是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,

3
这些内容位于CFNetwork框架> CFNetworkErrors.h头文件中。 - Tom Pace
这些常量在Swift中无法编译,但例如NSURLErrorUnknown可以。有什么线索吗? - Nicolas Miari
哦,没事了...在这里找到了Swift版本:https://developer.apple.com/library/mac/documentation/Networking/Reference/CFNetworkErrors/#//apple_ref/c/tdef/CFNetworkErrors - Nicolas Miari

25

我有类似的问题,我的情况似乎与网络连接有关:

错误领域=NSURLErrorDomain Code=-1001 "请求超时。"

需要检查以下事项:

  • 你的服务器是否可能不能在某个时间限制内响应?例如60秒或4分钟?
  • 你的设备是否可能正在切换网络(WiFi,3G,VPN)?
  • 是否有人(客户端与服务器)正在等待验证?

很抱歉,我不知道如何解决。只是在调试这个问题,试图找出问题所在(-1021,-1001,-1009)

更新:谷歌搜索非常友好地发现了以下内容:

  • -1001 超时 - 超过分配的超时时间。
  • -1003 未找到主机 - 找不到主机。
  • -1004 无法连接到主机 - 主机不会让我们建立连接。

1
你的服务器有没有可能在一定时间限制内无法响应?你知道,这是致命的问题,我正在尝试使用此代码联系苹果的服务器,因此不是我的服务器出现了故障。 - Hyperbole
嗨Jom,我们在iPhone上使用良好,但在iPad上有时会崩溃,出现“-1001 TimedOut”消息。但我的问题是,如果超时,它应该在iPhone和iPad上都出现。提前致谢@JOM。 - Babul

22

查看 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(身份验证失败)的代码。 您可以根据需要编辑列表。

在我的项目中,我在用户输入用户名/密码时使用它。在我的观点中(物理上),网络连接错误可能是在基于网络的应用程序中显示警报视图的唯一原因。在任何其他情况下(例如,不正确的用户名/密码对),我更喜欢做一些自定义用户友好的动画,或者只是再次重复失败的尝试,而不需要用户的任何关注。尤其是如果用户没有明确发起网络调用。

感谢martinezdelariva提供文档链接。


那可以是一个类方法! - 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."

https://forums.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> - Lakshmi


0

以下网站也非常有用,可以找到未记录或难以找到的苹果API错误代码:

https://www.osstatus.com/

您可以提供错误代码(例如-1001或kCFURLErrorTimedOut)甚至是您正在使用的框架或API(例如CFNetworkNSURLAVAudioSession),该网站将列出与您搜索匹配的所有潜在错误,显示错误名称,相关框架和定义错误的头文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接