CFStream: удобные ошибки - PullRequest
       2

CFStream: удобные ошибки

4 голосов
/ 30 августа 2010

Мне нужно подключиться к удаленному хосту и обмениваться данными с некоторым двоичным протоколом.Я соединяюсь с:

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"whatever.host.com", 
           port, &readStream, &writeStream);

Все нормально, кроме обработки ошибок.Я

  1. обрабатываю NSStreamEventErrorOccurred в делегате моего потока
  2. , получая ошибку с помощью theError = [stream streamError];
  3. , пытаюсь получить удобный текст ошибки с помощью [theError localizedDescription].

А вот проблема : вместо приятного сообщения об ошибке, например «Хост не найден», я получаю "Operation could not be completed. (NSUnknownErrorDomain error 8.)"
Или, когда устройство находится в самолетеВ режиме я получаю "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)"

Вопрос : как получить соединение через сокет, где я могу получить правильные сообщения об ошибках?Когда я использовал NSURLConnection (в другом приложении), сообщения об ошибках были приятными и дружелюбными, поэтому я хотел бы получить нечто подобное.

Ответы [ 3 ]

2 голосов
/ 09 сентября 2010

Apple не предоставила правильных описаний условий ошибки на iOS. Это не ошибка в вашем коде или их коде - строки просто отсутствуют на устройствах iOS.

Чтобы предоставить более интересную информацию об ошибках, вам нужно проверить домен и код объектов CFError и NSError и вернуть что-то. Список описаний ошибок от kCFErrorDomainCFNetwork доступен здесь на сайте Apple. Код, подобный этому, поможет - вызовите его при создании пользовательского интерфейса представления ошибок:

NSString *GetUsefulErrorDescription(NSError *e) {
    NSString *codeString = [NSString stringWithFormat: @"%li", (long)[e code]];
    NSString *localized = NSLocalizedStringInTable(codeString, [e domain], nil);
    if (!localized || [localized isEqual: codeString])
        return [e localizedDescription];
    else
        return localized;
}

Это выглядит в файле в вашем комплекте приложений с именем "kCFErrorDomainCFNetwork.strings" для строки, такой как "100" (для kCFSOCKSErrorUnknownClientVersion, значение которой вы можете указать как "Сервер SOCKS отклонил доступ, поскольку он не поддерживает соединения с запрошенная версия SOCKS. ") Если такого описания ошибки нет, вместо этого используется строка, возвращаемая NSError, что будет" Операция не может быть завершена. [...] "

1 голос
/ 09 сентября 2010

Я считаю, что подготовка для локализованных описаний ошибок должна происходить на уровне структуры. Другими словами, разработчики фреймворка Foundation предоставили больше полезных сообщений и попросили, чтобы люди по локализации перевели их и т. Д. Судя по вашему описанию, слой CoreFoundation не получил в этом отношении столько внимания.

Существуют ли API-интерфейсы Foundation, которые вы могли бы использовать вместо этого?

0 голосов
/ 04 сентября 2010

Тебе не кажется, что проще поймать ошибку, проверить ее тип и представить собственное сообщение об ошибке?Может быть, мне проще, чем переписывать код, просто чтобы создавать приятные сообщения.Бонус: таким образом, вы получаете полный контроль и можете добавлять более длинные описания, если хотите ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...