Введение: один диалог, который бесит всех

Вы набираете код, смотрите видео или просто читаете почту — и вдруг посреди экрана всплывает:

Allow “Google Chrome” to find devices on local networks?

Вы нажимаете «Don’t Allow», потому что ничего другого не хотите. Проходит несколько дней — диалог возвращается. И снова. И снова.

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

Именно так появился dontallow — маленькая open-source утилита на Swift, которая решает проблему радикально: автоматически нажимает «Don’t Allow» быстрее, чем вы успеваете заметить диалог.


Почему macOS Sequoia превратила это в кошмар

macOS Sequoia и более поздние версии показывают этот диалог при первом обращении приложения к локальной сети. Решение пользователя должно запоминаться.

Но на практике всё иначе. Существует несколько причин, по которым диалог возвращается снова и снова:

Браузеры на Chromium — главные нарушители

Браузеры Chrome, Brave, Edge, Arc и другие на базе Chromium копируют свой app bundle в случайную временную папку при каждом запуске — чтобы подпись кода сохранялась при обновлениях. macOS привязывает решение о локальной сети к этому случайному пути, поэтому каждый следующий запуск выглядит для системы как абсолютно новое приложение. В настройках Privacy накапливаются дублирующиеся записи «Google Chrome.app», которые уже никуда не указывают.

Версионированные пути установки

Приложения с версионированными путями установки (всё, что ставится в .../versions/1.2.3/) получают новую запись в Privacy при каждом обновлении.

Неправильная атрибуция диалога

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

⚠ Важно знать
macOS не предоставляет никакого MDM-payload для предварительного запрета разрешения. Нет поддерживаемого способа очистить список, нет MDM-профиля для предзапрета, а tccutil reset не распространяется на локальную сеть.

