簡體   English   中英

如何修復 iOS 中的“NSURLErrorDomain 錯誤代碼 -999”

[英]How to fix "NSURLErrorDomain error code -999" in iOS

我一直在嘗試使用 Corona SDK 的 Facebook API 來發布我在 facebook 上開發的游戲的分數。 但是,我遇到了問題。 在我第一次嘗試發布到 facebook 時,登錄和用戶身份驗證后出現此錯誤:

NSURLErrorDomain 錯誤代碼 -999

然后,它不會在 Facebook 上發布。 此錯誤的可能原因是什么?我該如何解決?

順便說一句,我沒有在我的應用程序上使用 webview。 在我的 Facebook 類中只有小部件 api 和一個 show_dialog 偵聽器。

該錯誤已記錄在Mac 開發人員庫(iOS 文檔)中

文檔中的相關部分將是:

URL 加載系統錯誤代碼

這些值作為域“NSURLErrorDomain”的 NSError 對象的錯誤代碼屬性返回。

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

如你看到的; -999是由ErrorCancelled引起的 這意味着:在前一個請求完成之前發出另一個請求。

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

只是想在這里補充一下,當收到-999 "cancelled" ,問題通常是兩件事之一:

  • 您再次執行完全相同的請求。
  • 您正在維護對過早解除分配的manager對象的弱引用。 (創建強引用)

我在使用 Alamofire 時遇到了同樣的錯誤,這是因為證書固定。 該證書不再有效,因此我不得不將其刪除並添加新證書。 希望能幫助到你。

除了Ramon寫的內容之外,在收到NSURLErrorDomain -999 cancelled時還有第三個可能的原因:

您通過在 datatask 對象上調用.cancel()或因為您在 session 對象上使用了.invalidateAndCancel()來取消該任務。 如果您使用委托創建自定義會話,則應調用.invalidateAndCancel().finishTasksAndInvalidate()來解決會話與其委托之間的強引用,如Apple 開發人員文檔中所述

會話對象保持對委托的強引用,直到您的應用程序退出或顯式地使會話無效。 如果您不使會話無效,您的應用程序就會泄漏內存,直到它退出。

如果您對這種日志記錄行為感到疑惑,我在Apple Developer 論壇中找到了以下解釋:

作為解釋,在 iOS 10 中我們引入了一個新的日志系統范圍的日志架構(觀看WWDC 2016 Session 721 Unified Logging and Activity Tracing了解詳細信息)和許多子系統,包括 CFNetwork,正在遷移到那。 在這一舉措完全完成之前,你會遇到一些像這樣的奇怪的邊緣情況。

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

    }

我們公司的應用程序在iOS中有很多-999錯誤。 找了一圈,發現原因有兩個,比如網絡任務被dealloc或者證書無效。 但是我檢查了我們的代碼,這兩個是不可能的。 我正在使用使用 URLSession 的 Alamofire。 還好我們公司的android app的網絡是正常的。 所以我們檢查差異。 我們發現來自iOS的http請求是Http2.0,而android是Http1.1。 所以我們強制后端http支持版本降到http1.1,然后-999錯誤計數下降!!!

我認為 Apple 的 URLSession 中可能存在一些錯誤。 檢查每個 DataTask 矯枉過正的鏈接New NSURLSession? 一些細節的想法

請檢查是否在URLSessionDataTask上調用cancel()來修復

NSURLErrorDomain Code=-999 "cancelled"

我在 Xamarin 應用程序的 iOS 特定版本中收到此錯誤。 不確定根本原因,但在我的情況下,可以通過使用 post 方法而不是 get 來解決它,因為它可以在請求正文中傳遞服務器上下文——無論如何這更有意義。 Android / Windows / 該服務都處理帶有內容的 GET,但在 iOS 應用程序中將變得部分無響應,然后在日志中吐出 999 NSUrlErrorDomain 內容。 希望這有助於其他人遇到這個問題。 我假設網絡代碼陷入循環,但看不到有問題的代碼。

對於我的Cordova 項目(或類似項目) ,結果是插件問題 確保您沒有丟失任何插件,並確保它們安裝正確而沒有問題。

驗證這一點的最簡單方法是通過重新cordova create <path> 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

就我而言,我使用了一個不需要正文內容的上傳任務帖子:

// 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 是可選類型,或者當它為零時會發生什么。

我們通過在加載失敗時重新加載 Web 視圖來解決這個問題。

extension WebViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        webView.reload()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM