iOS中的NSURLErrorDomain错误代码-999

时间:2013-04-18 02:27:11

标签: ios lua corona nsurl nsurlerrordomain

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

  

NSURLErrorDomain错误代码-999

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

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

11 个答案:

答案 0 :(得分:120)

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

文件中的相关部分将是:

  

URL加载系统错误代码

     

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

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

正如你所看到的; -999 ErrorCancelled 引起。这意味着:在上一个请求完成之前发出了另一个请求。

答案 1 :(得分:10)

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

答案 2 :(得分:5)

只想在此处添加,当收到-999 "cancelled"时,问题通常是以下两种情况之一:

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

答案 3 :(得分:1)

我没有使用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
    }

    }

答案 4 :(得分:1)

除了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在内的许多子系统都在向该体系结构过渡。在这一步完全完成之前,您将遇到一些类似这种奇怪的情况。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我们公司的应用在iOS中出现-999错误。我四处搜寻,发现原因有两个,例如网络任务已被取消分配或证书无效。但是我已经检查了我们的代码,这两个是不可能的。我正在使用Alamofire  使用URLSession。幸运的是,我们公司的android应用网络正常。因此,我们检查差异。我们发现iOS的http请求是Http2.0,而android是Http1.1。因此,我们将后端http支持版本降为http1.1,然后-999错误计数下降!!!

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

答案 7 :(得分:0)

我在iOS特定版本的Xamarin应用程序中遇到此错误。不确定根本原因,但就我而言,可以通过使用post方法解决该问题,而不是通过请求正文中的任何传递服务器上下文的操作获取-不管怎么说,这样做更有意义。 Android / Windows /服务都处理带有内容的GET,但是在iOS应用中,应用将变得部分不响应,然后在日志中吐出999 NSUrlErrorDomain内容。希望这可以帮助其他人遇到这个问题。我认为网络代码陷入了循环,但是看不到有问题的代码。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

请检查您是否致电cancel()上的URLSessionDataTask进行修复

NSURLErrorDomain Code=-999 "cancelled"

答案 10 :(得分:0)

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

// 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 是可选类型,或者当它为零时会发生什么。