2016-09-22 5 views
2

Я пытаюсь получить изображение из URL, как это:Casting Строка NSURL возвращает ноль

var string = "https://maps.googleapis.com/maps/api/staticmap?key=AIzaSyAJeHxZaZuNsYimNCJ4r0yuO-OYM8cINOI&center=6.241381,-75.595083&zoom=13&size=600x300&path=color:0x0000ff|weight:5|6.241381,-75.595083&signature=u7sM3m2h-qFSJoARR7cqD0CSBvU=" 

let url = NSURL(string: string.stringByRemovingPercentEncoding!) 

if let data = NSData(contentsOfURL: url){ 
     let image = UIImage(data: data) 
} 

но он возвращает ноль в url. Кажется, что URL-адрес не существует, но, если вы перейдете к URL-адресу, вы увидите изображение.

Так в чем же проблема с литой? или как я могу получить этот образ.

+0

Вы вводите этот URL-адрес в реальном браузере устройства iOS или используете браузер своего компьютера? – rmaddy

+0

@LeoDabus Я пробовал, не снимая процентов и то же самое. –

+0

@rmaddy Я использую браузер своего компьютера. –

ответ

1

Проблема заключается в том, что вертикальные полосы (|) в части запроса вашего URL. Их следует избегать как %7C.

Вот как я бы построить URL, который автоматически избежать часть запроса:

var components = NSURLComponents(string: "https://maps.googleapis.com/maps/api/staticmap")! 
components.query = "key=AIzaSyAJeHxZaZuNsYimNCJ4r0yuO-OYM8cINOI&center=6.241381,-75.595083&zoom=13&size=600x300&path=color:0x0000ff|weight:5|6.241381,-75.595083&signature=u7sM3m2h-qFSJoARR7cqD0CSBvU=" 

if let url = components.url { 
    // ... 
} 

Если вы используете Swift 3, NSURLComponents переименован в URLComponents

+0

Существует один способ сделать это для разных URL-адресов, посмотрите, что URL-адрес получен из некоторых координат, заданных GoogleMaps, так что, если URL-адрес поставляется с другими параметрами ... Будет также работать 'components.query'? –

2

Это, как я загрузка изображений в моем приложении с помощью AlamofireImage

let url = NSURL(string:"someUrl") 
       self.imgView.af_setImageWithURL(url!, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(0.5), runImageTransitionIfCached: false, completion: { (error) in 
       // do Something when asynchronous image loading is completed 
      }) 

EDIT Ваш URL содержит | который недействителен для URL-адреса, поэтому вы можете использовать PercentEncoding.

Вот пример

let strurl = "https://maps.googleapis.com/maps/api/staticmap?key=AIzaSyAJeHxZaZuNsYimNCJ4r0yuO-OYM8cINOI&center=6.241381,-75.595083&zoom=13&size=600x300&path=color:0x0000ff|weight:5|6.241381,-75.595083&signature=u7sM3m2h-qFSJoARR7cqD0CSBvU=" 
let myURL = NSURL(string: strurl.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!) 
self.imgView.af_setImageWithURL(myURL!, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(0.5), runImageTransitionIfCached: false, completion: { (error) in 
      // do Something when asynchronous image loading is completed 
     }) 
+0

Попробуйте себя с заданным URL. –

+0

Проблема в том, что мой NSURL возвращает nil, поэтому вы не можете загрузить изображение –

+0

Я получаю это сообщение с новым 'NSURL': [link url] (https://maps.googleapis.com/maps /api/staticmap?key=AIzaSyAJeHxZaZuNsYimNCJ4r0yuO-OYM8cINOI¢er=6.241381,-75.595083&zoom=13&size=600x300&path=color:0x0000ff%7Cweight:5%7C6.241381,-75.595083&signature=u7sM3m2h-qFSJoARR7cqD0CSBvU=) –

2

Вы должны добавить процент кодирования к вашему запрос следующим образом:

Swift 2,3

let domainAPI = "https://maps.googleapis.com/maps/api/staticmap?" 
let query = "key=AIzaSyAJeHxZaZuNsYimNCJ4r0yuO-OYM8cINOI&center=6.241381,-75.595083&zoom=13&size=600x300&path=color:0x0000ff|weight:5|6.241381,-75.595083&signature=u7sM3m2h-qFSJoARR7cqD0CSBvU=" 
if let queryPercentEncoded = query.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet()), 
    let url = NSURL(string: domainAPI + queryPercentEncoded) { 
    print(url) 
} 

Swift 3

if let queryPercentEncoded = query.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), 
    let url = URL(string: domainAPI + queryPercentEncoded) { 
    print(url) 
} 
0

(я не использовал проверку подлинности ключа на основе, поэтому некоторые части, возможно, должны быть изменены.)

Во-первых, вам нужно правильно процентов маскирование URL строка без подписи:

let key = "AI...OI" // better hide your actual key in a public space... 
let rawURLString = "https://maps.googleapis.com/maps/api/staticmap?key=\(key)&center=6.241381%2B-75.595083&zoom=13&size=600x300&path=color%3A0x0000ff%7Cweight%3A5%7C6.241381%2B-75.595083" 
//`rawURLString` needs to be a valid string representation of URL. 
assert(NSURL(string: rawURLString) != nil) 

И затем, сгенерировать base64-закодированные подписи для строки URL:

let encodedSignature: String = generateEncodedSignature(rawURLString, secret: yourSecretKey) 

После этого, вы можете создать подписанную строку URL:

let signedURLString = "\(rawURLString)&signature=\(encodedSignature)" 

(Я считаю, что у вас есть некоторые функциональные возможности для создания подписи или подписанный URL в своем приложении, изменять выше код в соответствии с ним.)

содержание signedURLString должно выглядеть следующим образом:

https://maps.googleapis.com/maps/api/staticmap?key=AI...OI&center=6.241381%2B-75.595083&zoom=13&size=600x300&path=color%3A0x0000ff%7Cweight%3A5%7C6.241381%2B-75.595083&&signature=u7...= 

(signature может не начинаться с «u7».)

И создать NSURL, используя signedURLString. Не удаляйте процентные кодировки.

let url = NSURL(string: signedURLString) 
Смежные вопросы