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

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

NSURLErrorDomain 错误代码-999

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

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

【问题讨论】:

    标签: ios lua coronasdk nsurl nsurlerrordomain


    【解决方案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 我可以参考这个答案stackoverflow.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 时会发生什么。

                【讨论】:

                  猜你喜欢
                  • 2018-01-22
                  • 2015-11-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-12-30
                  • 2017-03-19
                  • 1970-01-01
                  • 2021-10-24
                  相关资源
                  最近更新 更多