ios включает службы определения местоположения и показывает ближайший город сразу после

Я использую startMonitoringSignificantLocationChanges для своего приложения и хочу сделать следующее.

После того, как пользователь зарегистрируется, я показываю мягкую подсказку, спрашивающую пользователя, предоставит ли он приложению доступ к своему местоположению. Если они нажимают «да», я звоню:

 if([CLLocationManager locationServicesEnabled]) {
      [locationManager startMonitoringSignificantLocationChanges];
 }

Это приводит к подсказке ios, предлагающей пользователю включить службы определения местоположения для приложения. Если пользователь нажимает YES, я хочу получить его текущее местоположение, и если его текущее местоположение близко к одному из городов, в которых работает мое приложение, я просто вернусь в приложение.

Однако, если город не находится близко ни к одному из городов, в которых работает мое приложение, я хочу показать экран со списком доступных городов и попросить их выбрать один. Что я делаю в настоящее время, так это жду на данной странице, пока не сработает обратный вызов locationManager:didUpdateLocations, чтобы у меня было текущее местоположение. Затем я делаю необходимую проверку, чтобы увидеть, близок ли этот город к одному из моих обслуживаемых городов или нет.

Проблема, с которой я сталкиваюсь, заключается в том, что иногда обратный вызов не срабатывает сразу, и пользователь затем застревает на странице подсказки, и ничего не происходит. Как правильно это сделать?

Следует отметить, что меня не волнует точное местоположение — мне нужна общая близость пользователя.


person Atul Bhatia    schedule 25.10.2014    source источник


Ответы (1)


startMonitoringSignificantLocationChanges

Используется для отслеживания изменений в местоположении, но только когда они перемещаются. То, что вы описываете, не обязательно одно и то же. Если я открою ваше приложение и остановлюсь на месте, для запуска методов не произойдет «значительного изменения местоположения».

Из документов Apple

После возврата исправления текущего местоположения приемник генерирует события обновления только при обнаружении значительного изменения местоположения пользователя.

Я бы изменил пассивное «значительное» на это

[locationManager startUpdatingLocation];
person latenitecoder    schedule 25.10.2014
comment
Текущее местоположение приложения не установлено равным нулю в диспетчере местоположений? если бы я сделал [locationManager location], это вернуло бы нулевое значение? - person Atul Bhatia; 25.10.2014
comment
Этот комментарий не ясен. Начало обновления местоположения означает, что приложение отслеживает координаты устройства (виден фиолетовый значок местоположения). Когда у вас есть координаты, вы можете запретить диспетчеру местоположения получать дальнейшие обновления местоположения, остановив его. Это то, что тебе надо? - person latenitecoder; 25.10.2014
comment
Я хочу сказать, что если текущее известное местоположение менеджера местоположения равно нулю, то даже простое нахождение там должно привести к обратному вызову изменения местоположения, верно? - person Atul Bhatia; 25.10.2014
comment
Нет, это не использование по назначению. Он не будет рассматривать разницу между нулем и длинной широтой как существенное изменение местоположения. Если вы думаете об этом, чтобы проверить, движется ли устройство, ему нужно будет проверить 2 набора координат. nil не является координатой, с которой можно сравнивать. - person latenitecoder; 25.10.2014
comment
Тогда можете ли вы объяснить, почему в симуляторе, когда я запускаю отладчик без местоположения (и я убедился, что в этот момент местоположение равно нулю для диспетчера местоположений), а затем я переключаю его на Сан-Франциско, обратный вызов запускается ? - person Atul Bhatia; 25.10.2014
comment
Симулятор именно такой. Переключившись на Сан-Франциско, вы «притворяетесь, что находитесь там». На реальном устройстве вам пришлось бы телепортироваться, чтобы сделать то же самое. Поверьте мне, я делал это 100 раз. Вы уже могли изменить свой код. Если вы поменяете звонок, как я сказал ранее, все будет в порядке. Если вам нужно, чтобы я показал больше кода, забудьте «значительный» и используйте правильный подход. - person latenitecoder; 25.10.2014
comment
Я хочу использовать значительный, а не постоянно обновлять. Мне не нужно столько обновлений. Кроме того, если вы прочитали свой исходный комментарий: вам нужны две координаты, а nil - это не координата для сравнения. Таким образом, вы просто отрицали то, что впервые сказали в этом комментарии ... не имеет значения, телепортировался я в НФ или нет, точка - исходный набор координат равен нулю, поэтому по вашей собственной логике существенные изменения не должны были фиксироваться как изменение. - person Atul Bhatia; 25.10.2014
comment
Вы упускаете суть. Когда вы получаете обновление, вы останавливаете диспетчер местоположений. Если вы хотите убедить себя, что если вы можете телепортироваться в симуляторе, это правильный подход, вперед. Но если вы не можете телепортироваться в реальной жизни, вы на самом деле не тестируете реальную ситуацию. Удачи в работе - person latenitecoder; 25.10.2014
comment
Я не хочу продолжать этот разговор, но хочу сказать, что вы указали мне неправильную причину. Если подумать, чтобы проверить, движется ли устройство, потребуется проверить 2 набора координат. nil не является координатой, с которой можно сравнивать. Это явно неправильно, если симулятор записывает изменение между nil и SF. Что касается реального решения, я понял, что sig location не запускает его как изменение, но все еще загружает исходное местоположение. Я могу просто подключиться к обратному вызову authStatusChanged и проверить, изменился ли статус на утвержденный. Затем я могу напрямую получить доступ к исходному местоположению. - person Atul Bhatia; 25.10.2014
comment
Вы явно не умеете читать документацию. После возврата исправления текущего местоположения приемник генерирует события обновления только при обнаружении значительного изменения местоположения пользователя. Надеюсь, вы предоставите своим пользователям хороший экран ожидания. Может быть, ярлык, объясняющий, что им нужно немного пройтись, чтобы продолжить, или телепортироваться в Сан-Франциско, чтобы продолжить. Удачи с пометкой комментария. - person latenitecoder; 25.10.2014
comment
Лол на враждебность. Опять же, вы сказали, что сравнение нуля с реальной координатой не будет считаться значительным изменением. Вы ошибаетесь на 100% - не понимаю, почему вы пытаетесь спорить со мной по пунктам, которых я даже не касаюсь. Будь осторожен! - person Atul Bhatia; 25.10.2014
comment
Давайте продолжим обсуждение в чате. - person latenitecoder; 25.10.2014