iOS. Приемы программирования
Шрифт:
Обсуждение
В этом списке лишь второй элемент требует дополнительного объяснения. Когда пользователь видит окно приложения на экране своего устройства с iOS и переводит это приложение в фоновый режим, возвращаясь на главный экран (нажимая Home), iOS помещает приложение в неактивное состояние. Когда приложение в таком состоянии переведено в фоновый режим, iOS делает скриншот пользовательского интерфейса этого приложения (в точном соответствии с изображением на экране) и сохраняет этот файл в каталоге Library/Caches/Snapshots/. Данный каталог находится в песочнице вашего приложения. Как только пользователь вновь переводит приложение в приоритетный режим, iOS сразу же отображает этот скриншот, и он остается на экране до тех пор, пока приложение не «оживет» окончательно и не примет управление экраном. Поэтому переход из фонового в приоритетный режим в iOS получается
iOS-разработчики, стремящиеся выполнять это требование безопасности, часто совершают одну ошибку. Они пытаются устанавливать в YES или NO значение свойства hidden экземпляра keyWindow. Даже хотя окно keyWindow экземпляра приложения будет валидным окном в момент, когда приложение становится неактивным, в момент «оживления» приложения keyWindow равно nil — то есть указывает в никуда. Следовательно, во избежание возможных ошибок просто пользуйтесь свойством window делегата приложения, отображая или скрывая окно.
Другая проблема, касающаяся безопасности приложения, связана с «оседанием» персональных данных в контроллерах видов. Предположим, у вас есть контроллер вида для входа в систему. Здесь пользователь вводит свои имя и пароль. Как только будет нажата кнопка, которая зачастую называется Login (Вход в систему), вы отправляете учетные данные пользователя на сервер по сетевому HTTPS-соединению. Когда произойдет аутентификация пользователя, вы выдвигаете на экран другой контроллер вида. Проблема, связанная с таким подходом, заключается в том, что имя и пароль, введенные пользователем на предыдущем экране, по-прежнему остаются в памяти (как и сам контроллер вида). Как вы помните, навигационный контроллер включает целый стек контроллеров видов.
Чтобы справиться с этой проблемой и повысить безопасность пользовательского интерфейса, можно присвоить свойству text защищенных текстовых полей значение nil. Это делается в тот самый момент, когда на экран выдвигается второй контроллер вида. Другой способ — переопределить метод экземпляра viewWillDisappear: контроллера вида для входа в систему, а также установить свойство text текстовых полей в nil прямо здесь. Тем не менее такой подход требует известной осторожности, так как упомянутый метод экземпляра контроллера вида вызывается всякий раз, когда контроллер исчезает с экрана — например, когда пользователь покидает вкладку с контроллером вида, уходит на другую вкладку, а потом возвращается на первую. Действительно, при таком переходе контроллер вида успевает и исчезнуть с экрана, и вновь там появиться. Поэтому если пользователь всего лишь перешел на соседнюю вкладку, а вы уже стерли всю информацию, введенную в поля, то при возвращении на первую вкладку пользователь найдет там лишь пустые окошки и будет вынужден заносить всю информацию заново. Разработка всегда ведется в соответствии с поставленными бизнес-требованиями, поэтому не существует однозначного ответа на вопрос о том, как справиться с такой ситуацией.
См. также
Разделы 8.2 и 8.8.
Глава 9. Core Location и карты
9.0. Введение
Фреймворки Core Location и Map Kit можно применять для создания приложений, приспособленных для обработки геолокационной информации (информации о местоположении) и картографических приложений. Фреймворк Core Location использует оборудование устройства для определения актуального местонахождения этого устройства. Фреймворк Map Kit, в свою очередь, позволяет программе отображать для пользователя карты, снабжать карту определенными аннотациями и т. д. С чисто программистской точки зрения доступность геолокационных сервисов зависит от наличия на устройстве необходимого оборудования; если оборудование имеется, то оно должно быть активизировано и подключено
для работы с фреймворком Core Location или Map Kit. Устройство с операционной системой iOS, оснащенное службами GPS (системы глобального позиционирования), позволяет работать с технологиями 2G, EDGE, 3G, 4G и другими, которые помогают определять местоположение пользователя. В настоящее время практически на любых устройствах с iOS поддерживаются геолокационные службы, но программисту рекомендуется проверять доступность таких сервисов и приступать к работе с ними, лишь убедившись в их наличии. Ведь мы и в самом деле не можем знать наверняка, не будет ли в будущем Apple выпускать какое-либо устройство, на котором не будет всего оборудования, необходимого для обеспечения геолокационных функций.В новом компиляторе LLVM, предоставляемом в Xcode для iOS 7, Apple реализовала концепцию модулей. В более ранних версиях SDK и Xcode для использования фреймворков Core Location и Map Kit требовалось вручную импортировать эти фреймворки в целевой проект. Но с появлением модулей для добавления этих фреймворков требуется всего лишь импортировать их заголовочные файлы в классы проекта, вот так:
И все. Фреймворки Core Location и Map Kit окажутся в ваших проектах.
9.1. Создание картографического вида
Постановка задачи
Необходимо инстанцировать и отобразить карту в экранном виде.
Решение
Создайте экземпляр класса MKMapView, после чего добавьте его к виду либо присвойте подвиду контроллера вашего вида. Вот пример. h-файла такого контроллера вида, в котором создается экземпляр MKMapView, после чего этот вид отображается в полноэкранном режиме:
Это обычный корневой контроллер вида, содержащий переменную MKMapView. В следующем коде в реализации данного контроллера вида (.m-файле) мы инициализируем карту и зададим для нее тип Satellite:
Обсуждение
Создать экземпляр класса MKMapView довольно легко. Можно просто присвоить ему рамку, воспользовавшись его же конструктором, а после того как карта будет создана, добавить ее в качестве подвида к виду, который в настоящий момент отображается на экране. И все, мы сможем просматривать карту.
MKMapView — это подкласс UIView. Таким образом, можно манипулировать любым картографическим видом тем же способом, каким вы работаете с экземпляром UIView. К примеру, мы пользуемся свойством UIView для того, чтобы вставить в вид его свойство backgroundColor.
Вы, наверное, уже заметили, что у класса MKMapView есть свойство под названием mapType, характеризующее тип карты. Карта может быть спутниковой, стандартной или гибридной. В примере мы пользуемся картой спутникового типа (рис. 9.1).