测试 CLGeocoder geocodeAddressString 方法地标始终为零

Posted

技术标签:

【中文标题】测试 CLGeocoder geocodeAddressString 方法地标始终为零【英文标题】:test CLGeocoder geocodeAddressString method placemarks is always nil 【发布时间】:2016-08-12 05:39:24 【问题描述】:

代码来自书,第一次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】:

您说这不应该是网络错误,但这正是代码为 2 的 CLErrorDomain 错误 (CLError.Network)。您可以出于多种原因得到它。例如,当我尝试监视与Charles 的通信时,我得到了它,但还没有告诉我的计算机信任查尔斯证书。但是一旦我这样做了,那个错误就消失了。您可能需要确认您没有使用代理服务器或其他干扰 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)

【讨论】:

我会说这是一个超出我能力范围的网络问题,我不小心将代码中填写的地址替换为我的家庭地址并且它有效。感谢您的回答,我真的从您提供的代码中学到了一些东西:)

以上是关于测试 CLGeocoder geocodeAddressString 方法地标始终为零的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 没有互联网连接的 CLGeocoder

同步请求 CLGeocoder.reverseGeocodeLocation

CLLocationManager 和 CLGeoCoder

如何等到 CLGeocoder 完成工作

对许多地址进行地理编码 - CLGeocoder

为啥将 CLGeocoder 与“地标”数组一起使用?