Код ошибки NSURLErrorDomain -999 в iOS

Я пытаюсь использовать API Corona SDK Facebook, чтобы опубликовать оценку игры, которую я разрабатываю на facebook. Однако у меня проблема с этим. В первый раз, когда я пытаюсь отправить сообщение в facebook, я получаю эту ошибку после аутентификации пользователя и пользователя:

Код ошибки NSURLErrorDomain -999

Тогда он не будет публиковать на facebook. Каковы возможные причины этой ошибки и как я могу ее устранить? Я пробовал искать в Интернете, но не мог найти информацию об этом. Спасибо заранее.

Кстати, я не использую webview в своем приложении. Просто виджет api и прослушиватель show_dialog в моем классе Facebook.

Ответ 1

Ошибка была задокументирована в библиотеке разработчика Mac (документы для iOS)

Соответствующий сегмент из документации будет:

Коды загрузки системных URL-адресов

Эти значения возвращаются как свойство кода ошибки объекта NSError с доменом "NSURLErrorDomain".

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

Как вы видете; -999 вызвано ErrorCancelled. Это означает: еще один запрос сделан до того, как предыдущий будет выполнен.

Ответ 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.

Ответ 3

Просто хотел добавить сюда, что при получении -999 "cancelled" проблема обычно заключается в одной из двух вещей:

  • Вы снова выполняете тот же запрос.
  • Вы поддерживаете слабую ссылку на свой объект manager который преждевременно освобождается. (Создать сильную ссылку)

Ответ 4

Я не использовал Corona SDK Facebook API, но я столкнулся с этой проблемой при использовании Alamofire, secondRequest всегда отменял исполнение с ошибкой -999, согласно сообщениям, которые я нашел в Интернете, причина в том, что session свойство deinit до завершения работы async, так как оно выходит за рамки, я, наконец, решил эту проблему с помощью 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
    }

    }

Ответ 5

В дополнение к тому, что написал Рамон, существует и третья возможная причина получения NSURLErrorDomain -999 cancelled:

Вы отменили задачу во время ее выполнения, вызвав .cancel() для объекта задачи данных или потому что вы использовали .invalidateAndCancel() для объекта сеанса. Если вы создаете пользовательский сеанс с делегатом, вы должны позвонить в .invalidateAndCancel() или .finishTasksAndInvalidate(), чтобы разрешить сильную ссылку между сеансом и его делегатом, как упомянуто в документации разработчика Apple:

Объект сеанса сохраняет строгую ссылку на делегат до тех пор, пока ваше приложение не закроет или явно не аннулирует сеанс. Если вы не аннулируете сеанс, ваше приложение будет терять память до тех пор, пока оно не завершится.

Если вас интересует такое поведение при ведении журнала, я нашел следующее объяснение на форумах разработчиков Apple:

В качестве пояснения, в iOS 10 мы представили новую архитектуру ведения журналов для всей системы (подробности см. в Унифицированном ведении журнала и сеансе WWDC 2016 года), а также множество подсистем, включая CFNetwork. процесс перехода к этому. Пока этот ход не будет полностью завершен, вы столкнетесь с некоторыми странными крайними случаями, такими как этот.

Ответ 6

Я столкнулся с той же ошибкой с Alamofire, и это было из-за закрепления сертификата. Сертификат больше не действителен, поэтому мне пришлось удалить его и добавить новый. Надеюсь, поможет.

Ответ 7

В нашей компании есть много ошибок -999 в iOS. Я искал вокруг, нашел причину, две, например, сетевая задача была отменена или сертификат недействителен. Но я проверил наш код, эти два не возможны. Я использую Alamofire  который использует URLSession. К счастью, сеть приложений для Android в нашей компании нормальная. Итак, мы проверим разницу. Мы обнаружили, что http-запрос от iOS - Http2.0, а Android - Http1.1. Таким образом, мы заставляем версию поддержки http бэкэнда до http1.1, затем количество ошибок -999 уменьшается !!!

Я думаю, что может быть какая-то ошибка в Apple URLSession. Проверьте ссылку Новый NSURLSession для каждого перебора DataTask? для некоторых подробностей

Ответ 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