iOS中的NSURLErrorDomain错误代码-999


75

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

NSURLErrorDomain错误代码-999

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

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

Answers:


137

该错误已记录在Mac Developer Library(iOS docs)中

文档中的相关部分将是:

URL加载系统错误代码

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

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

如你看到的; -999是由引起的ErrorCancelled。这意味着:在前一个请求完成之前,将发出另一个请求。


4
可以表示(error.code == NSURLErrorCancelled == -999)并且error.domain(NSString)是NSURLErrorDomain。当您使用取消取消任务时,您会收到此消息
Ryan Heitner 2014年

您好hjpotter92,发生此错误有任何帮助时,我的应用程序崩溃了吗?
Gopal Devra 2015年

12
想要补充的是,当服务器的SSL证书出现问题(即它已过期或无效)时
也会

1
@ hjpotter92我可以参考这个答案stackoverflow.com/a/40100179/3065769 ; 我在控制台中收到-999取消错误,但是通过curl执行相同的POST请求时,我收到一条消息,指出服务器上存在SSL问题。我没有太多的专业知识在这方面,虽然
arrteme

4
我刚得到-999,并且我的SSL证书无效。我修复了证书,-999不见了。
Florian Cargoet '18年

11

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


1
我没有看到10,但是升级到11后,我看到了。因此,很难判断其是否为假阳性或其他。我也没有发现该应用程序的行为有任何问题。
米哈·蒙托亚

有谁知道如何迅速做到这一点?
山姆

您提供的代码与NSURLSession或OP描述的错误无关。错误代码不是唯一的-它们仅在其域(NSURLDomain)中是唯一的。任何UI欺骗都会如何导致NSURLSession任务失败?
Motti Shneor

8

只是想在这里添加,收到-999 "cancelled"问题时通常是以下两件事之一:

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

那么,完全相同的请求又怎么了?我只想刷新页面。
Kimi Chiu

2
我要详细说明一下,我的意思是在相同的对象已经“执行”(例如,下载数据)的同时执行完全相同的请求。然后取消第一个请求以执行第二个请求。
拉蒙

因此,如果我使用一种POST方法将完全相同的JSON字符串发送到相同的地址,它将被取消吗?就我而言,即使先前的请求已完成,它也只是将其取消。
Kimi Chiu

@克里斯·格拉夫(Chris Graf):由于我想保持此答案的简单性,我撤消了您的编辑。我确实同意您的意见。请确实将您的评论作为单独的答案发布给其他人查看!:)
拉蒙

@Ramon不用担心,我在单独的答案中添加了第三个选项,感谢您的更新!
克里斯·格拉夫


1

secondRequest根据我在网上找到的帖子,我没有使用Corona SDK的Facebook API,但是在使用Alamofire时遇到了这个问题,执行时总是取消,错误为-999,原因是该session属性deinit在异步工作完成之前它超出了范围,我终于通过deinitsession属性手动解决了这个问题,因此编译器不会在错误的位置将其取消初始化:

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
    }

    }

编译器不进行任何初始化,而是在运行时
完成初始化

1

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

我认为Apple的URLSession中可能存在一些错误。检查链接New NSURLSession是否对每个DataTask都大材小用?对于一些细节的想法


1

除了Ramon撰写的内容外,收到第三个可能的原因是NSURLErrorDomain -999 cancelled

您可以在执行任务时取消调用该任务,方法是调用.cancel()datatask对象,或者因为您使用.invalidateAndCancel()了会话对象。如果要使用委托创建自定义会话,则应调用.invalidateAndCancel().finishTasksAndInvalidate()解决该会话与其委托之间的强引用,如Apple开发者文档中所述

在您的应用退出或显式使会话无效之前,会话对象始终对委托保持强烈的引用。如果您不使会话无效,则您的应用会泄漏内存,直到退出。

如果您想知道这种记录行为,我在Apple Developer论坛中找到了以下解释:

作为解释,早在iOS 10中,我们引入了一种新的日志记录范围的日志记录体系结构(有关详细信息,请观看WWDC 2016 Session 721统一日志记录和活动跟踪),并且包括CFNetwork在内的许多子系统都在过渡到那。在这一步完全完成之前,您将遇到一些像这样的怪异情况。


0

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


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


0

请检查您是否调用cancel()URLSessionDataTask,以修复

NSURLErrorDomain Code=-999 "cancelled"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.