Вопрос проверяет знание механизма безопасного обмена данными между разными приложениями одного разработчика.
Для обмена данными между приложениями под одним Apple ID используется технология App Groups. Она позволяет приложениям иметь общий доступ к определенной области файловой системы (общему контейнеру). Данные можно записывать и читать из этого контейнера с помощью UserDefaults(suiteName:) или FileManager, используя URL общего контейнера.
App Groups — это функция, которая позволяет разным приложениям (и даже расширениям приложений, like Today Widgets) иметь общее пространство для хранения данных.
Шаги для настройки:
Включение App Groups в проекте:
В Xcode для каждого приложения нужно зайти в настройки целевой сборки (Target Settings) -> "Signing & Capabilities".
Добавить capability "App Groups".
Создать или выбрать существующий идентификатор группы (обычно вида group.com.yourcompany.shared). Этот идентификатор должен быть одинаковым для всех приложений, которые должны общаться друг с другом.
Запись данных в общий контейнер из первого приложения:
// Использование UserDefaults
if let sharedDefaults = UserDefaults(suiteName: "group.com.yourcompany.shared") {
sharedDefaults.set("Hello from App 1", forKey: "sharedMessage")
}
// Использование FileManager
if let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.yourcompany.shared") {
let fileURL = containerURL.appendingPathComponent("sharedFile.txt")
try? "Some text".write(to: fileURL, atomically: true, encoding: .utf8)
}Чтение данных из общего контейнера во втором приложении:
// Чтение из UserDefaults
if let sharedDefaults = UserDefaults(suiteName: "group.com.yourcompany.shared") {
let message = sharedDefaults.string(forKey: "sharedMessage")
print(message) // "Hello from App 1"
}
// Чтение файла
if let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.yourcompany.shared") {
let fileURL = containerURL.appendingPathComponent("sharedFile.txt")
let text = try? String(contentsOf: fileURL, encoding: .utf8)
}