2016-01-15 3 views
2

У меня есть действительный URL-адрес для карт Google, который, если вы запустите в своем браузере, отобразит изображение карты. Однако, когда я положил его в моем Swift кода и попытаться создать NSURL из строки она возвращает нольNSURL возвращает нуль для действительного URL

let urlString = "https://maps.googleapis.com/maps/api/staticmap?maptype=hybrid&center=37.33233141,-122.0312186&path=color:0xff0000|weight:10|37.33233141,-122.0312186|21.422570,%2039.826190&markers=color:blue%7Clabel:S%7C37.33233141,-122.0312186&markers=color:blue%7Clabel:S%7C21.422570,39.826190&zoom=1&size=1080x1920" 
let url = NSURL(string: urlString) 

В настоящее время, это возвращает ноль, я не знаю, почему. Я делаю что-то неправильно?

+0

Я предлагаю вам открыть площадку и попытаться удалите странные символы (:, |), пока он не будет работать. – zneak

+1

Данная строка определенно не является допустимой строкой url. Преступником является персонаж «|» который не разрешен в компоненте запроса. Поскольку компонент запроса, похоже, уже закодирован, это также указывает на ошибку в браузере: если браузер сделал это правильно, он имел _percent escaped_ символ '' 'для'% 7C' – CouchDeveloper

ответ

5

Он должен работать: Вот почему http://www.url-encode-decode.com

 let url = NSURL(string: urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!) 

Поскольку выше API является устаревшим альтернативный подход

let url = NSURL(string: urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!) 
+0

Спасибо Арун, что сработало :) –

+3

Could вы добавляете некоторые объяснения, почему должен работать ваш код? Кодовые ответы не очень полезны для других читателей, которые наткнулись на этот вопрос. – Cristik

+0

@Cristik. Пожалуйста, проверьте ответ. –

1

Глядя на Apple documentation:

Этот метод предполагает URLString к содержат только символы, которые разрешены в правильно сформированном URL-адресе. Все остальные символы должны быть надлежащим образом экранированы. Любые символы с пропущенным процентом интерпретируются с использованием кодировки UTF-8.

Вероятно, есть что-то неправильное в строке, и вам нужно кодировать его, прежде чем передать его NSURL, вы можете сделать это с помощью stringByAddingPercentEncodingWithAllowedCharacters:

if let encodedString = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet() { 
    url = NSURL(string: urlString) 
} 
+0

Как упоминалось в вопросе OPs, фактически данная строка URL не является допустимой строкой url. Он уже закодирован. Таким образом, вы фактически удваиваете процент кодирования. – CouchDeveloper

+1

@CouchDeveloper hmm ... у вас есть действительная точка, поскольку этот конкретный вопрос работает, поскольку запрос является недопустимым, поскольку 'URLQueryAllowedCharacterSet()' не влияет на символы в URL-адресе. Таким образом, функция возвращает действительный url. Тем не менее, это не лучшее решение для решения всех возможных сценариев ... – Cristik

+0

Поскольку данная строка URL неверна, мы ничего не должны ожидать от функций, которые принимают это как ввод. Вместо этого мы должны попытаться исправить то, из чего происходит эта неправильная строка. Соответствующие RFC четко определили, как должна выглядеть действительная строка URL. Также имеется BNF, что позволяет легко составлять и анализировать строки. Веб уже существует на протяжении десятилетий - и мы должны ожидать, что эти вещи в конечном итоге будут работать правильно. Но, все же смешно видеть, как эти самые основные и важные вещи могут пойти не так;) – CouchDeveloper

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