#ios #file-sharing #ios-extensions
Вопрос:
Моя цель-создать расширение общего доступа iOS (через Xamarin), которое позволит пользователю загружать аудио-или видеофайл через мое приложение на мой сервер через меню общего доступа iOS. Рабочий процесс будет выглядеть так:
- пользователь открывает аудио-или видеофайл (например, из приложения «Файлы»)
- нажмите на значок «Поделиться»
- откроется меню «Поделиться», в котором отображается значок моего приложения в списке
- пользователь нажимает на значок моего приложения
- приложение откроется с видом для загрузки содержимого, чтобы пользователь мог настроить некоторые метаданные и, наконец, загрузить файл
Я уже добился этого, сразу открыв Динамическую ссылку из расширения. Ссылка содержит путь к файлу, поэтому основное приложение знает, какой файл загрузить. Это код для получения пути к файлу:
private async Task<string> GetFileUrlAsync()
{
var attachment = ExtensionContext
.InputItems
.Where(x => x.Attachments != null)
.SelectMany(x => x.Attachments)
.First();
var nsUrl = (NSUrl) await attachment.LoadItemAsync(UTType.FileURL, null);
return nsUrl.Path;
}
В симуляторе загрузка работает довольно хорошо по следующему пути:
/Users/tobiasbuchholz/Library/Developer/CoreSimulator/Devices/4FE06C03-50D2-4613-892B-5A2EA611D26A/data/Containers/Shared/AppGroup/834E4479-1A30-474B-B3EA-1840D14BE4DC/File Provider Storage/sample.mp3
С другой стороны, на устройстве я получаю исключение со следующим сообщением:
System.UnauthorizedAccessException: Access to the path "/private/var/mobile/Containers/Shared/AppGroup/A4F8EE6A-A229-4869-81AE-36FE96F9B5FA/File Provider Storage/ABLAZE/sample.mp3" is denied.
Итак, наконец, мой вопрос: есть ли способ обойти эту ошибку на устройстве? Например, параметр Info.plist или что-то в этом роде, которого мне не хватает. Или мне нужно создать группу приложений, скопировать файл с помощью моего расширения в это место и получить доступ к нему в главном приложении оттуда? (что довольно хреново, учитывая дисковое пространство пользователя)