Опубликовано 2022-11-19

Недавно на работе нас попросили скрыть(*спрятать) содержимое виджетов экрана блокировки, когда устройство заблокировано, подобно виджету Activity Rings, который не показывает ваш ежедневный прогресс, когда вы блокируете устройство. Оказалось, что не так уж очевидно, как этого добиться. В этом небольшом посте я хочу рассказать о том, что необходимо для достижения такого же поведения, как у виджета Activity Rings.

Скрытие, Определяемое Пользователем

Перед непосредственным погружением в тему, стоит упомянуть, что пользователи, независимо от того, что предлагает ваш виджет в плане защиты конфиденциальности, могут решить спрятать все виджеты, когда устройство заблокировано. Чтобы добиться этого, перейдите в раздел:

Настройки -> Face ID & код-пароль далее активируйте Виджеты главного экрана в разделе Доступ с блокировкой экрана.  Это приведет к затемнению(;размытию) каждого виджета Экрана Блокировки, независимо от его реализации, при использовании .privacySenstive(_:)(doc).

Настраиваемое Скрытие при блокировке устройства

Как мы уже видели, пользователи могут выбирать их собственные настройки, когда нужно что-то спрятать. Но иногда необходимо, чтобы мы не полагались на то, что пользователь активирует какой-то скрытый переключатель глубоко в настройках iOS. Чтобы всегда скрывать виджеты, когда устройство заблокировано, вам нужно настроить две вещи:

 1. Выберите NSFileProtectionComplete(doc) и добавьте его в файл вашего виджета Entitlements:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.developer.default-data-protection</key>
	<string>NSFileProtectionComplete</string>
</dict>
</plist>

⚠ NSFileProtectionComplete будет правильно работать только на реальном устройстве. В симуляторе это ни на что не влияет.

2. Добавьте модификатор privacySensitive(_) в код вью ваших виджетов.

Text("My Widget View")
    .privacySensitive()

Теперь попробуйте запустить ваш виджет на реальном устройстве. Вы должны увидеть поведение, похожее на то, что показано в следующем видео:

Заключение 

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

Я надеюсь, что эта небольшой пост поможет вам реализовать Скрытие на Экране Блокировки для вашего следующего виджета.

До встречи в следующий раз!


Комментарии (2)


  1. fugasio
    03.12.2022 16:20
    +1

    Утром мне ваш пост сломал мозг, а теперь я понял что это просто некорректный перевод: redact - это не редактировать, а цензурировать. Смысл действий в посте чтобы на заблокированном экране было не видно значений в виджетах, если эти значения слишком приватны для пользователя и он хотел бы чтобы они отображались только когда он разблокировал устройство. Вы же не просто Гугл транслейтером пользуетесь, верно?


    1. fugasio
      03.12.2022 16:27
      +2

      И это не говоря о том, что статья по сути ничего в себе не несет, и кроме того, дает ложные знания о com.apple.developer.default-data-protection, который к делу отношения не имеет. Это к автору, конечно, но выбор для перевода крайне странный все же, если не учитывать, что в вопросе переводчик не разбирается.