Как проверить правильность CLLocation в iOS - PullRequest
6 голосов
/ 03 марта 2012

Как проверить достоверность CLLocation в iOS?

На самом деле это моя ситуация,

Я просто создаю новую карту

mapView = [[MKMapView alloc] initWithFrame:CGRectMake(10, 30, 300, 380)];
mapView.showsUserLocation = YES;
[mapView setDelegate:self];

А потомЯ хочу проверить правильность местоположения пользователя

mapView.userLocation.location 

Поскольку я получаю эту ошибку при использовании местоположения пользователя

'NSInvalidArgumentException', reason: 'Invalid Coordinate -180.00000000, -180.00000000'

Заранее спасибо ~

Ответы [ 2 ]

10 голосов
/ 03 марта 2012

Как следует из комментария Abizern, вы не должны предполагать, что местоположение будет готово к использованию сразу после установки showsUserLocation в YES.

Когда местоположение доступно, представление карты вызовет свой метод делегата didUpdateUserLocation.
(Если получить местоположение не удается, будет вызван метод делегата didFailToLocateUserWithError.)

Помимо метода didUpdateUserLocation, есть несколько способов проверить, можно ли использовать местоположение:

  • Проверьте, является ли userLocation.location nil. Если это так, местоположение еще не было получено, оно не выполнено или showsUserLocation равно NO.
  • Если местоположение не nil, , тогда вы можете посмотреть на свойство coordinate, и это можно проверить (если вы считаете, что оно может быть недействительным), используя CLLocationCoordinate2DIsValid функция. Однако обратите внимание, что координата 0,0 действительна (это обычно происходит, когда местоположение равно нулю).

Я заметил, что даже в методе делегата didUpdateUserLocation 1035 * может быть nil.

Похоже, это происходит при первом запуске приложения и после установки showsUserLocation на YES. В этот момент iOS предлагает пользователю «Разрешить приложению использовать ваше местоположение?» в то же время вызывается делегат (хотя пользователь еще не ответил на приглашение и местоположение не было определено).

Таким образом, в верхней части этого метода делегата вы также должны проверить, является ли userLocation.location nil.


Кстати, в вашем коде вы можете установить делегата до установки showsUserLocation.

6 голосов
/ 28 августа 2012

Чтобы опираться на объяснение Анны К., обычно рекомендуется проверять действительность CLLocationCoordinate2DIsValid (YOURLOCATION).

Если вы получаете латы и лоты из веб-службы или базы данных SQLite, вам следует проверитьи убедитесь, что местоположение действительно, прежде чем пытаться добавить аннотацию на карту.Вот пример этого в действии:

for (int i = 0; i < [yourArray count]; i++) {

    YourOBJ *obj = [yourArray objectAtIndex:i];

    yourCLLocation2D.latitude = obj.latitude;
    yourCLLocation2D.longitude = obj.longitude;

    AnnotationPin *anno = [[AnnotationPin alloc] initWithCoordinate: yourCLLocation2D];

    if (CLLocationCoordinate2DIsValid(yourCLLocation2D))
    {
        anno.lat = obj.latitude;//Maybe you want to store lat
        anno.lon = obj.longitude;//and lon
        anno.title = obj.name//define the title
        anno.subtitle = obj.info//and subtitle for your annotation callout
        anno.yourLocation = yourCLLocation2D;//Some of these aren't necessary
        anno.tag = i;//but can really help to define and track pins

        [map addAnnotation:anno];
    }

    [anno release];
}

Для всех тех, у кого возникли проблемы, когда вы успешно добавляете связку булавок на карту и с тем же кодом пытаетесь добавить другой набор булавок, кромеприложение вылетает, попробуйте это как можно скорее.Для тех, кто имеет подобную ситуацию в этом примере, но не столкнулся с какими-либо проблемами, сделайте это в любом случае!Ваши пользователи могут добавить неправильный лат / лон комбо и вывести приложение из строя, если вы предоставите им эту функцию.

Помните, что (0,0) является допустимой координатой, поэтому не беспокойтесь об этой логике, удаляя ее, еслиВы обеспокоены этим.Это для тех (-200,75) координат типа, которые физически не существуют на планете Земля.

...