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 “请求超时。”