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.