iOS 中的 NSURLErrorDomain 错误代码 -999

Posted

技术标签:

【中文标题】iOS 中的 NSURLErrorDomain 错误代码 -999【英文标题】:NSURLErrorDomain error code -999 in iOS 【发布时间】:2013-04-11 00:15:55 【问题描述】:

我一直在尝试使用 Corona SDK 的 Facebook API 在我正在 Facebook 上开发的游戏上发布分数。但是,我遇到了问题。在我第一次尝试发布到 facebook 时,登录和用户身份验证后出现此错误:

NSURLErrorDomain 错误代码-999

然后,它不会在 Facebook 上发布。此错误的可能原因是什么,我该如何解决?我尝试在网上搜索,但找不到有关它的信息。提前致谢。

顺便说一句,我没有在我的应用程序上使用 webview。只是我的 Facebook 类中的小部件 api 和 show_dialog 侦听器。

【问题讨论】:

【参考方案1】:

该错误已记录在 Mac Developer Library(ios 文档)

文档中的相关部分将是:

URL 加载系统错误代码

这些值作为 NSError 的错误代码属性返回 域为“NSURLErrorDomain”的对象。

enum

   NSURLErrorUnknown = -1,
   NSURLErrorCancelled = -999,
   NSURLErrorBadURL = -1000,
   NSURLErrorTimedOut = -1001,

如您所见; -999 is caused by ErrorCancelled。这意味着:在前一个请求完成之前发出另一个请求。

【讨论】:

可以表示 (error.code == NSURLErrorCancelled == -999) 并且 error.domain (NSString) 是 NSURLErrorDomain 。当您使用取消取消任务时,您会得到此信息 您好 hjpotter92,我的应用程序在发生此错误时崩溃有什么帮助吗? 想补充一点,当服务器的 SSL 证书出现问题(即过期或无效)时,您会收到相同的错误 (-999) @hjpotter92 我可以参考这个答案***.com/a/40100179/3065769;我在控制台中收到 -999 Canceled Error,但是通过 curl 执行相同的 POST 请求,我收到一条消息,说服务器上存在 SSL 问题;虽然我在这方面没有太多专业知识 我刚收到 -999,但我的 SSL 证书无效。我修复了证书,-999 不见了。【参考方案2】:

hjpotter92 完全正确,我只是想为我的情况提供解决方案。希望它对你也有用。这是我的情况:

在登录页面>按登录>弹出加载对话框>调用登录服务>关闭对话框>推送另一个屏幕>调用另一个服务-->导致错误-999

为了解决这个问题,我在关闭对话框和推送新屏幕之间设置了一个延迟:

    [indicatorAlert dismissWithClickedButtonIndex:0 animated:YES];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC), dispatch_get_main_queue(), ^
                [self performSegueWithIdentifier:@"HomeSegue" sender:nil];
            );

奇怪的是,这个问题只发生在 iOS 7 上。

【讨论】:

我在 10 中没有看到这个,但是升级到 11 后,我看到了。所以很难判断它是误报还是其他。我也没有发现应用程序的行为有任何问题。 有谁知道如何快速做到这一点? 您提供的代码与NSURLSession无关,也与OP描述的错误无关。错误代码不是唯一的 - 它们仅在其域 (NSURLDomain) 内是唯一的。任何 UI 技巧如何导致 NSURLSession 任务失败?【参考方案3】:

我没有使用 Corona SDK 的 Facebook API,但是我在使用 Alamofire 时遇到了这个问题,根据我在互联网上找到的帖子,secondRequest 总是在执行中取消并出现错误 -999,原因是 @987654322 @属性在异步工作完成之前是deinit,因为它超出了范围,我终于通过deinit手动解决了这个问题,所以编译器不会在错误的位置取消它:

class SessionManager 
    var session:SessionManager?

    init() 
        self.session = SessionManager(configuration:URLSessionConfiguration.ephemeral)
    
    private func firstRequest() 
        guard let session = self.session else return
        session.request(request_url).responseData response in
            if let data=response.data 
                self.secondRequest()
            
    
    private func secondRequest() 
        guard let session = self.session else return
        session.request(request_url).responseData response in
            if let data=response.data 
                self.secondRequest()
            
            //session will no longer be needed, deinit it
            self.session = nil
    

    

【讨论】:

编译器不会去初始化任何东西,去初始化是在运行时完成的【参考方案4】:

只是想在这里补充一下,当收到-999 "cancelled" 时,问题通常是以下两种情况之一:

您再次执行完全相同的请求。 您正在维护对您的manager 对象的弱引用,该对象被过早地释放。 (创建强引用)

【讨论】:

