1

我正在尝试使用 Google 路线 API 获取路线。到目前为止我所做的一切都有效。我有搜索功能,可以保存搜索到的位置(使用谷歌的建议位置),然后它会在那里放置一个标记。

我刚刚添加了一些代码,这些代码将使用 Google Directions API 从特定位置(在本例中为我的当前位置)绘制地图。我的应用程序可以跟踪我的位置和所有内容,我没有遇到任何问题。

当我尝试创建在下面附上屏幕截图的 URL 时,我的保护声明中不断出现“错误:无法创建 URL”错误,但我还是有点困惑。它说 key= 的地方就是我输入我的 API 密钥的地方。我显然没有在此屏幕截图中包含它,因为这将使每个人都可以访问我的 API 密钥。

我继续并实际使用打印的 urlString(显示在控制台中)并将 URL 复制到我的网页,它运行良好。它显示了我希望它显示的内容(据我所知),甚至尝试在网页中没有密钥的情况下它仍然有效。有没有人遇到过这个问题?我已经做了传输安全域异常,所以那里没有问题。

我附上了下面的代码。currentLatitude/Longtitude 和 searchedLatitude/Longitude 都是 CLLocationDegrees 类型。Current 是我当前的位置坐标,并且 searched 是用户搜索位置时返回给我的坐标

    let currLat = String(currentLatitude)
    let currLong = String(currentLongitude)

    let seLat = String(searchedLatitude)
    let seLong = String(searchedLongitude)

    let originCoordinateString = "\(currLat), \(currLong)"
    let destinationCoordinateString = "\(seLat), \(seLong)"
    print(currentLatitude)
    print(currentLongitude)
    print(searchedLatitude)
    print(searchedLongitude)
    let urlString = "http://maps.googleapis.com/maps/api/directions/json?origin=\(originCoordinateString)&destination=\(destinationCoordinateString)&sensor=false"

    print(urlString)

    guard let url = URL(string: urlString) else {
        print(urlString)
        print ("Error: cannot create URL")
        return
    }
4

2 回答 2

1

原因是

url = URL(string: urlString)

失败是因为 urlString 包含空格。

从技术上讲,URL 采用严格的标准进行格式化。

浏览器按原样接受它,因为它会在发送之前自动修复它。

在您的情况下,您可以删除originCoordinateStringdestinationCoordinateString变量中的空格。

  • 嘘。
于 2018-04-13T01:24:53.600 回答
0

正如我告诉你的那样:你应该让你的代码“按原样”在 Playground 中运行(你的代码不是这样)。

然而,这很容易在这一点上解决,所以无论如何它都在这里。这不会运行:

let originCoordinateString = "41, 23"
let destinationCoordinateString = "41, 24"
let urlString = "http://maps.googleapis.com/maps/api/directions/json?origin=\(originCoordinateString)&destination=\(destinationCoordinateString)&sensor=false"

print(urlString)

if let url = URL(string: urlString) {
    print(url)
}else {
    print(urlString)
    print ("Error: cannot create URL")
}

这将

let originCoordinateString = "41,23"
let destinationCoordinateString = "41,24"
let urlString = "http://maps.googleapis.com/maps/api/directions/json?origin=\(originCoordinateString)&destination=\(destinationCoordinateString)&sensor=false"

print(urlString)

if let url = URL(string: urlString) {
    print(url)
}else {
    print(urlString)
    print ("Error: cannot create URL")
}

因此,您的问题首先与 JSON 无关,而与您创建的 URL 无关。授予:URL初始化程序的错误“消息”充其量是最小的,但它可以做的很少(除了抛出一个也不好的异常)。那里的空间很大。如果您必须放置它们(显然不是在这种情况下),它们应该被转义,无论是使用+还是使用%20取决于应用程序,但应尽可能避免使用它们。

于 2018-04-13T01:31:06.510 回答