Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将字符串强制转换为NSURL将返回nil_Ios_Swift_Image_Nsurl - Fatal编程技术网

Ios 将字符串强制转换为NSURL将返回nil

Ios 将字符串强制转换为NSURL将返回nil,ios,swift,image,nsurl,Ios,Swift,Image,Nsurl,我正在尝试从url获取图像,如下所示: 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&signatur

我正在尝试从url获取图像,如下所示:

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)
}
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...=
但是它在
url
中返回nil。似乎url不存在,但确实存在,如果您转到url,您将看到一个图像


那么演员阵容有什么问题?或者我怎样才能得到这个图像

这就是我如何使用

编辑 您的url包含对url无效的|,因此您可以使用百分比编码

这里有一个例子

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
        })

问题在于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

,您必须按如下方式向查询中添加百分比编码:

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)
}
if let queryPercentEncoded = query.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
    let url = URL(string: domainAPI + queryPercentEncoded) {
    print(url)
}
Swift 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)
}
if let queryPercentEncoded = query.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
    let url = URL(string: domainAPI + queryPercentEncoded) {
    print(url)
}
(我没有使用基于密钥的身份验证,因此某些部分可能需要修改。)

首先,您需要一个不带签名的正确转义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)
然后,为URL字符串生成base64编码的签名:

let encodedSignature: String = generateEncodedSignature(rawURLString, secret: yourSecretKey)
let signedURLString = "\(rawURLString)&signature=\(encodedSignature)"
之后,您可以创建一个签名URL字符串:

let encodedSignature: String = generateEncodedSignature(rawURLString, secret: yourSecretKey)
let signedURLString = "\(rawURLString)&signature=\(encodedSignature)"
(我相信你有一些功能可以在你的应用程序中生成签名或签名url,请根据它修改上述代码。)

signedURLString
的内容应如下所示:

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)
}
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...=
签名
不能以“u7”开头。)

并使用
signedURLString
创建
NSURL
。不要删除百分比编码

let url = NSURL(string: signedURLString)

您是在真正的iOS设备浏览器上输入该URL,还是使用计算机的浏览器?@LeoDabus我尝试了,但没有删除百分比和相同的内容。@rmaddy我正在使用计算机的浏览器。您必须使用从实际的iOS设备工作的URL。使用Mobile Safari测试URL并查看您得到了什么。它在iOS设备@rmaddyTry上使用给定的URL工作。问题是我的NSURL返回零,因此您无法下载图像。我使用新的
NSURL
收到此消息:您得到此消息是因为管道“|”已转换为“%7C”.@Mr.UB那么我能做些什么来查看图像呢?有一种方法可以使不同的url成为通用的,看看url是从谷歌地图给出的一些坐标来的,那么如果url带有其他参数呢。。。
组件。查询
也可以吗?