我一直在尝试使用Corona SDK的Facebook API在我正在Facebook上开发的游戏上发布得分。但是,我遇到了问题。在我第一次尝试发布到Facebook时,我在登录和用户身份验证后收到此错误:
NSURLErrorDomain错误代码-999
然后,它不会在Facebook上发布。导致此错误的可能原因是什么?如何解决?我尝试在网上搜索但无法找到有关它的信息。提前谢谢。
顺便说一下,我没有在我的应用上使用webview。只是我的Facebook类中的widget api和show_dialog监听器。
答案 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 是可选类型,或者当它为零时会发生什么。