У меня есть приложение, которое позволяет мне экспортировать (и импортировать) его содержимое. Работая над заменой устаревшего unarchiveTopLevelObjectWithData на unarchiveTopLevelObjectWithData (все еще продолжается), я столкнулся с некоторыми проблемами при тестировании. Мой тест заключался в том, что я ранее экспортировал файл в приложение «Файлы», а оттуда, используя общий лист, отправил его в свое приложение. Это не работало. Раньше я импортировал файлы из такого приложения, как WhatsApp, и это работало нормально.
После некоторого устранения неполадок я обнаружил, что по какой-то причине при совместном использовании из приложения «Файлы» (а не только из iCloud Drive) я получаю другой URL-адрес файла, чем из других приложений. Если мой файл в приложении «Файлы» находится в iCloud Drive, я получаю следующий путь:
/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs
Когда я перемещаю файл в папку «На моем iPhone» и делюсь оттуда, я получаю:
/private/var/mobile/Containers/Shared/AppGroup/***/File Provider Storage/Files
Мое приложение создано для работы с тем, что когда приложение, не относящееся к файлам, делится файлом, оно помещается в подпапку «Входящие» папки «Документы». Итак, в настоящее время мое приложение проверяет это место. Теперь я изменил приложение, чтобы оно брало URL-адрес из метода application:openURL:options:. Но когда я использую этот URL-адрес для проверки существования файла с помощью FileManager.default.fileExists, он не может его найти.
Что мне нужно сделать, чтобы мое приложение могло получить доступ к URL-адресам, созданным приложением «Файлы»?
Я нашел эту статью, которая дала мне работающее решение. Требуется, чтобы URL-адрес рассматривался как «SecurityScopedResource», и вы должны запускать и прекращать доступ к нему. Измененный фрагмент кода из статьи выше:
guard url.startAccessingSecurityScopedResource() else {
throw ImportError.accessDenied // Or return
}
do {
//Process your URL as usual
url.stopAccessingSecurityScopedResource()
}
При использовании этого открытия файлы из приложения «Файлы» будут работать, а в расширении также будут работать файлы AirDropping. Следует отметить одну вещь: обмен файлом таким способом привел к удалению файла из приложения «Файлы». Это то, чего я хочу, но, похоже, об этом следует знать, если вы не хотите, чтобы это произошло.