Песочница приложения Xamarin.Mac
В этой статье рассматривается песочница приложения Xamarin.Mac для выпуска в App Store. Он охватывает все элементы, которые входят в песочницу, такие как каталоги контейнеров, права, определяемые пользователем разрешения, разделение привилегий и принудительное применение ядра.
Обзор
При работе с C# и .NET в приложении Xamarin.Mac у вас есть та же возможность песочницы приложения, что и при работе с Objective-C приложением Swift.
В этой статье мы рассмотрим основы работы с песочницей в приложении Xamarin.Mac и всех элементах, которые попадают в песочницу: каталоги контейнеров, права, разрешения, определяемые пользователем разрешения, разделение привилегий и принудительное применение ядра. Настоятельно рекомендуется сначала ознакомиться со статьей Hello, Mac , в частности в разделах "Введение в Xcode" и "Конструктор интерфейсов" и "Торговых точек" и "Действия ", поскольку рассматриваются основные понятия и методы, которые мы будем использовать в этой статье.
Возможно, вам потребуется ознакомиться с классами И методами C# в Objective-Cразделе документа Xamarin.Mac Internals, а также объяснить Register
Export
и атрибуты, используемые для подключения классов C# к Objective-C объектам и элементам пользовательского интерфейса.
Сведения об песочнице приложения
Песочница приложения обеспечивает надежную защиту от ущерба, который может быть вызван вредоносным приложением, запущенным на Компьютере Mac, путем ограничения доступа, который приложение должно иметь системные ресурсы.
Приложение, отличное от песочницы, имеет полные права пользователя, выполняющего приложение, и может получить доступ к приложению или сделать все, что может пользователь. Если приложение содержит дыры безопасности (или любую платформу, которую он использует), хакер может потенциально эксплуатировать эти слабые места и использовать приложение для контроля над mac, на котором он работает.
Ограничивающий доступ к ресурсам на основе каждого приложения, изолированное приложение обеспечивает линию защиты от кражи, повреждения или злонамеренного намерения приложения, работающего на компьютере пользователя.
Песочница приложения — это технология управления доступом, встроенная в macOS (применяется на уровне ядра), которая обеспечивает двухкратную стратегию:
- Песочница приложений позволяет разработчику описать , как приложение будет взаимодействовать с ОС, и таким образом предоставляется только права доступа, необходимые для выполнения задания, и больше нет.
- Песочница приложения позволяет пользователю легко предоставлять доступ к системе с помощью диалоговых окон "Открыть и сохранить", перетаскивать операции и другие распространенные взаимодействия с пользователем.
Подготовка к реализации песочницы приложения
Ниже приведены элементы песочницы приложения, которые будут подробно рассмотрены в этой статье:
- Каталоги контейнеров
- Объемы обслуживания
- Определяемые пользователем разрешения
- Разделение привилегий
- Принудительное применение ядра
После понимания этих сведений вы сможете создать план внедрения песочницы приложения в приложении Xamarin.Mac.
Во-первых, необходимо определить, является ли приложение хорошим кандидатом на песочницу (большинство приложений). Затем необходимо устранить все несовместимости API и определить, какие элементы песочницы приложений потребуются. Наконец, ознакомьтесь с использованием разделения привилегий, чтобы максимально повысить уровень защиты приложения.
При внедрении песочницы приложения некоторые расположения файловой системы, которые использует приложение, будут отличаться. В частности, у приложения будет каталог контейнеров, который будет использоваться для файлов поддержки приложений, баз данных, кэшей и других файлов, которые не являются пользовательскими документами. MacOS и Xcode обеспечивают поддержку переноса этих типов файлов из устаревших расположений в контейнер.
Краткое руководство по песочнице
В этом разделе мы создадим простое приложение Xamarin.Mac, использующее веб-представление (для которого требуется сетевое подключение, ограниченное в песочнице, если не запрашивается специально) в качестве примера начала работы с песочницей приложения.
Мы убедимся, что приложение на самом деле песочницу и узнайте, как устранять распространенные ошибки песочницы приложений и устранять их.
Создание проекта Xamarin.Mac
Давайте создадим пример проекта:
Запустите Visual Studio для Mac и щелкните ссылку "Создать решение".
В диалоговом окне "Новый проект" выберите приложение>Mac App>Cocoa:
Нажмите кнопку "Далее", введите
MacSandbox
имя проекта и нажмите кнопку "Создать":На панели решений дважды щелкните файл Main.storyboard, чтобы открыть его для редактирования в Xcode:
Перетащите веб-представление в окно, чтобы заполнить область содержимого и установить ее для увеличения и сжатия окна:
Создайте выход для веб-представления:
webView
Вернитесь к Visual Studio для Mac и дважды щелкните файл ViewController.cs на панели решений, чтобы открыть его для редактирования.
Добавьте следующую инструкцию using:
using WebKit;
ViewDidLoad
Сделайте метод следующим образом:public override void AwakeFromNib () { base.AwakeFromNib (); webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com"))); }
Сохранение изменений.
Запустите приложение и убедитесь, что веб-сайт Apple отображается в окне следующим образом:
Подписывание и подготовка приложения
Прежде чем включить песочницу приложений, сначала необходимо подготовить и подписать приложение Xamarin.Mac.
Давайте сделаем следующее:
Войдите на портал разработчика Apple:
Выберите сертификаты, идентификаторы и профили:
В разделе "Приложения Mac" выберите идентификаторы:
Создайте новый идентификатор для приложения:
В разделе "Профили подготовки" выберите "Разработка":
Создайте новый профиль и выберите " Разработка приложений Mac":
Выберите идентификатор приложения, созданный выше:
Выберите разработчиков для этого профиля:
Выберите компьютеры для этого профиля:
Присвойте профилю имя:
Нажмите кнопку Готово.
Внимание
В некоторых случаях может потребоваться скачать новый профиль подготовки на портале разработчика Apple и дважды щелкнуть его, чтобы установить. Вам также может потребоваться остановить и перезапустить Visual Studio для Mac, прежде чем он сможет получить доступ к новому профилю.
Затем необходимо загрузить новый идентификатор приложения и профиль на компьютере разработки. Давайте сделаем следующее:
Запустите Xcode и выберите "Параметры" в меню Xcode :
Нажмите кнопку "Просмотреть сведения...
Нажмите кнопку "Обновить" (в левом нижнем углу).
Нажмите кнопку "Готово ".
Затем необходимо выбрать новый идентификатор приложения и профиль подготовки в проекте Xamarin.Mac. Давайте сделаем следующее:
На панели решений дважды щелкните файл Info.plist, чтобы открыть его для редактирования.
Убедитесь, что идентификатор пакета соответствует приведенному выше идентификатору приложения (например:
com.appracatappra.MacSandbox
):Затем дважды щелкните файл Entitlements.plist и убедитесь, что хранилище ключей iCloud и контейнеры iCloud соответствуют нашему идентификатору приложения, созданному выше (например: ):
com.appracatappra.MacSandbox
Сохранение изменений.
На панели решений дважды щелкните файл проекта, чтобы открыть его параметры редактирования:
Выберите "Подписывание Mac", а затем проверьте пакет приложения и подписать пакет установщика. В разделе "Профиль подготовки" выберите созданный выше элемент:
Нажмите кнопку Готово.
Внимание
Чтобы узнать новый идентификатор приложения и профиль подготовки, установленный Xcode, может потребоваться выйти и перезапустить Visual Studio для Mac.
Устранение неполадок при подготовке
На этом этапе необходимо попытаться запустить приложение и убедиться, что все подписаны и подготовлены правильно. Если приложение по-прежнему работает как раньше, все хорошо. В случае сбоя может появиться диалоговое окно, например следующее:
Ниже приведены наиболее распространенные причины проблем с подготовкой и подписыванием:
- Идентификатор пакета приложений не соответствует идентификатору приложения выбранного профиля.
- Идентификатор разработчика не соответствует идентификатору разработчика выбранного профиля.
- UUID тестового компьютера Mac не зарегистрирован в составе выбранного профиля.
В случае проблемы исправьте проблему на портале разработчика Apple, обновите профили в Xcode и выполните чистую сборку в Visual Studio для Mac.
Включение песочницы приложения
Чтобы включить песочницу приложения, установите флажок в параметрах проектов. Выполните следующие действия.
На панели решения дважды щелкните файл Entitlements.plist, чтобы открыть его для редактирования.
Проверьте как включить права, так и включить песочницу приложений:
Сохранение изменений.
На этом этапе вы включили песочницу приложения, но не предоставили необходимый сетевой доступ для веб-представления. Если вы запускаете приложение сейчас, получите пустое окно:
Проверка того, что приложение является изолированным
Помимо поведения блокировки ресурсов существует три основных способа определить, успешно ли было выполнено приложение Xamarin.Mac:
В Finder проверьте содержимое
~/Library/Containers/
папки. Если приложение песочнице, будет папка с именем, например идентификатор пакета приложения (например: ):com.appracatappra.MacSandbox
Система видит приложение как песочницу в мониторе действий:
- Запуск монитора активности (в разделе
/Applications/Utilities
). - Выберите "Просмотреть>столбцы" и убедитесь, что установлен пункт меню песочницы.
- Убедитесь, что столбец песочницы считывает
Yes
для приложения:
- Запуск монитора активности (в разделе
Убедитесь, что двоичный файл приложения является изолированным:
- Запустите приложение терминала.
- Перейдите в каталог приложений
bin
. - Выполните следующую команду:
codesign -dvvv --entitlements :- executable_path
(гдеexecutable_path
находится путь к приложению):
Отладка изолированного приложения
Отладчик подключается к приложениям Xamarin.Mac через TCP, что означает, что по умолчанию при включении песочницы не удается подключиться к приложению, поэтому если вы пытаетесь запустить приложение без соответствующих разрешений, вы получите сообщение об ошибке "Не удается подключиться к отладчику".
Разрешение "Разрешить исходящие сетевые подключения " (клиент) является одним из необходимых для отладчика, что позволяет выполнять отладку нормально. Так как вы не можете выполнить отладку без него, мы обновили целевой CompileEntitlements
объект, msbuild
чтобы автоматически добавить это разрешение на права для любого приложения, изолированного только для отладочных сборок. Сборки выпуска должны использовать права, указанные в файле прав, не измененные.
Разрешение нарушения песочницы приложения
Нарушение песочницы приложения возникает, если изолированное приложение Xamarin.Mac попыталось получить доступ к ресурсу, который не был явно разрешен. Например, наше веб-представление больше не сможет отображать веб-сайт Apple.
Наиболее распространенный источник нарушений песочницы приложений возникает, когда параметры прав, указанные в Visual Studio для Mac, не соответствуют требованиям приложения. Опять же, вернитесь к нашему примеру, отсутствующие права сетевого подключения, которые сохраняют веб-представление от работы.
Обнаружение нарушений песочницы приложений
Если вы подозреваете, что нарушение песочницы приложения происходит в приложении Xamarin.Mac, самый быстрый способ обнаружения проблемы — использовать консольное приложение.
Выполните следующие действия.
Скомпилируйте приложение под вопросом и запустите его из Visual Studio для Mac.
Откройте консольное приложение (из
/Applications/Utilties/
).Выберите все сообщения на боковой панели и введите
sandbox
в поиске:
В приведенном выше примере приложения видно, что Kernal блокирует network-outbound
трафик из-за песочницы приложения, так как мы не запрашивали это право.
Исправление нарушений песочницы приложений с правами
Теперь, когда мы видели, как найти нарушения песочницы приложений, давайте посмотрим, как их можно решить, изменив права приложения.
Выполните следующие действия.
На панели решения дважды щелкните файл Entitlements.plist, чтобы открыть его для редактирования.
В разделе "Права" установите флажок Разрешить исходящие сетевые подключения (клиент):
Сохраните изменения в приложении.
Если мы делаем это для нашего примера приложения, то создадим и запустите его, веб-содержимое будет отображаться должным образом.
Подробное описание песочницы приложения
Механизмы управления доступом, предоставляемые песочницей приложения, мало и легко понять. Тем не менее, так как песочница приложения будет принята каждым приложением, является уникальным и в зависимости от требований приложения.
Учитывая все усилия по защите приложения Xamarin.Mac от использования вредоносным кодом, для контроля взаимодействия приложения с системой требуется только одна уязвимость в приложении (или одной из библиотек или платформ, которые она использует).
Песочница приложения была разработана для предотвращения поглощения (или ограничения ущерба, который может причинить), позволяя указать предполагаемое взаимодействие приложения с системой. Система предоставит доступ только к ресурсу, который требуется приложению для выполнения своей работы, и ничего больше.
При проектировании песочницы приложений вы разрабатываете сценарий с худшим вариантом. Если приложение скомпрометировано вредоносным кодом, оно ограничено доступом только к файлам и ресурсам в песочнице приложения.
Права и доступ к системным ресурсам
Как мы видели выше, приложение Xamarin.Mac, которое не было песочнице, предоставляет полные права и доступ к пользователю, на котором запущено приложение. Если вредоносный код скомпрометирован, приложение, не защищенное, может выступать в качестве агента для враждебного поведения, с широким потенциалом для причинения вреда.
Включив песочницу приложений, удалите все, кроме минимального набора привилегий, которые затем повторно включите только на основе прав приложения Xamarin.Mac.
Вы изменяете ресурсы песочницы приложения, редактируя файл Rightss.plist и проверяя или выбирая права, необходимые в раскрывающихся списках редакторов:
Каталоги контейнеров и доступ к файловой системе
Когда приложение Xamarin.Mac принимает песочницу приложения, он имеет доступ к следующим расположениям:
- Каталог контейнеров приложений — при первом запуске ОС создает специальный каталог контейнеров, где все его ресурсы идут, к которым он может получить доступ. Приложение будет иметь полный доступ на чтение и запись к этому каталогу.
- Каталоги контейнеров группы приложений. Ваше приложение может быть предоставлено доступ к одному или нескольким контейнерам группы, которые совместно используются между приложениями в одной группе.
- Указанные пользователем файлы — приложение автоматически получает доступ к файлам, которые явно открываются или перетаскиваются в приложение пользователем.
- Связанные элементы . С соответствующими правами приложение может иметь доступ к файлу с тем же именем, но другим расширением. Например, документ, сохраненный
.txt
как файл, так и файл.pdf
. - Временные каталоги, каталоги инструментов командной строки и определенные расположения , доступные для чтения. Ваше приложение имеет различные степени доступа к файлам в других хорошо определенных расположениях, как указано системой.
Каталог контейнера приложений
Каталог контейнеров приложений Xamarin.Mac имеет следующие характеристики:
- Он находится в скрытом расположении в домашнем каталоге пользователя (обычно
~Library/Containers
) и может быть доступен сNSHomeDirectory
помощью функции (см. ниже) в приложении. Так как он находится в домашнем каталоге, каждый пользователь получит собственный контейнер для приложения. - Приложение имеет неограниченный доступ на чтение и запись к каталогу контейнеров и всем его вложенным каталогам и файлам в нем.
- Большинство API поиска путей macOS относятся к контейнеру приложения. Например, контейнер будет иметь собственную библиотеку (доступ через
NSLibraryDirectory
), подкаталогы поддержки приложений и параметров . - macOS устанавливает и применяет соединение между приложением и его контейнером с помощью подписи кода. Даже это другое приложение пытается спуфинировать приложение с помощью идентификатора пакета, оно не сможет получить доступ к контейнеру из-за подписывания кода.
- Контейнер не предназначен для созданных пользователем файлов. Вместо этого приложение использует такие файлы, как базы данных, кэши или другие определенные типы данных.
- Для типов приложений обувной коробки (таких как приложение Apple Photo), содержимое пользователя перейдет в контейнер.
Внимание
К сожалению, Xamarin.Mac пока не имеет 100% охвата API (в отличие от Xamarin.iOS), в результате NSHomeDirectory
API не сопоставлен в текущей версии Xamarin.Mac.
В качестве временного обходного решения можно использовать следующий код:
[System.Runtime.InteropServices.DllImport("/System/Library/Frameworks/Foundation.framework/Foundation")]
public static extern IntPtr NSHomeDirectory();
public static string ContainerDirectory {
get {
return ((NSString)ObjCRuntime.Runtime.GetNSObject(NSHomeDirectory())).ToString ();
}
}
Каталог контейнера группы приложений
Начиная с macOS 10.7.5 (и более поздней версии), приложение может использовать com.apple.security.application-groups
право доступа к общему контейнеру, который является общим для всех приложений в группе. Этот общий контейнер можно использовать для содержимого, не являющегося пользователем, например базы данных или других типов файлов поддержки (таких как кэши).
Контейнеры групп автоматически добавляются в контейнер песочницы каждого приложения (если они являются частью группы) и хранятся в ~/Library/Group Containers/<application-group-id>
ней. Идентификатор группы должен начинаться с идентификатора группы разработки и периода, например:
<team-id>.com.company.<group-name>
Дополнительные сведения см. в статье о добавлении приложения в группу приложений в справочнике по ключу прав.
Доступ к powerbox и файловой системе за пределами контейнера приложения
Изолированное приложение Xamarin.Mac может получить доступ к расположениям файловой системы за пределами контейнера следующим образом:
- В определенном направлении пользователя (с помощью открытых и сохраненных диалогов или других методов, таких как перетаскивание).
- Используя права для определенных расположений файловой системы (например
/bin
, или/usr/lib
). - Если расположение файловой системы находится в определенных каталогах, доступных для чтения (например, общий доступ).
Powerbox — это технология безопасности macOS, которая взаимодействует с пользователем, чтобы расширить права доступа к файлам изолированного приложения Xamarin.Mac. Powerbox не имеет API, но активируется прозрачно при вызове NSOpenPanel
приложения или NSSavePanel
. Доступ к Powerbox включен с помощью заданных вами прав для приложения Xamarin.Mac.
Когда изолированное приложение отображает диалоговое окно "Открыть" или "Сохранить", окно отображается Powerbox (а не AppKit) и поэтому имеет доступ к любому файлу или каталогу, к которому у пользователя есть доступ.
Когда пользователь выбирает файл или каталог из диалогового окна "Открыть" или "Сохранить" (или перетаскивается на значок приложения), Powerbox добавляет связанный путь к песочнице приложения.
Кроме того, система автоматически разрешает следующее изолированному приложению:
- Подключение к системным входным методу.
- Службы вызовов, выбранные пользователем в меню "Службы " (только для служб, помеченных как безопасные для приложений песочницы поставщиком услуг).
- Откройте файлы, выбранные пользователем в меню "Открыть последние ".
- Используйте копирование и вставку между другими приложениями.
- Чтение файлов из следующих расположений, доступных для чтения по всему миру:
/bin
/sbin
/usr/bin
/usr/lib
/usr/sbin
/usr/share
/System
- Чтение и запись файлов в каталогах, созданных с помощью
NSTemporaryDirectory
.
По умолчанию файлы, открытые или сохраненные изолированным приложением Xamarin.Mac, остаются доступными до завершения работы приложения (если файл еще не был открыт при выходе приложения). Открытые файлы будут автоматически восстановлены в песочнице приложения с помощью функции возобновления macOS при следующем запуске приложения.
Чтобы обеспечить сохраняемость файлов, расположенных за пределами контейнера приложения Xamarin.Mac, используйте закладки с областью безопасности (см. ниже).
Связанные элементы
Песочница приложения позволяет приложению получать доступ к связанным элементам с одинаковым именем файла, но разными расширениями. Функция состоит из двух частей: a) списка связанных расширений в файле приложения Info.plst
, б) кода, чтобы сообщить песочнице, что приложение будет делать с этими файлами.
Существует два сценария, в которых это имеет смысл:
- Приложение должно сохранять другую версию файла (с новым расширением). Например, экспорт
.txt
файла в.pdf
файл. Чтобы справиться с этой ситуацией, необходимо использовать для доступа к файлуNSFileCoordinator
. Сначала вы вызоветеWillMove(fromURL, toURL)
метод, переместите файл в новое расширение, а затем вызовитеItemMoved(fromURL, toURL)
. - Приложение должно открыть основной файл с одним расширением и несколькими вспомогательными файлами с разными расширениями. Например, файл "Фильм" и "Подзаголовок". Используйте для
NSFilePresenter
получения доступа к вторичному файлу. Укажите основной файлPrimaryPresentedItemURL
свойству и вторичному файлу свойствуPresentedItemURL
. При открытии основногоNSFileCoordinator
файла вызовитеAddFilePresenter
метод класса, чтобы зарегистрировать вторичный файл.
В обоих сценариях файл Info.plist приложения должен объявить типы документов, которые может открыть приложение. Для любого типа файла добавьте NSIsRelatedItemType
(со значением YES
) в его запись в CFBundleDocumentTypes
массиве.
Открытие и сохранение диалогового окна с изолированными приложениями
Следующие ограничения помещаются в NSOpenPanel
изолированное приложение Xamarin.Mac и NSSavePanel
при их вызове:
- Невозможно программным способом вызвать кнопку "ОК ".
- Вы не можете программным способом изменить выбор пользователя в объекте
NSOpenSavePanelDelegate
.
Кроме того, существуют следующие изменения наследования:
- Приложение -
NSOpenPanel
, отличное от песочницыNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel
Закладки с областью безопасности и постоянный доступ к ресурсам
Как уже упоминалось выше, приложение Xamarin.Mac может получить доступ к файлу или ресурсу за пределами контейнера путем прямого взаимодействия с пользователем (как указано в PowerBox). Однако доступ к этим ресурсам не сохраняется автоматически во время запусков приложений или перезапусков системы.
С помощью закладок в области безопасности приложение Xamarin.Mac может сохранять намерение пользователя и поддерживать доступ к заданным ресурсам после перезапуска приложения.
Типы закладок с областью безопасности
При работе с закладками с областью безопасности и постоянным доступом к ресурсам существует два варианта использования:
Закладка с областью приложения предоставляет постоянный доступ к указанному пользователем файлу или папке.
Например, если изолированное приложение Xamarin.Mac позволяет использовать внешний документ для редактирования (с помощью),
NSOpenPanel
приложение может создать закладку с областью действия приложения, чтобы получить доступ к тому же файлу снова в будущем.Закладка с областью документа предоставляет определенный документ постоянный доступ к вложенным файлам.
Например, приложение для редактирования видео, создающее файл проекта с доступом к отдельным изображениям, клипам и звуковым файлам, которые позже будут объединены в один фильм.
Когда пользователь импортирует файл ресурсов в проект (с помощью NSOpenPanel
), приложение создает закладку с областью документа для элемента, хранящегося в проекте, чтобы файл всегда был доступен приложению.
Закладка с областью документа может быть разрешена любым приложением, которое может открыть данные закладки и сам документ. Это поддерживает переносимость, позволяя пользователю отправлять файлы проекта другому пользователю, а также работать со всеми закладками.
Внимание
Закладка с областью документа может указывать только на один файл, а не папку, и этот файл не может находиться в расположении, используемом системой (например/private
, или/Library
).
Использование закладок с областью безопасности
Для использования любой из типов закладки с областью безопасности необходимо выполнить следующие действия:
- Задайте соответствующие права в приложении Xamarin.Mac, которое должно использовать закладки с областью безопасности. Для закладок с областью приложения задайте
com.apple.security.files.bookmarks.app-scope
для ключаtrue
"Права". Для закладок с областьюcom.apple.security.files.bookmarks.document-scope
документа задайте для ключаtrue
права значение . - Создайте закладку с областью безопасности. Для всех файлов или папок, к которым пользователь предоставил доступ (например
NSOpenPanel
), приложению потребуется постоянный доступ.public virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error)
Используйте методNSUrl
класса для создания закладки. - Устраните закладку с областью безопасности. Когда приложению необходимо снова получить доступ к ресурсу (например, после перезапуска), необходимо будет разрешить закладку на URL-адрес с областью безопасности.
public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error)
Используйте метод класса для разрешения закладкиNSUrl
. - Явным образом уведомляйте систему о том, что вы хотите получить доступ к файлу из URL-адреса области безопасности. Этот шаг необходимо выполнить сразу после получения URL-адреса с областью безопасности выше или, когда позже вы хотите восстановить доступ к ресурсу после того, как он отказался от доступа к нему.
StartAccessingSecurityScopedResource ()
Вызовите методNSUrl
класса, чтобы начать доступ к URL-адресу с областью безопасности. - Явным образом уведомляйте систему о том, что вы выполнили доступ к файлу из URL-адреса области безопасности. Как можно скорее вы должны сообщить системе, когда приложению больше не нужен доступ к файлу (например, если пользователь закрывает его).
StopAccessingSecurityScopedResource ()
Вызовите методNSUrl
класса, чтобы остановить доступ к URL-адресу с областью безопасности.
После отказа от доступа к ресурсу необходимо вернуться к шагу 4 еще раз, чтобы повторно установить доступ. Если приложение Xamarin.Mac перезапускается, необходимо вернуться к шагу 3 и повторно разрешить закладку.
Внимание
Сбой при освобождении доступа к ресурсам URL-адресов в области безопасности приведет к утечке ресурсов ядра приложения Xamarin.Mac. В результате приложение больше не сможет добавлять расположения файловой системы в контейнер до перезапуска.
Песочница приложения и подписывание кода
После включения песочницы приложения и включения конкретных требований для приложения Xamarin.Mac (с помощью прав), необходимо закодировать проект, чтобы песочница вступают в силу. Необходимо выполнить подписывание кода, так как права, необходимые для песочницы приложений, связаны с подписью приложения.
macOS применяет связь между контейнером приложения и его сигнатурой кода таким образом, что ни один другой приложений не может получить доступ к этому контейнеру, даже если он является подпуфингом идентификатора пакета приложений. Этот механизм работает следующим образом:
- Когда система создает контейнер приложения, он задает контроль доступа список (ACL) в этом контейнере. Начальная запись управления доступом в списке содержит указанное требование приложения (DR), в котором описывается, как можно распознать будущие версии приложения (когда оно было обновлено).
- При каждом запуске приложения с одним и тем же идентификатором пакета система проверяет, соответствует ли подпись кода приложения указанным требованиям, указанным в одном из записей в ACL контейнера. Если система не находит совпадения, приложение не запускается.
Подписывание кода работает следующим образом:
- Перед созданием проекта Xamarin.Mac получите сертификат разработки, сертификат распространения и сертификат идентификатора разработчика на портале разработчика Apple.
- Когда Mac App Store распространяет приложение Xamarin.Mac, оно подписывается с подписью кода Apple.
При тестировании и отладке вы будете использовать версию подписанного приложения Xamarin.Mac (который будет использоваться для создания контейнера приложений). Позже, если вы хотите протестировать или установить версию из Apple App Store, она будет подписана с подписью Apple и не сможет запуститься (так как она не имеет той же подписи кода, что и исходный контейнер приложений). В этой ситуации вы получите отчет о сбоях, аналогичный следующему:
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Чтобы устранить эту проблему, необходимо настроить запись ACL, чтобы указать на подписанную версию приложения Apple.
Дополнительные сведения о создании и скачивании профилей подготовки, необходимых для песочницы, см . в разделе "Подписывание и подготовка приложения " выше.
Настройка записи ACL
Чтобы разрешить запуску приложения Xamarin.Mac с подписью Apple, сделайте следующее:
- Откройте приложение терминала (в
/Applications/Utilities
). - Откройте окно Finder в подписанной apple версии приложения Xamarin.Mac.
- Введите
asctl container acl add -file
в окне терминала. - Перетащите значок приложения Xamarin.Mac из окна Finder и удалите его в окне терминала.
- Полный путь к файлу будет добавлен в команду в терминале.
- Нажмите клавишу ВВОД , чтобы выполнить команду.
ACL контейнера теперь содержит указанные требования к коду для обеих версий приложения Xamarin.Mac и macOS, которые теперь позволяют запускать любую версию.
Отображение списка требований к коду ACL
Список требований к коду в списке ACL контейнера можно просмотреть, выполнив следующие действия.
- Откройте приложение терминала (в
/Applications/Utilities
). - Введите
asctl container acl list -bundle <container-name>
. - Нажмите клавишу ВВОД , чтобы выполнить команду.
Обычно <container-name>
это идентификатор пакета для приложения Xamarin.Mac.
Проектирование приложения Xamarin.Mac для песочницы приложений
При разработке приложения Xamarin.Mac для песочницы приложения Xamarin.Mac следует использовать распространенный рабочий процесс. Тем не более того, особенности реализации песочницы в приложении будут уникальными для функций данного приложения.
Шесть шагов по внедрению песочницы приложения
Проектирование приложения Xamarin.Mac для песочницы приложений обычно состоит из следующих действий:
- Определите, подходит ли приложение для песочницы.
- Разработка стратегии разработки и распространения.
- Устраните все несовместимости API.
- Примените необходимые права песочницы приложений к проекту Xamarin.Mac.
- Добавление разделения привилегий с помощью XPC.
- Реализуйте стратегию миграции.
Внимание
Необходимо не только песочницу основного исполняемого файла в пакете приложений, но и каждое включенное вспомогательное приложение или средство в этом пакете. Это необходимо для любого приложения, распределенного из Mac App Store, и, если это возможно, необходимо сделать для любой другой формы распространения приложений.
Список всех исполняемых двоичных файлов в пакете приложения Xamarin.Mac введите следующую команду в терминале:
find -H [Your-App-Bundle].app -print0 | xargs -0 file | grep "Mach-O .*executable"
Где [Your-App-Bundle]
находится имя и путь к пакету приложения.
Определение того, подходит ли приложение Xamarin.Mac для песочницы
Большинство приложений Xamarin.Mac полностью совместимы с песочницей приложений, поэтому подходит для песочницы. Если приложению требуется поведение, которое песочница приложения не разрешает, следует рассмотреть альтернативный подход.
Если приложению требуется одно из следующих действий, оно несовместимо с песочницей приложения:
- Службы авторизации — с песочницей приложения нельзя работать с функциями, описанными в справочнике по службам авторизации C.
- API специальных возможностей— вы не можете использовать изолированные вспомогательные приложения, такие как средства чтения с экрана или приложения, управляющие другими приложениями.
- Отправка событий Apple в произвольные приложения . Если приложению требуется отправка событий Apple в неизвестное произвольное приложение, оно не может быть песочницей. Для известного списка именуемых приложений приложение по-прежнему может быть песочнице, и разрешения должны включать именованный список приложений.
- Отправка словарей сведений пользователей в распределенных уведомлениях в другие задачи . С помощью песочницы приложения нельзя включить
userInfo
словарь при публикации вNSDistributedNotificationCenter
объект для обмена сообщениями других задач. - Загрузка расширений ядра. Загрузка расширений ядра запрещена песочницей приложения.
- Имитация входных данных пользователей в открытых и сохраненных диалоговых окнах — программное управление открытыми или сохраненными диалогами для имитации или изменения входных данных пользователей запрещено песочницей приложения.
- Доступ или настройка параметров в других приложениях . Управление параметрами других приложений запрещено песочницей приложения.
- Настройка параметров сети. Управление параметрами сети запрещено песочницей приложения.
- Завершение других приложений — песочница приложения запрещает использование
NSRunningApplication
других приложений.
Разрешение несовместимости API
При разработке приложения Xamarin.Mac для песочницы приложений может возникнуть несовместимость с использованием некоторых API macOS.
Ниже приведены некоторые распространенные проблемы и действия, которые можно сделать для их решения:
- Открытие, сохранение и отслеживание документов . Если вы управляете документами с помощью любой технологии, отличной
NSDocument
от технологии, вы должны переключиться на него из-за встроенной поддержки песочницы приложений.NSDocument
автоматически работает с PowerBox и обеспечивает поддержку хранения документов в песочнице, если пользователь перемещает их в Finder. - Сохранение доступа к ресурсам файловой системы. Если приложение Xamarin.Mac зависит от постоянного доступа к ресурсам за пределами контейнера, используйте закладки с областью безопасности для поддержания доступа.
- Создание элемента входа для приложения — с помощью песочницы приложения невозможно создать элемент входа с помощью
LSSharedFileList
и не управлять состоянием служб запуска с помощьюLSRegisterURL
. Используйте функциюSMLoginItemSetEnabled
, как описано в разделе Apples Добавление элементов входа с помощью документации по платформе управления службами. - Доступ к данным пользователей. Если вы используете функции POSIX, такие как
getpwuid
получение домашнего каталога пользователя из служб каталогов, рассмотрите возможность использования символов Cocoa или Core Foundation, таких какNSHomeDirectory
. - Доступ к предпочтениям других приложений — так как песочница приложений направляет API-интерфейсы поиска путей к контейнеру приложения, изменение параметров происходит в этом контейнере и доступ к другим предпочтениям приложений в не разрешенном режиме.
- Использование HTML5 Embedded Video в веб-представлениях . Если приложение Xamarin.Mac использует WebKit для воспроизведения внедренных видео HTML5, необходимо также связать приложение с платформой AV Foundation. Песочница приложения не позволит CoreMedia воспроизводить эти видео в противном случае.
Применение необходимых прав песочницы приложений
Вам потребуется изменить права для любого приложения Xamarin.Mac, которое вы хотите запустить в песочнице приложения, и установите флажок "Включить песочницу приложений".
В зависимости от функциональности приложения может потребоваться включить другие права для доступа к функциям или ресурсам ОС. Песочница приложений работает лучше всего, если вы свести к минимуму запрашиваемую праву до минимального требуемого для запуска приложения, так что это делает просто случайным образом включить права.
Чтобы определить, какие права требуется приложению Xamarin.Mac, сделайте следующее:
- Включите песочницу приложения и запустите приложение Xamarin.Mac.
- Выполните действия по функциям приложения.
- Откройте консольное приложение (доступно в
/Applications/Utilities
) и найдитеsandboxd
нарушения в журнале "Все сообщения ". - Для каждого
sandboxd
нарушения устраните проблему с помощью контейнера приложения вместо других расположений файловой системы или примените права песочницы приложений, чтобы обеспечить доступ к ограниченным функциям ОС. - Повторно запустите и проверьте все функции приложения Xamarin.Mac еще раз.
- Повторяйте все нарушения до тех пор, пока не будут устранены все
sandboxd
нарушения.
Добавление разделения привилегий с помощью XPC
При разработке приложения Xamarin.Mac для песочницы приложений ознакомьтесь с поведением приложения с точки зрения привилегий и доступа, а затем рассмотрите возможность разделения операций с высоким риском на собственные службы XPC.
Дополнительные сведения см. в руководстве по созданию служб XPC и daemons и служб Apple.
Реализация стратегии миграции
Если вы выпускаете новую песочницу версию приложения Xamarin.Mac, который ранее не был песочницой, необходимо убедиться, что у текущих пользователей есть гладкий путь обновления.
Дополнительные сведения о реализации манифеста миграции контейнеров см . в документации apple по переносу приложения в песочницу .
Итоги
В этой статье подробно рассматривается песочница приложения Xamarin.Mac. Сначала мы создали простое приложение Xamarin.Mac, чтобы показать основы песочницы приложения. Далее мы показали, как устранить нарушения песочницы. Затем мы подробно рассмотрели песочницу приложения и, наконец, рассмотрели проектирование приложения Xamarin.Mac для песочницы приложения.