SA1112 — Конфиденциальность iOS приложения (App Privacy)
Содержание страницы
iPhone полностью изменил то, как люди используют телефоны. Телефон-это уже не просто устройство для совершения звонков: это целый компьютер в вашем кармане, полный функций и возможностей.
С его помощью App Store изменил способ, которым разработчики предоставляют свой опыт клиентам. Разработчики создают приложения и отправляют их в App Store. Apple просматривает их, а затем они становятся доступными для пользователей. Потенциальные пользователи могут просматривать и находить множество различных приложений, и они доверяют обзору Apple, чтобы гарантировать минимальное качество этого приложения.
Тем не менее, со всеми новыми возможностями, доступными разработчикам, конфиденциальность стала реальной проблемой для всех. Разговор о том, кто владеет вашими данными и как компании могут их использовать,-это вопрос, который вызывает бесконечные дебаты.
Apple заняла твердую позицию по этому вопросу: конфиденциальность людей важна, и они должны решить, хотят ли они делиться какими-либо данными с разработчиками.
Имея это в виду, Apple встроила новые функции в iOS и App Store, чтобы сделать разработчиков более прозрачными, а iOS-более приватной.
В этой главе вы узнаете о:
- Многие функции конфиденциальности iOS.
- Запрос данных о местоположении от пользователей.
- Отправка местоположения пользователя в запросе в API Petfinder для поиска домашних животных рядом с этим местоположением.
- Как приложения адаптируют пользовательский интерфейс для учета выбора конфиденциальности пользователей.
- Раздел конфиденциальности App Store.
Прежде чем начать, подробнее рассмотрим, почему важна конфиденциальность.
Почему конфиденциальность важна
Apple очень серьезно относится к конфиденциальности людей. Он понимает, что люди не хотят делиться каждой деталью своей жизни. Люди имеют право выбирать, чем и сколько они делятся. Вот почему Apple упорно работала над созданием функций конфиденциальности: дать людям выбор в том, чем они хотят поделиться.
Приложения могут захотеть собирать данные, чтобы управлять определенной функцией, делать более целевую рекламу или даже улучшать выпущенные функции.
Apple понимает, что разработчикам может потребоваться доступ к этим данным для создания лучших функций, но это не значит, что у людей нет выбора. Прозрачность, позволяющая пользователям понять, чем они делятся и почему, является важным аспектом конфиденциальности.
Вот почему Apple создала функции, которые позволяют разработчикам запрашивать авторизацию для доступа к этим возможностям и информировать пользователей о том, когда и почему.
Особенности конфиденциальности iOS
Многие функции конфиденциальности iOS ориентированы на прозрачность приложений и разработчиков.
Индикатор камеры и микрофона iOS — отличные примеры. iOS отображает зеленую круглую точку в правом верхнем углу экрана всякий раз, когда приложение использует любую камеру.

Приложение iOS с помощью камеры.
Вы также найдете индикатор в верхней части центра управления, показывающий название приложения, которое недавно использовало камеру.

Центр управления iOS.
Аналогично, когда приложение обращается к микрофону, в правом верхнем углу появляется оранжевая круглая точка.

Приложение iOS с помощью микрофона.
Подобно зеленому свету возле камеры MacBook, эти индикаторы пытаются привлечь внимание пользователей и показать им, что приложение использует эти возможности.
iOS имеет множество других функций конфиденциальности, таких как приглашение буфераобмена, которое показывает баннер, показывающий, что приложение вставляет текст из буфера обмена, или разрешение на доступ к галерее пользователя, контактам или данным о местоположении.
Модификатор представления конфиденциальности
SwiftUI также имеет несколько модификаторов просмотра, чтобы сохранить конфиденциальные данные в тайне. Экраны блокировки могут получить доступ к виджету без разблокировки iPhone, что является потенциальной проблемой, если виджет показывает конфиденциальную информацию.
Apple представила модификаторы redacted(reason:)
и privacySensitive(_:)
view и переменную окруженияredactionReasons
, чтобы помочь решить эту проблему. С помощью этих модификаторов представления можно защитить конфиденциальный контент с учетом контекста.
Взгляните на следующий код:
struct CreditCardView: View { var body: some View { VStack(alignment: .leading, spacing: 82) { VStack(alignment: .leading) { HStack { Text("Ray Bank") .font(.title2) Spacer() Text("platinum") .font(.caption2) } Text("Credit Card") .font(.caption) } VStack(alignment: .leading) { HStack(alignment: .bottom) { Text("1234 5678 9123 456") Spacer() Image(systemName: "flag.square.fill") .font(.title) .imageScale(.large) } HStack { Text("Exp: 02/20") Text("Valid: 02/21") Text("Security Code:") Text("123") } .font(.caption2) } } .padding() .background(.green) .foregroundColor(.white) .mask(RoundedRectangle(cornerRadius: 8)) .padding() } }
Это представление показывает виртуальную кредитную карту из банковского приложения.

