NSURLErrorDomain код помилки -999 в iOS


76

Я намагався використовувати Facebook API Corona SDK, щоб опублікувати оцінку в грі, яку розробляю, на Facebook. Однак у мене з цим проблема. Під час першої спроби розмістити повідомлення на facebook, я отримую цю помилку після входу та автентифікації користувача:

Код помилки NSURLErrorDomain -999

Тоді це не буде розміщено на Facebook. Які можливі причини цієї помилки та як я можу її усунути? Я намагався шукати в Інтернеті, але не міг знайти про це інформацію. Заздалегідь спасибі.

До речі, я не використовую webview у своєму додатку. Просто віджет api та прослуховувач show_dialog у моєму класі на Facebook.

Відповіді:


138

Помилка була задокументована в бібліотеці розробників Mac (документи для iOS)

Відповідним сегментом з документації буде:

URL завантажує коди системних помилок

Ці значення повертаються як властивість коду помилки об’єкта NSError із доменом “NSURLErrorDomain”.

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

Як ти бачиш; -999викликаєтьсяErrorCancelled . Це означає: ще один запит робиться до того, як попередній запит буде завершено.


4
Це може означати (error.code == NSURLErrorCancelled == -999), а error.domain (NSString) - NSURLErrorDomain. Ви отримуєте це, коли скасовуєте завдання за допомогою скасувати
Райан Хайтнер

Привіт hjpotter92, Мій додаток аварійно завершує роботу, коли ця помилка мала допомогу?
Gopal Devra

12
Хотів додати, що ви отримуєте таку ж помилку (-999), коли SSL-сертифікат сервера має проблеми (тобто термін його дії закінчився чи недійсний)
arrteme

1
@ hjpotter92 Я міг би посилатися на цю відповідь stackoverflow.com/a/40100179/3065769 ; Я отримував помилку -999 Canceled Error у консолі, але виконуючи той самий запит POST через curl, я отримав повідомлення про те, що на сервері були проблеми SSL; Хоча я не маю великих знань у цій галузі
arrteme

4
Я щойно отримав -999 і маю недійсний сертифікат SSL. Я виправив сертифікат, і -999 вже немає.
Флоріан Каргет

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, я бачу це. Тож важко сказати, чи є він помилковим позитивним чи іншим. Я також не виявив нічого поганого в поведінці програми.
Micah Montoya

Хтось знає, як це зробити швидко?
Сем

представлений вами код не має нічого спільного з NSURLSession або помилкою, описаною в OP. Коди помилок не є унікальними - вони унікальні лише в межах свого домену (NSURLDomain). як будь-яка хитрість інтерфейсу може спричинити збій завдання NSURLSession?
Motti Shneor

8

Просто хотів додати сюди, при отриманні -999 "cancelled"проблеми зазвичай є одна з двох речей:

  • Ви знову виконуєте той самий запит.
  • Ви підтримуєте слабке посилання на свій managerоб’єкт, який передчасно вивільняється. (Створіть сильну посилання)

Отже, що не так із точно таким самим запитом? Я просто хочу оновити сторінку.
Кімі Чіу

2
Я мав би детальніше пояснити, я мав на увазі виконання точно такого самого запиту, поки той самий об’єкт вже «виконується» (= наприклад, завантаження даних). Потім перший запит анулюється, щоб виконати другий.
Рамон,

Отже, якщо я використовую POSTметод для надсилання того самого JSONрядка на ту саму адресу, він буде скасовано? У моєму випадку це просто скасовує, навіть якщо попередній запит зроблено.
Кімі Чіу

@Chris Graf: Я змінив ваше редагування, оскільки хотів би зберегти простоту цієї відповіді. Хоча я погоджуюсь із вашим вкладом. Будь ласка, опублікуйте свій коментар як окрему відповідь для інших! :)
Рамон,

@Ramon не турбуйтеся, я додав третій варіант в окремій відповіді , дякую за оновлення!
Кріс Граф

4

Я зіткнувся з тією ж помилкою з Alamofire, і це було через закріплення сертифіката. Сертифікат вже не був дійсним, тому мені довелося його видалити та додати новий. Сподіваюся, це допоможе.


1

Я не використовував Facebook API Corona SDK, але зіткнувся з цією проблемою при використанні 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
    }

    }

компілятор нічого не визначає, виконується під час виконання
Хав'єр Ріварола

1

Додаток нашої компанії має багато помилок -999 в iOS. Я шукав навколо, знайшов причину дві, наприклад, мережеве завдання було розблоковано або сертифікат недійсний. Але я перевірив наш код, ці два неможливі. Я використовую Alamofire, який використовує URLSession. На щастя, мережа андроїд-додатків нашої компанії є нормальною. Тож перевіряємо різницю. Ми виявили, що http-запит від iOS - Http2.0, тоді як Android - Http1.1. Отже, ми змушуємо версію підтримки серверного сервера http до http1.1, а потім знижується кількість помилок -999 !!!

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


1

На додаток до написаного Рамоном , є третя можлива причина отримання NSURLErrorDomain -999 cancelled:

Ви скасували завдання під час його виконання, викликавши .cancel()об'єкт обробки даних або тому, що використовували .invalidateAndCancel()об'єкт сеансу. Якщо ви створюєте власний сеанс з делегатом, вам слід зателефонувати .invalidateAndCancel()або .finishTasksAndInvalidate()вирішити надійне посилання між сеансом та його делегатом, як зазначено в Документації розробника Apple :

Об’єкт сеансу зберігає надійне посилання на делегата, поки ваша програма не вийде або явно не призведе до недійсності сеансу. Якщо ви не зробите сеанс недійсним, ваша програма витікає з пам’яті, поки не вийде.

Якщо ви цікавитесь такою поведінкою ведення журналу, я знайшов таке пояснення на форумах розробників Apple :

Для пояснення, ще в iOS 10 ми ввели нову архітектуру ведення журналів для всієї системи реєстрації (дивіться уніфіковану реєстрацію та відстеження активності WWDC 2016 Session 721 ) та багато підсистем, включаючи CFNetwork, переходять що. Поки цей крок не буде повністю закінчений, ви зіткнетеся з дивними випадками краю, як цей.


0

Я отримував цю помилку в конкретній версії програми Xamarin для iOS. Не впевнений в основній причині, але в моєму випадку я зміг обійти це за допомогою методу 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.