[swift]测试 CLGeocoder geocodeAddressString 方法地标是始终为零

标签: ios Swift
发布时间: 2017/3/6 23:04:07
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

代码是从书,它总是失败的第一个 XCTFail(),试设备和模拟器,它不应该是网络问题,看的错误,它表明Optional(Error Domain=kCLErrorDomain Code=2 "(null)")

func test_GeocoderWorksAsExpected() {
    let expectation = expectationWithDescription("Wait for geocode")
    CLGeocoder().geocodeAddressString("Infinite Loop 1, Cupertino") {
        (placemarks, error) -> Void in
        let placemark = placemarks?.first

        let coordinate = placemark?.location?.coordinate
        guard let latitude = coordinate?.latitude else {
            XCTFail(); return
        }
        guard let longitude = coordinate?.longitude else {
            XCTFail(); return
        }
        XCTAssertEqualWithAccuracy(latitude, 37.3316851, accuracy: 0.000001)
        XCTAssertEqualWithAccuracy(longitude, -122.0300674, accuracy: 0.000001)

        expectation.fulfill()
    }
    waitForExpectationsWithTimeout(3, handler: nil)
}

解决方法 1:

你说它不应该是网络错误,但这正是 CLErrorDomain 错误代码 2 ( CLError.Network )。你可以获得的各种原因。例如,我的当试图监测与查尔斯,沟通,但没有告诉我计算机信任查尔斯证书。但一旦做了,这一错误而去。你可能想要确认不使用代理服务器或其他网络,干扰 TLS/HTTPS 请求。

顺便说一句,我也建议︰

  • 你应该 defer 实现的期望 (所以它得到了应验无论什么路径你拿那关闭); 和
  • 你可能想要减少的纬度和经度的错误检查的准确性,(因为我发现我的结果略有过如此不同)。

所以,也许类似︰

func testGeocoder() {
    let expectation = expectationWithDescription("Wait for geocode")
    CLGeocoder().geocodeAddressString("Infinite Loop 1, Cupertino") { placemarks, error in
        defer { expectation.fulfill() }

        guard error == nil else {
            XCTFail(error!.localizedDescription); return
        }

        guard let coordinate = placemarks?.first?.location?.coordinate else {
            XCTFail("No coordinate"); return
        }

        XCTAssertEqualWithAccuracy(coordinate.latitude, 37.3316851, accuracy: 0.001, "Latitude doesn't match")
        XCTAssertEqualWithAccuracy(coordinate.longitude, -122.0300674, accuracy: 0.001, "Longitude doesn't match")
    }
    waitForExpectationsWithTimeout(3, handler: nil)
}
赞助商