那么,完全相同的请求有什么问题?我只想刷新页面。 我应该详细说明一下,我的意思是执行完全相同的请求,而同一个对象已经在“执行”(=例如下载数据)。然后取消第一个请求以执行第二个请求。 那么如果我使用POST方法将完全相同的JSON字符串发送到同一个地址,它会被取消吗?在我的情况下,即使之前的请求已经完成,它也会取消它。 @Chris Graf:我已经撤消了您的编辑,因为我想保持这个答案的简单性。我同意你的意见。请务必将您的评论作为单独的答案发布,以供其他人查看! :) @Ramon 别担心,我在a separate answer 中添加了第三个选项,感谢更新!【参考方案5】:

我在使用 Alamofire 时遇到了同样的错误,这是因为证书固定。 该证书不再有效,因此我不得不将其删除并添加新证书。 希望对您有所帮助。

【讨论】:

【参考方案6】:

我们公司的应用程序在iOS中有很多-999错误。找了一圈,发现原因有两个,比如网络任务被dealloc或者证书无效。但是我检查了我们的代码,这两个是不可能的。我正在使用 Alamofire 这是使用 URLSession。幸运的是,我们公司的android app的网络是正常的。所以我们检查差异。我们发现iOS的http请求是Http2.0,而android是Http1.1。所以我们强制后端http支持版本降到http1.1,然后-999错误计数下降!!!

我认为 Apple 的 URLSession 中可能存在一些错误。查看链接New NSURLSession for every DataTask overkill?了解一些详细想法

【讨论】:

【参考方案7】:

除了Ramon写的,收到NSURLErrorDomain -999 cancelled的时候还有第三个可能的原因:

您在任务执行时取消了任务,要么通过在 datatask 对象上调用 .cancel(),要么因为您在会话对象上使用了 .invalidateAndCancel()。如果您正在使用委托创建自定义会话,则应调用 .invalidateAndCancel().finishTasksAndInvalidate() 以解决会话与其委托之间的强引用,如 Apple Developer Documentation 中所述:

会话对象保持对委托的强引用,直到您的应用退出或显式使会话无效。如果您不使会话无效,则您的应用会泄漏内存,直到退出。

如果您对这种日志记录行为感到疑惑,我在Apple Developer forums 中找到了以下解释:

作为解释,早在 iOS 10 中,我们就引入了一个新的日志系统范围的日志架构(请关注 WWDC 2016 Session 721 Unified Logging and Activity Tracing 了解详情),包括 CFNetwork 在内的许多子系统正在转向该架构。在该动作完全完成之前,您将遇到一些像这样的奇怪边缘情况。

【讨论】:

【参考方案8】:

我在 iOS 特定版本的 Xamarin 应用程序中收到此错误。不确定根本原因,但在我的情况下,能够通过使用 post 方法而不是 get 来解决它,而不是在请求正文中传递服务器上下文的任何内容——无论如何这更有意义。 Android / Windows / 服务都处理带有内容的 GET,但在 iOS 应用程序将变得部分无响应,然后在日志中吐出 999 NSUrlErrorDomain 内容。希望这可以帮助其他人遇到这个问题。我假设网络代码陷入了循环,但看不到有问题的代码。

【讨论】:

【参考方案9】:

对于我的 Cordova 项目(或类似项目),原来这是一个插件问题。确保您没有丢失任何插件,并确保它们已正确安装且没有问题。

验证这一点的最简单方法是通过重新创建 Cordova 项目 (cordova create <path>) 以及所需的平台 (cordova platform add <platform name>) 重新开始,并为每个插件添加详细标志 (- -verbose) 以便在下载插件、添加到项目并为每个平台安装时,您可以在控制台日志中查看是否有任何问题 (cordova plugin add cordova-plugin-device --verbose)

回顾: cordova create <path> cordova platform add <platform name> cordova plugin add cordova-plugin-device --verbose

【讨论】:

【参考方案10】:

请检查如果您在URLSessionDataTask 上致电cancel() 进行修复

NSURLErrorDomain Code=-999 "cancelled"

【讨论】:

【参考方案11】:

就我而言,我使用了一个不需要正文内容的上传任务帖子:

// The `from: nil` induces error "cancelled" code -999
let task = session.uploadTask(with: urlRequest, from: nil, completionHandler: handler)

解决方法是使用零字节数据而不是 nil,

let task = session.uploadTask(with: urlRequest, from: Data(), completionHandler: handler)

框架文档没有说明为什么 from bodyData 是可选类型,或者当它为 nil 时会发生什么。

【讨论】:

以上是关于iOS 中的 NSURLErrorDomain 错误代码 -999的主要内容,如果未能解决你的问题,请参考以下文章

Swift 服务调用中的错误域 = NSURLErrorDomain 代码 = -1004 而不是 -1009

Swift iOS 9 NSURLErrorDomain 错误 -1004

-1103 错误域=NSURLErrorDomain 代码=-1103“资源超出最大大小”iOS 13

错误:错误域=NSURLErrorDomain 代码=-1001 “请求超时。”

错误:错误域=NSURLErrorDomain 代码=-1001“请求超时。”

错误:错误域=NSURLErrorDomain 代码=-1001“请求超时。”