[英]How to fix "NSURLErrorDomain error code -999" in iOS
我一直在尝试使用 Corona SDK 的 Facebook API 来发布我在 facebook 上开发的游戏的分数。 但是,我遇到了问题。 在我第一次尝试发布到 facebook 时,登录和用户身份验证后出现此错误:
NSURLErrorDomain 错误代码 -999
然后,它不会在 Facebook 上发布。 此错误的可能原因是什么?我该如何解决?
顺便说一句,我没有在我的应用程序上使用 webview。 在我的 Facebook 类中只有小部件 api 和一个 show_dialog 侦听器。
该错误已记录在Mac 开发人员库(iOS 文档)中
文档中的相关部分将是:
URL 加载系统错误代码
这些值作为域“NSURLErrorDomain”的 NSError 对象的错误代码属性返回。
enum { NSURLErrorUnknown = -1, NSURLErrorCancelled = -999, NSURLErrorBadURL = -1000, NSURLErrorTimedOut = -1001,
如你看到的; -999
是由ErrorCancelled
引起的。 这意味着:在前一个请求完成之前发出另一个请求。
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 上。
只是想在这里补充一下,当收到-999 "cancelled"
,问题通常是两件事之一:
manager
对象的弱引用。 (创建强引用)我在使用 Alamofire 时遇到了同样的错误,这是因为证书固定。 该证书不再有效,因此我不得不将其删除并添加新证书。 希望能帮助到你。
除了Ramon写的内容之外,在收到NSURLErrorDomain -999 cancelled
时还有第三个可能的原因:
您通过在 datatask 对象上调用.cancel()
或因为您在 session 对象上使用了.invalidateAndCancel()
来取消该任务。 如果您使用委托创建自定义会话,则应调用.invalidateAndCancel()
或.finishTasksAndInvalidate()
来解决会话与其委托之间的强引用,如Apple 开发人员文档中所述:
会话对象保持对委托的强引用,直到您的应用程序退出或显式地使会话无效。 如果您不使会话无效,您的应用程序就会泄漏内存,直到它退出。
如果您对这种日志记录行为感到疑惑,我在Apple Developer 论坛中找到了以下解释:
作为解释,在 iOS 10 中我们引入了一个新的日志系统范围的日志架构(观看WWDC 2016 Session 721 Unified Logging and Activity Tracing了解详细信息)和许多子系统,包括 CFNetwork,正在迁移到那。 在这一举措完全完成之前,你会遇到一些像这样的奇怪的边缘情况。
我没有使用 Corona SDK 的 Facebook API,但是在使用 Alamofire 时遇到了这个问题,根据我在互联网上找到的帖子, secondRequest
总是在执行中取消并出现错误 -999,原因是session
属性在完成之前被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
}
}
我们公司的应用程序在iOS中有很多-999错误。 找了一圈,发现原因有两个,比如网络任务被dealloc或者证书无效。 但是我检查了我们的代码,这两个是不可能的。 我正在使用使用 URLSession 的 Alamofire。 还好我们公司的android app的网络是正常的。 所以我们检查差异。 我们发现来自iOS的http请求是Http2.0,而android是Http1.1。 所以我们强制后端http支持版本降到http1.1,然后-999错误计数下降!!!
我认为 Apple 的 URLSession 中可能存在一些错误。 检查每个 DataTask 矫枉过正的链接New NSURLSession? 一些细节的想法
请检查是否在URLSessionDataTask
上调用cancel()
来修复
NSURLErrorDomain Code=-999 "cancelled"
我在 Xamarin 应用程序的 iOS 特定版本中收到此错误。 不确定根本原因,但在我的情况下,可以通过使用 post 方法而不是 get 来解决它,因为它可以在请求正文中传递服务器上下文——无论如何这更有意义。 Android / Windows / 该服务都处理带有内容的 GET,但在 iOS 应用程序中将变得部分无响应,然后在日志中吐出 999 NSUrlErrorDomain 内容。 希望这有助于其他人遇到这个问题。 我假设网络代码陷入循环,但看不到有问题的代码。
对于我的Cordova 项目(或类似项目) ,结果是插件问题。 确保您没有丢失任何插件,并确保它们安装正确而没有问题。
验证这一点的最简单方法是通过重新cordova create <path>
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
就我而言,我使用了一个不需要正文内容的上传任务帖子:
// 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 是可选类型,或者当它为零时会发生什么。
我们通过在加载失败时重新加载 Web 视图来解决这个问题。
extension WebViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
webView.reload()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.