Пример отображения конфиденциальной информации.
Кредитные карты содержат конфиденциальную информацию, такую как номер карты, код безопасности и даже имя пользователя. Если бы вы использовали это представление в виджете, номер карты и код безопасности могли бы быть доступны любому через экран блокировки.
Даже с разблокированным iPhone люди могут захотеть отредактировать эти фрагменты информации, чтобы окружающие не могли их видеть.
Вот тутredacted(reason:)
-то и privacySensitive(_:)
вступают в игру. Добавляя privacySensitive(_:)
к чувствительным представлениям и redacted(reason:)
в верхнем представлении иерархии, SwiftUI редактирует эту информацию.
Text("1234 5678 9123 456") .privacySensitive() Text("Security Code:") Text("123") .privacySensitive()
privacySensitive
помечает номер и код безопасности кредитной карты Text
как личные и конфиденциальные данные. Теперь, используя это представление в частном контексте, вы отредактируете эти поля.
struct WidgetView: View { var body: some View { CreditCardView() .redacted(reason: .privacy) } }
WidgetView
это чувствительный контекст, и экран блокировки может отображать его. Вы можете отредактировать эти поля, добавив redacted(reason:)
с причиной .privacy
to CreditCardView
.

Пример сокрытия сенситивной информации.
Вы также можете использовать переменную окруженияredactionReasons
, чтобы изменить способ скрытия представления.
if redactionReasons == .privacy { Text("Hidden card number") } else { Text("1234 5678 9123 456") }
Таким образом, когда представление представлено в чувствительном контексте, скрытое сообщение заменяет номер карты.

