在iOS中,NSURLErrorDomain错误代码为-999。

我一直在尝试使用Corona SDK的Facebook API在Facebook上发布我正在开发的游戏的得分,但是我遇到了问题。在第一次尝试发布到Facebook时,登录和用户认证后我会收到以下错误:

NSURLErrorDomain error code -999

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

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

点赞
用户1190388
用户1190388

错误已在 Mac 开发人员库(iOS 文档) 上记录。

文档中相关的部分如下:

URL 加载系统错误代码

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

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

正如你所看到的,-999 是由 ErrorCancelled 引起的。这表示:在前一个请求完成之前,又发出了另一个请求。

2013-04-18 06:38:08
用户578309
用户578309

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上。

2013-11-29 07:31:52
用户5852847
用户5852847

我没有使用Corona SDK的Facebook API,但在使用Alamofire时遇到了这个问题。secondRequest总是在执行过程中被取消,并且出现错误-999。根据我在互联网上找到的帖子,原因是session属性在异步工作完成之前已经销毁,因为它超出了范围。最后,我通过手动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()
            }
            //会话将不再需要,将其取消
            self.session = nil
        }
    }
}
2017-12-21 23:07:01
用户3292837
用户3292837

只是想在这里补充一点,当收到一个-999 "cancelled"的错误通常有两种原因:

  • 你正在再次执行完全相同的请求。
  • 你正在维护对你的manager对象的弱引用,导致它提前被释放。(创建强引用)
2019-01-14 09:34:50
用户8818448
用户8818448

我在使用 Alamofire 时也遇到了相同的错误,原因是证书钉住(certificate pinning)。 证书已经失效了,所以我需要把它删除并且添加一个新的。 希望能对你有所帮助。

2019-07-04 10:31:20
用户4493645
用户4493645

我们公司的 iOS 应用遇到了很多 -999 错误。我搜索了一些资料,发现了两个原因,像网络任务已释放或证书无效。但是我已经检查过我们的代码,这两个原因都不可能发生。我正在使用 Alamofire,它使用 URLSession。幸运的是,我们公司的 Android 应用的网络是正常的。因此我们找出了差异,我们发现 iOS 的 http 请求是 Http2.0,而 Android 是 Http1.1。因此我们将后端的 http 支持版本降级到 http1.1,然后 -999 错误次数下降了!!!

我认为可能是苹果的 URLSession 中存在一些 bug。我们可以通过查看 每个 DataTask 新建一个 NSURLSession 是否太多? 来了解一些详细的想法。

2019-07-26 03:47:58
用户3209393
用户3209393

除了Ramon提到的情况,当收到一个NSURLErrorDomain -999 cancelled的错误时,还有第三种可能的原因:

您在执行期间通过在datatask对象上调用.cancel()或者在session对象上使用.invalidateAndCancel()取消了任务。如果您要创建一个具有委托的自定义会话,应该调用.invalidateAndCancel().finishTasksAndInvalidate()来解决会话和其委托之间的强引用。在苹果开发者文档中提到:

会话对象会在您的应用程序退出或明确无效会话之前对委托对象保持强引用。如果不使会话无效,您的应用程序将泄漏内存直到退出。

如果您对此日志记录行为感到困惑,可以在苹果开发者论坛中找到以下的解释:

作为说明,早在iOS 10中,我们引入了一个新的日志记录系统(观看WWDC 2016 Session 721 Unified Logging and Activity Tracing获取详细信息),许多子系统,包括CFNetwork,正在逐步移动到其中。在该过渡完成之前,你可能会遇到一些奇怪的边缘情况,比如这种情况。

2019-08-24 07:56:50
用户3858029
用户3858029

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

2019-09-12 19:39:47
用户2503520
用户2503520

对于我的 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

2019-10-01 08:03:49
用户4770877
用户4770877

请检查您是否在URLSessionDataTask上调用了cancel()来解决

NSURLErrorDomain Code=-999 "cancelled"
2020-10-25 17:57:50
用户12755463
用户12755463

对于我的情况,我使用了一个不需要请求体内容的上传任务:

// 使用 `from: nil` 的话会导致错误码为 "cancelled",即 -999
let task = session.uploadTask(with: urlRequest, from: nil, completionHandler: handler)

修复方法是使用零字节数据代替 nil,

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

这个框架文档没有明确说明为什么请求体数据类型可以是可选类型,或者当其为 nil 时会发生什么。

2021-08-11 17:43:12
用户5000550
用户5000550

我们通过在加载失败时重新加载 web view 解决了这个问题。

extension WebViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        webView.reload()
    }
}
2022-03-21 09:39:57