graph TD
 A[Приложение запускается] --> B{macOS проверяет путь к .app}
 B --> C[Путь новый / изменился]
 B --> D[Путь совпадает с прошлым]
 C --> E[Показывается диалог]
 D --> F[Разрешение применяется]
 E --> G{Пользователь выбирает}
 G --> H[Don't Allow]
 G --> I[Allow]
 H --> J[Диалог вернётся при след. запуске]
 I --> K[Может вернуться после обновления]


Что такое dontallow и как он работает

dontallow — это минималистичная утилита с открытым исходным кодом, написанная одним Swift-файлом без сторонних зависимостей.

Она нажимает «Don’t Allow» за вас в доли секунды при каждом появлении диалога. Ноль нагрузки на CPU в режиме ожидания. Переживает перезагрузки. Один Swift-файл, никаких зависимостей.

Технический принцип работы

dontallow регистрирует Accessibility-наблюдатель за созданием окон в целевом процессе и «засыпает» до срабатывания события. Затем он читает текст диалога, проверяет, что это именно запрос локальной сети, а не что-то другое, и выполняет нажатие кнопки.

По сути, инструмент использует Accessibility API macOS — тот самый, который применяется в инструментах автоматизации интерфейса. Это легальный, официально поддерживаемый Apple способ взаимодействия с UI-элементами.

Утилита автоматически закрывает диалог через event-driven Accessibility-наблюдатель. Доступны команды: install, uninstall, status, pause, resume, rules.

💡 Почему event-driven, а не polling?
Подход на основе событий (а не регулярного опроса системы) означает, что dontallow буквально потребляет 0% CPU, пока диалог не появился. Это принципиальное отличие от скриптов, которые каждые N секунд проверяют состояние экрана.

Установка и первый запуск

Установка максимально проста — через Homebrew или вручную через make.

Вариант 1: Homebrew (рекомендуется)

brew install johncassil/tap/dontallow

Вариант 2: Сборка из исходников

git clone https://github.com/johncassil/dontallow.git
cd dontallow
make && make install

Активация агента

dontallow install

Команда dontallow install записывает per-user launchd агент, запускает его и открывает System Settings → Privacy & Security → Accessibility, выводя точный путь, который нужно добавить.

После этого нужно выдать программе разрешение Accessibility — macOS попросит об этом сама.

Управление утилитой

dontallow status    # проверить состояние агента
dontallow pause     # временно приостановить
dontallow resume    # возобновить работу
dontallow uninstall # полностью удалить
ℹ Белый список (allowlist)
Если какому-то приложению всё же нужен доступ к локальной сети — например, принтеру или медиасерверу — его можно добавить в исключения командой dontallow rules. dontallow пропустит диалог для этого приложения и не будет нажимать «Don’t Allow».

Сравнение: dontallow vs альтернативные подходы

Помимо dontallow, существуют и другие способы справиться с раздражающим диалогом. Рассмотрим их:

МетодАвтоматизацияБезопасностьСложностьПосле перезагрузки
dontallow✅ Полная✅ Whitelist🟢 Простая✅ Да
Ручное «Don’t Allow»❌ Нет✅ Контроль🟢 Просто❌ Повторяется
Little Snitch✅ Частичная✅ Гранулярно🔴 Сложная✅ Да
Удаление plist-файла❌ Нет⚠️ Риск🔴 Сложная❌ Может сбросить
defaults write (IP-диапазоны)⚠️ Частичная⚠️ Не гарантия🟡 Средняя✅ Да
Hammerspoon-скрипт✅ Возможно✅🔴 Высокая⚠️ Требует настройки

Little Snitch — значительно более мощный инструмент с реальным гранулярным контролем, а не размытым разрешением «да/нет». Но для большинства пользователей это избыточно.

На типичном Mac этот доступ нужен лишь утилитам для принтера/сканера, медиасерверу или LAN-инструментам — и для них достаточно разрешить один раз.


Вопрос приватности: правильно ли блокировать это разрешение?

Диалог «Allow to find devices on local networks?» — это не просто раздражение. За ним стоит реальный вопрос приватности.

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

Доступ к локальной сети позволяет приложению:

  • Обнаруживать устройства через Bonjour/mDNS
  • Подключаться к локальным серверам
  • Собирать данные о топологии вашей домашней/офисной сети

Для Google Chrome или Slack это разрешение, как правило, не нужно для базовой работы браузера или мессенджера. Однако для Plex, медиасерверов, устройств умного дома или приложений для печати — оно необходимо.

📝 Практический совет
Используйте dontallow rules, чтобы добавить в белый список приложения, которым локальная сеть действительно нужна (принтер, NAS, Plex). Все остальные пусть получают автоматический «Don’t Allow» — это разумная политика безопасности по умолчанию.

Технический контекст: баги macOS Sequoia

Стоит отметить, что часть проблем лежит на стороне Apple. Некорректное поведение с правами локальной сети стабильно воспроизводилось на Sequoia 15.1 и иногда на 15.0/15.0.1.

Проблема, по имеющимся данным, была исправлена в Sequoia 15.2. Однако она снова проявилась в macOS Sequoia 15.3.

Даже в сообществе разработчиков Apple этот вопрос остаётся болезненным: на некоторых машинах сетевая коммуникация через приложение просто перестаёт работать спустя время, и расследование показывает, что проблема связана с управлением Local Network Privacy.

В версии v0.1.1 dontallow получил ряд улучшений: исправлена ошибка с путём установки, добавлена пошаговая настройка Accessibility при install и status, усилена защита уведомлений от AppleScript-инъекций, добавлены unit-тесты.


Заключение: маленький инструмент, большое облегчение

dontallow — образцовый пример unix-философии: делать одну вещь, но делать её идеально. Один Swift-файл, event-driven архитектура, ноль зависимостей, ноль нагрузки на CPU — и полное избавление от диалога, который прерывает вашу работу.

Инструмент не решает корневую причину (это задача Apple), но решает проблему пользователя здесь и сейчас. При этом он достаточно умён, чтобы не блокировать приложения из белого списка — те, которым доступ к локальной сети действительно нужен.

Лучшее решение — то, которое не требует вашего внимания вообще. dontallow именно такой.

Ссылки: