Подтвердить что ты не робот

Вид предупреждения исчезает сам по себе при вызове [requestManager requestWhenInUseAuthorization];

Я звоню

[locationManager requestWhenInUseAuthorization];

на экране, который показывает MKMapView (showsUserLocation = YES). Что кажется странным в первую очередь (Apple должна обрабатывать это для MKMapView автоматически, но XCode жаловался, когда я этого не делал).

Итак, я получаю представление предупреждения, в котором говорится, что приложение хочет использовать ваше местоположение, но затем представление предупреждения исчезает само по себе.

Почему представление предупреждения исчезает само по себе?

Единственное, о чем я могу думать, это то, что я вызываю requestWhenInUseAuthorization в методе initWithCoder. Я делаю это только потому, что, по-моему, я видел жалобу Xcode при вызове из viewDidLoad.

4b9b3361

Ответ 1

Вы, вероятно, ARC'd. Убедитесь, что у вас все еще есть ссылка на ваш CLLocationManager. Вы можете легко сделать это, сделав это свойством.

ARC означает автоматический подсчет ссылок. В проекте с поддержкой ARC (и если вы не работаете над чем-то действительно старым или не отключили его специально, ваш проект является проектом с поддержкой ARC), вам необходимо сохранять ссылки на объекты, которые вы будете использовать позже. CLLocationManager не возвращает синглтон, поэтому вам нужно сохранить ссылку на него в ваших классах, которые заботятся. Что-то вроде этого:

@property (strong, nonatomic) CLLocationManager *locationManager

См. Документацию Apple ARC для получения подробной информации. (И спасибо Фалько за то, что он нашел глубокую ссылку на это.)

Я добавляю комментарий Гоби на тот случай, если вы не прокрутите его, чтобы прочитать.

Для Swift: вместо создания объекта локальной области locationManager, пусть это будет свойство ваших классов, которые заботятся, например, private let locationManager = CLLocationManager(), а затем обычно используется как self.locationManager.requestWhenInUseAuthorization()

Ответ 2

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