Пример отображения конфиденциальной информации со скрытым сообщением.
Вот несколько API, которые вы можете использовать для защиты конфиденциальности пользователей.
PetSave не отображает конфиденциальные данные. Несмотря на то, что он использует местоположение пользователя для поиска домашних животных, он не отображает его ни в одном представлении, поэтому вы не будете использовать эти модификаторы представления.
Расположение и конфиденциальность
Местоположение пользователя — это очень конфиденциальные данные. Это может показать разработчикам, где пользователь живет, ходит или ездит на работу. Таким образом, пользователи должны быть осведомлены и контролировать всякий раз, когда приложения имеют доступ к их местоположению.
Прямо сейчас функция «Животные рядом с вами» не использует местоположение пользователя для поиска домашних животных рядом с ними. Он случайным образом перечисляет домашних животных. Тем не менее, весь смысл этой функции заключается в том, чтобы найти домашних животных, которые соответствуют пользователю и находятся рядом с ними.
Вы будете запрашивать разрешение пользователя на доступ к их данным о местоположении, чтобы улучшить животных рядом с вами.
Добавление местоположения для поиска домашних животных рядом с вами
Чтобы получить доступ к местоположению пользователя, вам сначала нужно спросить его разрешение с уважительной причиной. Помните, что это выбор пользователя, чтобы разрешить доступ к своим личным данным.
Вы создадите новое представление, чтобы запросить разрешение. При наличии этого разрешения пользователи получат список для конкретного местоположения, а не список по умолчанию, который приложение показывает, когда у него нет разрешения на доступ к местоположению пользователя.
Создание представления для запроса разрешения
Внутри AnimalsNearYou/viewsсоздайте новое представление SwiftUI и назовите его RequestLocationView.swift.
Добавьте следующее свойство в новое представление:
@EnvironmentObject var locationManager: LocationManager
LocationManager
это класс, используемый для управления местоположением человека. Вы будете использовать его, чтобы начать отслеживать местоположение человека и попросить у него разрешения сделать это.
Поскольку вы будете использовать один экземпляр LocationManager
на протяжении всего проекта, вы будете использовать @EnvironmentObject
. @EnvironmentObject
это оболочка свойств, которая хранит и разделяет экземпляр между представлениями иерархии представлений.
Затем добавьте следующий метод:
func startUpdatingLocation() { locationManager.startUpdatingLocation() }
startUpdatingLocation
это метод, с LocationManager
которого начинается отслеживание местоположения пользователя. Как только пользователь предоставит разрешение на свои данные о местоположении, LocationManager
он будет отслеживать свое местоположение и вызывать метод делегата locationManager(_:didUpdateLocations:)
с обновленным местоположением.
Затем добавьте следующий импорт в верхней части файла:
import CoreLocationUI
Apple представила новый CoreLocationUI
фреймворк в iOS 15. В основном вы будете использовать его с CoreLocation
, работающим стандартным, известным способом, для запроса доступа к данным о местоположении пользователя.
Затем замените код body
на:
VStack { // 1 Image("creature_dog-and-bone") .resizable() .frame(width: 240, height: 240) // 2 Text(""" To find pets near you, first, you need to share your current location. """) .multilineTextAlignment(.center) // 3 LocationButton { locationManager.startUpdatingLocation() } .symbolVariant(.fill) .foregroundColor(.white) .cornerRadius(8) } .padding() .onAppear { // 4 locationManager.updateAuthorizationStatus() }
Вот разбивка кода:
- Добавляет изображение собаки в качестве заполнителя.
- A
Text
это объясняет, почему пользователь должен поделиться своим текущим местоположением. - Кнопка, чтобы попросить пользователя поделиться своим местоположением. Здесь вы звоните
startUpdatingLocation
, чтобы начать отслеживать местоположение пользователя. - Модификатор
onAppear(perform:)
представления для обновления статуса авторизации при первом появлении представления.
Затем добавьте следующее под RequestLocationView
кодом предварительного просмотра:
.environmentObject(LocationManager())
Этот код нужен для работы предварительного просмотра Xcode, потому что вы используете @EnvironmentObject
внутри представления.
Кнопка новое местоположение
LocationButton
это новая кнопка SwiftUI, которая вносит несколько улучшений в запрос разрешения на доступ к местоположению пользователя. Эта новая кнопка не требует добавления текста причины в info.plist, который объясняет, почему вы хотите получить доступ к данным о местоположении пользователя. Он уже имеет текст по умолчанию и предупреждение для запроса разрешения, когда пользователь нажимает кнопку, и не требует, чтобы вы вручную вызывали метод.
Он также создает согласованный язык дизайна между приложениями iOS, позволяя при этом настраивать их внешний вид.
Типы состояния местоположения
iOS имеет пять статусов авторизации местоположения:
- notDetermined: iOS возвращает этот статус, когда
CLLocationManager
еще не знает, предоставил ли пользователь или отказал в доступе к своим данным о местоположении. - ограниченный: Этот статус не означает, что пользователю отказано в авторизации. Вместо этого он указывает, что у пользователя есть активное ограничение родительского контроля. Пользователь не может изменить статус авторизации. Однако родитель пользователя может изменить его в разделе Настройки ▸ Экранное время ▸ Ограничения контента и конфиденциальности ▸ Конфиденциальность ▸ Службы определения местоположения.
- отказано: этот статус явно указывает, что пользователь отказал в авторизации для этого приложения для доступа к своим данным о местоположении.
- authorizedAlways: Apple представила этот статус в iOS 8 с
authorizedWhenInUse
целью улучшения конфиденциальности пользователей. Это означает, что приложение имеет доступ к данным о местоположении в любое время, даже если пользователь не использует приложение. - authorizedWhenInUse: этот статус указывает, что приложение имеет доступ к данным о местоположении пользователя только тогда, когда пользователь использует приложение.
Вы должны отслеживать эти состояния при работе с данными о местоположении, чтобы обрабатывать их в функциях с использованием данных о местоположении.
Когда вы используете LocationButton
, он предоставляет приложению временное authorizedWhenInUse
разрешение, если пользователь предоставляет разрешение. Это отлично подходит для функций,которые требуют одноразового разрешения для работы.
Обновление животных рядом с вами, чтобы запросить авторизацию
Теперь, когда у вас есть представление для запроса авторизации пользователя, пришло время обновить Animals Near You, чтобы использовать его.
Вернуться внутрь AnimalsNearYouView.swift, добавить:
@EnvironmentObject var locationManager: LocationManager
Эта строка помогает получить доступ locationManager
к использованию @EnvironmentObject
.
Теперь замените код внутри NavigationView
на:
// 1 if locationManager.locationIsDisabled { RequestLocationView() .navigationTitle("Animals near you") } else { // 2 AnimalListView(animals: animals) { if !animals.isEmpty && viewModel.hasMoreAnimals { HStack(alignment: .center) { LoadingAnimation() .frame(maxWidth: 125, minHeight: 125) Text("Loading more animals...") } .task { await viewModel.fetchMoreAnimals() } } } .task { await viewModel.fetchAnimals() } .listStyle(.plain) .navigationTitle("Animals near you") .overlay { if viewModel.isLoading && animals.isEmpty { ProgressView("Finding Animals near you...") } } }
Вот что происходит:
- Во-первых, вы используете
locationIsDisabled
, чтобы проверить, есть ли у вас доступ к местоположению пользователя. Это вычисляемое свойствоLocationManager
, которое проверяет статус местоположения приложения. Если у приложения нет разрешения на доступ к данным о местоположении пользователя, вы показываете новоеRequestLocationView
, чтобы запросить авторизацию. - Если приложение имеет доступ к службам определения местоположения, вы показываете список животных, как и раньше.
Наконец, внутри предварительного просмотра в нижней части файла добавьте следующую строку в конце представления:
.environmentObject(LocationManager())
Этот код делает предварительный просмотр Xcode работать, так как вы используете @EnvironmentObject
внутри AnimalsNearYouView
.
Перед сборкой и запуском вернитесь в contentView.swift и добавьте следующее свойство:
@StateObject var locationManager = LocationManager()
Здесь вы используете @StateObject
для хранения экземпляра LocationManager
. Затем в конце представления вкладки добавьтеenvironmentObject
:
.environmentObject(locationManager)
Затем вы переходите locationManager
к среде представления.
@StateObject
это оболочка свойств , которая работает как@State
, за исключением того, что она создает один экземпляр только один раз, даже если представление признано недействительным и воссоздано заново.
Перед сборкой и запуском обновите код предварительного просмотра следующей строкой в разделеContentView
:
.environmentObject(LocationManager())
Этот код делает работу предварительного просмотра.
Сборка и запуск.

Запрос авторизации пользователя для доступа к его местоположению.
Коснитесь текущего местоположения.

Кнопка текущего местоположения предупреждает пользователя.
При нажатии на кнопку появляется предупреждение с запросом авторизации пользователя для доступа к его местоположению. Пользователь может разрешить или не разрешить это. Если пользователь нажимает «Не сейчас«, то такое же предупреждение отображается до тех пор, пока пользователь не нажмет «ОК«. Таким образом, пользователю становится ясно, что функция определения местоположения будет работать только тогда, когда он разрешит доступ.
При нажатии OK снова отображается список животных.

Список домашних животных.
Отправка данных о местоположении в запросе
Теперь PetSave запрашивает авторизацию для доступа к местоположению пользователя. Тем не менее, он еще ничего не делает с этими данными.
Вы добавите эти данные в тело запроса на выборку животных.
Откройте AnimalsNearYouViewModel.swift и найдите следующий код внутриAnimalsFetcher
:
func fetchAnimals(page: Int) async -> [Animal]
Обновите эту строку с помощью:
func fetchAnimals( page: Int, latitude: Double?, longitude: Double? ) async -> [Animal]
Этот код обновляет метод протокола, чтобы принимать широту и долготу в качестве параметров.
Теперь откройте services/FetchAnimalsService.swift и обновитеfetchAnimals(page:)
, чтобы соответствоватьAnimalsFetcher
:
func fetchAnimals( page: Int, latitude: Double?, longitude: Double? ) async -> [Animal] {
Затем найдите следующие две строки внутриfetchAnimals(page:latitude:longitude:)
:
latitude: nil, longitude: nil
И замените их на:
latitude: latitude, longitude: longitude
Это обновлениеFetchAnimalsService
, чтобы принять latitude
и longitude
передать их в качестве параметров запроса.
Отправка широты и долготы в API Petfinder позволяет искать и возвращать домашних животных в радиусе 100 миль от этого места.
Вернуться внутрь AnimalsNearYouViewModel.swiftimport CoreLocation
и заменить:
func fetchAnimals() async {
С:
func fetchAnimals(location: CLLocation?) async {
Этот код обновляетсяfetchAnimals
, чтобы взять CLLocation
экземпляр с текущим местоположением пользователя.
Затем замените содержимое fetchAnimals(location:)
на:
isLoading = true do { // 1 let animals = await animalFetcher.fetchAnimals( page: page, latitude: location?.coordinate.latitude, longitude: location?.coordinate.longitude ) // 2 try await animalStore.save(animals: animals) // 3 hasMoreAnimals = !animals.isEmpty } catch { // 4 print("Error fetching animals... \(error.localizedDescription)") } isLoading = false
Вот, ты:
- Передайте широту и долготу пользователя из
location
запроса на получение животных. - Храните животных из ответа, как и раньше.
- Установите
hasMoreAnimals
значение false, если ответ не вернул животных. - Поймать и распечатать ошибку, которую может вызвать выборка животных.
Вы также должны обновитьfetchMoreAnimals
, чтобы передать данные о местоположении.
Найдите fetchMoreAnimals
и замените его на:
func fetchMoreAnimals(location: CLLocation?) async {
Затем замените:
await fetchAnimals()
С:
await fetchAnimals(location: location)
fetchAnimals(location:)
теперь будет получать домашних животных с местоположением пользователя.
Прежде чем двигаться дальше, обновите AnimalsNearYouView.swift, чтобы получить местоположение пользователя и передать его вызову модели представления.
Найдите следующую строку:
await viewModel.fetchMoreAnimals()
И замените его на:
await viewModel.fetchMoreAnimals(location: locationManager.lastSeenLocation)
Кроме того, найти:
await viewModel.fetchAnimals()
И замените его на:
await viewModel.fetchAnimals(location: locationManager.lastSeenLocation)
Модель представления использует менеджера местоположения lastSeenLocation
для извлечения домашних животных.
Наконец, вы также должны обновить AnimalsFetcherMock.swift, чтобы соответствовать AnimalsFetcher
.
Откройте AnimalsFetcherMock.swift и замените fetchAnimals(page:)
на:
func fetchAnimals( page: Int, latitude: Double?, longitude: Double? ) async -> [Animal] {
Опять же, метод mock использует latitude
and longitude
для извлечения животных.
Сборка и запуск. Нажмите Текущее местоположение, чтобы перечислить животных рядом с вами.

AnimalsNearYou просмотр с использованием местоположения пользователя.
Отлично, AnimalsNearYouView
теперь использует местоположение пользователя, чтобы перечислить домашних животных рядом с ними.
Однако каждый раз, когда вы закрываете приложение и перезапускаете его, вам придется снова нажать Текущее местоположение.

При повторном запуске приложения нажмите кнопку «Текущее местоположение».
Это потомуLocationButton
, что приложение предоставляет только временное authorizedWhenInUse
. Таким образом, каждый раз, когда вы открываете приложение, вам придется снова нажать Текущее местоположение.
Примечание: Когда пользователь нажимает OK, предупреждение с запросом разрешения больше не отображается.
Это не очень хороший пользовательский опыт, по крайней мере, для такого типа функций.
Вы измените реализацию LocationManager
запроса на постоянную authorizedWhenInUse
.
Запрос авторизации при использовании
Откройте LocationManager.swift и добавьте функцию ниже вLocationManager
:
func requestWhenInUseAuthorization() { cllLocationManager.requestWhenInUseAuthorization() }
requestWhenInUseAuthorization
это метод, CLLocationManager
который запрашивает разрешение пользователя на получение данных о местоположении. Этот метод запрашивает предупреждение для пользователя, запрашивающего разрешение на доступ к своему местоположению.
Примечание: Этот метод требует добавления текста причины внутри info.plist, объясняющего, почему вашему приложению необходимо местоположение пользователя во время использования приложения. Вы используете ключ Privacy — Location при использовании Описание использования и текст, объясняющий, как вы будете использовать местоположение пользователя. Пример проекта уже поставляется с этим текстом внутри info.plist.
Вернуться в RequestLocationView.swift, внутри действия LocationButton
, найти:
locationManager.startUpdatingLocation()
Замените его на:
locationManager.requestWhenInUseAuthorization()
Теперь, когда пользователь нажимает Текущее местоположение, он предложит новому оповещению запросить постоянное authorizedWhenInUse
.
Наконец, удалите PetSave с устройства или симулятора, который вы используете, для получения более точных результатов. Затем соберите и запустите. Коснитесь текущего местоположения.

Запрос пользователя на постоянную авторизацию местоположения, когда приложение используется.
Пользователь может разрешить один раз, разрешить при использовании приложения или не разрешить. Если пользователь нажимает Разрешить один раз, приложение будет иметь тот же одноразовый authorizedWhenInUse
as LocationButton
. Если пользователь нажимает Разрешить во время использования приложения, приложение будет иметь постоянный authorizedWhenInUse
статус .
Если пользователь нажимает «Не разрешено«, приложение не будет иметь доступа к их местоположению, и нажатие кнопки ничего не сделает.
Продолжайте и нажмите различные варианты, чтобы проверить поведение. Вы можете удалить PetSave с устройства или симулятора, чтобы каждый раз начинать все заново.
Точность определения местоположения
iOS также имеет аккуратную функцию для защиты конфиденциальности людей. Большинство функций, которые запрашивают местоположение пользователя, не нуждаются в точном местоположении. Они требуют только приблизительное местоположение, чтобы рекомендовать или найти места рядом с ними.
Разрешая приложению доступ к своему местоположению, люди могут выбрать, является ли это их точное местоположение или нет.

Точное местоположение пользователя включено.
Таким образом, вместо того, чтобы указывать приложению свое полное местоположение, пользователи могут отключить точное местоположение, давая приложению приблизительный диапазон, в котором они находятся. Приложение все еще может использовать эти данные для управления функциями, и точное местоположение пользователя по-прежнему остается конфиденциальным.
Адаптация пользовательского интерфейса в зависимости от уровня точности
Работа с точностью местоположения означает, что приложение должно адаптироваться к некоторым ситуациям. Возьмем, к примеру, Apple Maps. Когда пользователь разрешает приложению использовать точное местоположение, синяя точка на карте представляет их местоположение.

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

Пример Apple Maps отображение заштрихованного круга при выключенном точном местоположении.
Этот пример показывает, как поведение приложения может меняться в зависимости от выбора пользователя.
Еще один способ адаптации Apple Maps-это раздел «Избранное». Если точное местоположение отключено, оно не показывает расчетное время прибытия для каждого места, так как для расчета этого значения требуются более точные данные.

Apple Maps любимый раздел.
Вы можете использовать requestTemporaryFullAccuracyAuthorization(withPurposeKey:)
для запроса точного местоположения временно, чтобы увеличить точность до следующего запуска приложения.
При разработке приложения важно обращать внимание на конфиденциальность пользователей и потребности приложения. Если вам не нужно использовать точные данные о местоположении, нет необходимости просить об этом.
AnimalsNearYouView
требуется местоположение для работы, но не имеет значения, является ли оно точным. API по-прежнему находит домашних животных в радиусе 100 миль.
Обновление тестов
Перед завершением этой функции необходимо обновить тесты, чтобы учесть новое свойство location Manager.
Внутри AnimalsNearYouViewModelTestCase.swiftнайдите следующую строку внутри testFetchAnimalsLoadingState
иtestFetchAnimalsEmptyResponse
:
await viewModel.fetchAnimals()
И замените его на:
await viewModel.fetchAnimals(location: nil)
Затем, внутри testUpdatePageOnFetchMoreAnimals
, замените:
await viewModel.fetchMoreAnimals()
С:
await viewModel.fetchMoreAnimals(location: nil)
И, наконец , внутриtestFetchAnimalsEmptyResponse
, замените:
await viewModel.fetchAnimals() `` With: ```swift await viewModel.fetchAnimals(location: nil)
В этих тестах AnimalsNearYouViewModel
инициализирует местоположение с nil
помощью .
Наконец, внутри EmptyResponseAnimalsFetcherMock
внизу, обновление fetchAnimals(page:)
с:
func fetchAnimals( page: Int, latitude: Double?, longitude: Double? ) async -> [Animal] {
Этот тест теперь использует широту и долготу для выборки животных.
Сборка и запуск тестов.

Тест прошел успешно.
Раздел конфиденциальности App Store
При запуске приложения в App Store Apple заставляет каждого разработчика предоставить список данных, которые собирает их приложение. Раздел конфиденциальности App Store гарантирует, что разработчики объяснят своим пользователям, какие данные они собирают.
Всякий раз, когда разработчик хочет выпустить приложение в App Store, он должен предоставить список данных, которые он и сторонние партнеры собирают. Эта информация позволяет пользователям лучше выбирать и понимать, какие данные они будут предоставлять разработчику перед загрузкой приложения.
Понимание различных типов данных
Apple классифицирует множество типов данных, которые может собирать приложение. Это требует от вас понимания того, какие данные вы собираете, и раскрытия их в следующих категориях:
- Контактная информация: данные, которые могут содержать имя пользователя, адрес электронной почты, телефон, физический адрес или любую другую информацию, которая может быть использована для связи с ним.
- Здоровье и фитнес: данные, относящиеся к здоровью и физической форме пользователя, включая данные из HealthKit API или Fitness API.
- Финансовая информация: любые данные, связанные с платежами и покупками внутри приложения или связанные с активами и финансовой информацией пользователя.
- Местоположение: точные данные о местоположении и информация о местоположении курса любого маршрута, который может выбрать пользователь, включая приблизительное местоположение.
- Конфиденциальная информация: конфиденциальная информация может включать персональные данные, такие как расовые или этнические данные, сексуальная ориентация, политические взгляды и биометрические данные.
- Контакты: приложение может получить доступ к контактам пользователей с именами, номерами телефонов и электронной почтой.
- Пользовательский контент: любые данные, которые пользователи создают, такие как текстовые сообщения, электронная почта, фотографии, видео и аудио данные, а также данные игрового процесса для игр.
- История просмотров: любая информация о контенте, который пользователь просматривал онлайн за пределами приложения.
- История поиска: поиск информации, как поисковые запросы внутри приложения.
- Идентификаторы: любые данные, которые могут идентифицировать пользователя, такие как имя экрана, дескриптор или идентификатор, включая идентификаторы устройств, такие как рекламный идентификатор устройства.
- Покупки: отслеживание покупок пользователя или тенденций покупок.
- Данные об использовании: любые взаимодействия с устройством, такие как нажатия, клики и прокрутка. Любая другая информация, связанная с тем, как пользователь взаимодействует с устройством и приложением, включая информацию о рекламе, которую пользователь, возможно, видел или с которой взаимодействовал.
- Диагностика: Любая производительность, сбой и данные журнала.
- Другие данные: любой другой тип данных, связанных с пользователем.
Эти категории описывают тип данных, которые разработчики могут захотеть собрать. Пользователи могут видеть весь список и какие данные собирает приложение.
Когда вы откроете приложение в App Store и прокрутите вниз, вы найдете раздел конфиденциальности приложения с данными, предоставленными разработчиком.

App Store отображает раздел конфиденциальности приложений.
Например, raywenderlich.com приложение собирает историю поиска пользователя, данные об использовании и идентификатор. Он также собирает диагностические данные, не связанные с пользователями.
Нажатие на раздел откроет подробную информацию о данных, которые он собирает.

Информация о конфиденциальности приложения.
Ключевые моменты
- Конфиденциальность пользователей очень важна. Всегда создавайте свое приложение с учетом конфиденциальности.
- Данные о местоположении также являются частными данными, и разработчики должны обращаться с ними осторожно.
- Вы можете использовать
LocationButton
для функций, которые требуют местоположения человека на одноразовой основе. - Используйте
requestWhenInUseAuthorization
для запроса местоположения человека всякий раз, когда он использует ваше приложение. - Не все приложения требуют точных данных о местоположении. При разработке приложения помните, что люди могут не захотеть делиться своим точным местоположением.
- Раздел конфиденциальности приложений App Store — это место, где вы раскрываете, какие данные собирает ваше приложение.
Куда идти отсюда?
В этой главе вы рассмотрели, что такое конфиденциальность и почему вас это должно волновать. Кроме того, вы добавили функциональность для получения текущего местоположения, чтобы пользователи PetSave могли наслаждаться более персонализированным опытом.
Чтобы узнать больше о конфиденциальности, последних функциях конфиденциальности iOS и запросе данных о местоположении, ознакомьтесь с нашей статьей