2016-10-22 5 views
0

Вход в dictionary(fromTXTRecord:) поступает из сети, потенциально из-за пределов приложения или даже из устройства. Тем не менее, в Apple docs говорят:Словарь NSNetServiceFromTXTRecord не подтверждает утверждение о недопустимом вводе

... Сбой утверждения, если txtData не может быть представлен как объект NSDictionary.

Отсутствие утверждения оставляет программиста (меня) без возможности обработки ошибки, которая кажется нелогичной для метода, который обрабатывает внешние данные.

Если я запускаю это в терминале на Mac:

dns-sd -R 'My Service Name' _myservice._tcp local 4567 asdf asdf 

мое приложение, работает в iPhone, аварии.

dictionary(fromTXTRecord:) ожидает, что данные записи TXT (asdf asdf) будут в форме key=val. Если, как и выше, слово не содержит никакого =, метод не сможет его проанализировать и не выполнить утверждение.

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

Я что-то упустил?

ответ

0

Я все еще надеюсь, что кое-что мне не хватает здесь, но в то же время я закончил проверять данные на предмет правильности и только потом вызвал собственный метод Apple.

Вот мой обходной путь:

func dictionaryFromTXTRecordData(data: NSData) -> [String:NSData] { 
    let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(data.bytes), count: data.length) 
    var pos = 0 
    while pos < buffer.count { 
     let len = Int(buffer[pos]) 
     if len > (buffer.count - pos + 1) { 
      return [:] 
     } 
     let subdata = data.subdataWithRange(NSRange(location: pos + 1, length: len)) 
     guard let substring = String(data: subdata, encoding: NSUTF8StringEncoding) else { 
      return [:] 
     } 
     if !substring.containsString("=") { 
      return [:] 
     } 
     pos = pos + len + 1 
    } 
    return NSNetService.dictionaryFromTXTRecordData(data) 
} 

Я использую Swift 2 здесь. Все вклады приветствуются. Swift 3 версии, версии Objective-C, улучшения, исправления.

0

Я просто столкнулся с этим с помощью Swift 3. В моем случае проблема возникла только тогда, когда я использовал NetService.dictionary(fromTXTRecord:), но не произошел, когда я переключился на Objective-C и вызвал NSNetService dictionaryFromTXTRecord:. Когда вызов Objective-C встречает запись без знака равенства, он создает ключ, содержащий данные, и помещает его в словарь с NSNull. Из того, что я могу сказать, версия Swift затем перечисляет этот словарь и бросает пригонку, когда видит NSNull. Мое решение состояло в том, чтобы добавить файл Objective-C и функцию утилиты, которая вызывает dictionaryFromTXTRecord: и очищает результаты перед передачей их обратно моему коду Swift.

+0

Хороший звонок. Я не думал про попытку с Objective-C. Но, чтобы повторить мой вопрос, разве это не ошибка на стороне Apple? – ateijelo

+0

Поведение делает Swift-версию этого вызова бесполезной, поэтому кажется, что это ошибка. С другой стороны, неясно, как Apple это исправит. NSNull нельзя переносить в словарь Swift типа [String: Data]. Он не может быть превращен в ноль, потому что это эквивалентно удалению ключа. Он не может быть сопоставлен с пустым объектом Data без потери различия между «привет» и «привет»; в Objective-C первое возвращает значение NSNull, а последнее возвращает значение пустого объекта NSData. Так что Apple просто подняла руки на этом. –

Смежные вопросы